Выполните проверку попадания, чтобы определить правильное размещение 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.