Выполняйте хит-тесты в своем приложении для Android

Выполните проверку попадания , чтобы определить правильное размещение 3D-объекта в вашей сцене. Правильное размещение гарантирует, что контент AR будет отображаться в соответствующем (кажущемся) размере.

Типы результатов обращений

Проверка попадания может дать четыре различных типа результатов попадания, как показано в следующей таблице.

Тип результата обращения Описание Ориентация Вариант использования Вызовы методов
Глубина ( DepthPoint ) Использует информацию о глубине всей сцены для определения правильной глубины и ориентации точки. Перпендикулярно 3D-поверхности Разместите виртуальный объект на произвольной поверхности (не только на полу и стенах) Чтобы это работало, ArDepthMode должен быть включен.

Frame.hitTest(…) , проверьте наличие DepthPoint в возвращаемом списке.
Plane Касается горизонтальных и/или вертикальных поверхностей, чтобы определить правильную глубину и ориентацию точки. Перпендикулярно 3D-поверхности Поместите объект на плоскость (пол или стену), используя полную геометрию плоскости. Срочно нужен правильный масштаб. Резервный вариант для проверки глубины Frame.hitTest(…) , проверьте наличие Plane в возвращаемом списке.
Характерная точка ( Point ) Полагается на визуальные особенности вокруг точки касания пользователя для определения правильного положения и ориентации точки. Перпендикулярно 3D-поверхности Разместите объект на произвольной поверхности (не только на полу и стенах) Frame.hitTest(…) , проверьте наличие Point в возвращаемом списке
Мгновенное размещение ( InstantPlacementPoint ) Использует пространство экрана для размещения контента. Первоначально используется предполагаемая глубина, предоставленная приложением. Работает мгновенно, но поза и фактическая глубина изменятся, как только ARCore сможет определить фактическую геометрию сцены. +Y направлен вверх, против силы тяжести Разместите объект на плоскости (поле или стене), используя полную геометрию плоскости, где быстрое размещение имеет решающее значение, и опыт может допускать неизвестную начальную глубину и масштаб. Frame.hitTestInstantPlacement(float, float, float)

Выполните стандартный хит-тест

Вызовите Frame.hitTest() для выполнения проверки попадания, используя утилиту TapHelper для получения MotionEvent из представления AR.

Джава

MotionEvent tap = tapHelper.poll();
if (tap == null) {
  return;
}

if (usingInstantPlacement) {
  // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
  // how far away the anchor will be placed, relative to the camera's view.
  List<HitResult> hitResultList =
      frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
  // Hit-test results using Instant Placement will only have one result of type
  // InstantPlacementResult.
} else {
  List<HitResult> hitResultList = frame.hitTest(tap);
  // TODO: Filter hitResultList to find a hit result of interest.
}

Котлин

val tap = tapHelper.poll() ?: return
val hitResultList =
  if (usingInstantPlacement) {
    // When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
    // how far away the anchor will be placed, relative to the camera's view.
    frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
    // Hit-test results using Instant Placement will only have one result of type
    // InstantPlacementResult.
  } else {
    frame.hitTest(tap)
  }

Фильтруйте результаты попаданий на основе интересующего вас типа. Например, если вы хотите сосредоточиться на DepthPoint s:

Джава

// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
for (HitResult hit : hitResultList) {
  Trackable trackable = hit.getTrackable();
  if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
    // Do something with this hit result. For example, create an anchor at this point of
    // interest.
    Anchor anchor = hit.createAnchor();
    // TODO: Use this anchor in your AR experience.
    break;
  }
}

Котлин

// Returned hit-test results are sorted by increasing distance from the camera or virtual ray's
// origin.
// The first hit result is often the most relevant when responding to user input.
val firstHitResult =
  hitResultList.firstOrNull { hit ->
    when (val trackable = hit.trackable!!) {
      is DepthPoint -> true // Replace with any type of trackable type
      else -> false
    }
  }
if (firstHitResult != null) {
  // Do something with this hit result. For example, create an anchor at this point of interest.
  val anchor = firstHitResult.createAnchor()
  // TODO: Use this anchor in your AR experience.
}

Проведите проверку попадания, используя произвольный луч и направление

Тесты на попадание обычно рассматриваются как лучи от устройства или камеры устройства, но вы можете использовать Frame.hitTest(float[], int, float[], int) для проведения теста на попадание, используя вместо этого произвольный луч в координатах мирового пространства. точки экранного пространства.

Создайте якорь, используя результат попадания

Получив результат попадания, вы можете использовать его позу в качестве входных данных для размещения AR-контента в вашей сцене. Используйте HitResult.createAnchor() , чтобы создать новый Anchor , гарантируя, что содержимое прикрепится к базовому Trackable результата попадания. Например, якорь останется прикрепленным к обнаруженной плоскости в случае попадания в плоскость, таким образом, выглядя как часть реального мира.

Что дальше