Выполните проверку попадания в приложении 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.