히트 테스트를 실행하여 장면에서 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
샘플 앱을 확인하세요.