Выполните проверку попадания, чтобы определить правильное размещение 3D-объекта в вашей сцене. Правильное размещение гарантирует, что контент AR будет отображаться в соответствующем (кажущемся) размере.
Типы результатов обращений
Проверка попадания может дать четыре различных типа результатов попадания, как показано в следующей таблице.
Тип результата обращения | Описание | Ориентация | Вариант использования | Вызовы методов |
---|---|---|---|---|
Глубина ( AR_TRACKABLE_DEPTH_POINT ) | Использует информацию о глубине всей сцены для определения правильной глубины и ориентации точки. | Перпендикулярно 3D-поверхности | Разместите виртуальный объект на произвольной поверхности (не только на полу и стенах) | Чтобы это работало, ArDepthMode должен быть включен.ArFrame_hitTest , проверьте наличие ArDepthPoint в возвращаемом списке. |
Самолет ( AR_TRACKABLE_PLANE ) | Касается горизонтальных и/или вертикальных поверхностей, чтобы определить правильную глубину и ориентацию точки. | Перпендикулярно 3D-поверхности | Поместите объект на плоскость (пол или стену), используя полную геометрию плоскости. Срочно нужен правильный масштаб. Резервный вариант для проверки глубины | ArFrame_hitTest , проверьте наличие ArPlane в возвращаемом списке. |
Характерная точка ( AR_TRACKABLE_POINT ) | Полагается на визуальные особенности вокруг точки касания пользователя для определения правильного положения и ориентации точки. | Перпендикулярно 3D-поверхности | Разместите объект на произвольной поверхности (не только на полу и стенах) | ArFrame_hitTest , проверьте наличие ArPoint в возвращаемом списке. |
Мгновенное размещение ( AR_TRACKABLE_INSTANT_PLACEMENT_POINT ) | Использует пространство экрана для размещения контента. Первоначально используется предполагаемая глубина, предоставленная приложением. Работает мгновенно, но поза и фактическая глубина изменятся, как только ARCore сможет определить фактическую геометрию сцены. | +Y направлен вверх, против силы тяжести | Разместите объект на плоскости (поле или стене), используя полную геометрию плоскости, где быстрое размещение имеет решающее значение, и опыт может допускать неизвестную начальную глубину и масштаб. | ArFrame_hitTestInstantPlacement |
Выполните стандартный хит-тест
Вызовите ArFrame_hitTest
, чтобы выполнить проверку попадания.
ArHitResultList* hit_result_list = NULL; ArHitResultList_create(ar_session, &hit_result_list); CHECK(hit_result_list); if (is_instant_placement_enabled) { ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y, k_approximate_distance_meters, hit_result_list); } else { ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list); }
Фильтруйте результаты попаданий по интересующему вас типу. Например, если вы хотите сосредоточиться на ArPlane
:
int32_t hit_result_list_size = 0; ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size); // 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. ArHitResult* ar_hit_result = NULL; for (int32_t i = 0; i < hit_result_list_size; ++i) { ArHitResult* ar_hit = NULL; ArHitResult_create(ar_session, &ar_hit); ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit); if (ar_hit == NULL) { LOGE("No item was hit."); return; } ArTrackable* ar_trackable = NULL; ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable); ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID; ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type); // Creates an anchor if a plane was hit. if (ar_trackable_type == AR_TRACKABLE_PLANE) { // Do something with this hit result. For example, create an anchor at // this point of interest. ArAnchor* anchor = NULL; ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor); // TODO: Use this anchor in your AR experience. ArAnchor_release(anchor); ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); break; } ArHitResult_destroy(ar_hit); ArTrackable_release(ar_trackable); } ArHitResultList_destroy(hit_result_list);
Проведите проверку попадания, используя произвольный луч и направление
Тесты на попадание обычно рассматриваются как лучи от устройства или камеры устройства, но вы можете использовать ArFrame_hitTestRay
для проведения теста на попадание, используя произвольный луч в координатах мирового пространства вместо точки экранного пространства.
Прикрепите привязку к HitResult
Получив результат попадания, вы можете использовать его позу в качестве входных данных для размещения AR-контента в вашей сцене. Используйте ArHitResult_acquireNewAnchor
, чтобы создать новую привязку в месте попадания.
Что дальше
- Ознакомьтесь с примером приложения
hello_ar_c
на GitHub.