히트 테스트를 실행하여 장면에서 3D 객체의 올바른 위치를 확인합니다. 올바르게 배치해야 AR 콘텐츠가 적절한 크기로 렌더링됩니다.
조회 결과 유형
Hit Test는 다음 표와 같이 4가지 유형의 조회 결과를 생성할 수 있습니다.
조회 결과 유형 | 설명 | 수업 소개 | 사용 사례 | 메서드 호출 |
---|---|---|---|---|
깊이 (AR_TRACKABLE_DEPTH_POINT ) |
전체 장면의 깊이 정보를 사용하여 지점의 정확한 깊이와 방향을 결정합니다. | 3D 표면에 수직 | 바닥과 벽뿐 아니라 임의의 표면에 가상 객체를 배치합니다. |
이 작업을 수행하려면 ArDepthMode 를 사용 설정해야 합니다.ArFrame_hitTest 님, 반품 목록에서 ArDepthPoint 을 확인하세요.
|
비행기 (AR_TRACKABLE_PLANE ) |
점의 정확한 깊이와 방향을 결정하기 위해 수평 또는 수직면을 누릅니다. | 3D 표면에 수직 | 항공기의 전체 형태를 사용하여 평면 (바닥 또는 벽)에 객체를 배치합니다. 정확한 체중계가 즉시 필요합니다. 깊이 Hit Test의 대체 |
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 실행
Hit 테스트는 일반적으로 기기나 기기 카메라의 광선으로 처리되지만, ArFrame_hitTestRay
를 사용하면 화면 공간 포인트 대신 세계 공간 좌표에서 임의의 광선을 사용하여 Hit 테스트를 실행할 수 있습니다.
HitResult에 앵커 연결
히트 결과가 있으면 이 포즈를 입력으로 사용하여 장면에 AR 콘텐츠를 배치할 수 있습니다. ArHitResult_acquireNewAnchor
를 사용하여 조회 위치에 새 앵커를 만듭니다.
다음 단계
- GitHub에서
hello_ar_c
샘플 앱을 확인하세요.