Выполните проверку попадания, чтобы определить правильное размещение 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
результата попадания. Например, якорь останется прикрепленным к обнаруженной плоскости в случае попадания в плоскость, таким образом, выглядя как часть реального мира.
Что дальше
- Ознакомьтесь с примерами приложений
hello_ar_java
иhello_ar_kotlin
на GitHub.