Android NDK 앱에서 Hit Test 실행

히트 테스트를 실행하여 장면에서 3D 개체가 올바르게 배치되는지 확인합니다. 올바른 위치에 배치해야 AR 콘텐츠가 적절한 (눈에 띄는) 크기로 렌더링됩니다.

조회 결과 유형

아래 표와 같이 Hit Test는 네 가지 유형의 조회 결과를 생성할 수 있습니다.

조회 결과 유형 설명 방향 사용 사례 메서드 호출
깊이 (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

표준 Hit Test 실행

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);

임의의 광선과 방향을 사용하여 히트 테스트 수행

Hit Test는 일반적으로 기기 또는 기기 카메라의 광선으로 취급되지만, ArFrame_hitTestRay를 사용하여 화면 공간 지점 대신 공간 좌표에서 임의의 광선을 사용하여 Hit Test를 실행할 수 있습니다.

HitResult에 앵커 연결

조회 결과가 있으면 해당 포즈를 입력으로 사용하여 장면에 AR 콘텐츠를 배치할 수 있습니다. ArHitResult_acquireNewAnchor를 사용하여 조회 위치에 새 앵커를 만듭니다.

다음 단계

  • GitHub에서 hello_ar_c 샘플 앱을 확인하세요.