Выполните проверку попадания в приложении Android NDK.

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