hit-test를 실행하여 장면에서 3D 개체가 올바르게 배치되는지 확인합니다. 올바른 게재위치를 사용하면 AR 콘텐츠가 적절한 (표시되는) 크기로 렌더링됩니다.
조회 결과 유형
다음 표와 같이 Hit Test는 네 가지 유형의 조회 결과를 생성할 수 있습니다.
조회 결과 유형 | 설명 | 방향 | 사용 사례 | 메서드 호출 |
---|---|---|---|---|
깊이(DepthPoint ) |
전체 장면의 깊이 정보를 사용하여 점의 정확한 깊이와 방향을 결정합니다. | 3D 표면에 수직 | 바닥과 벽뿐만 아니라 임의의 표면에 가상 물체 배치 |
이 기능을 사용하려면 ArDepthMode 를 사용 설정해야 합니다.Frame.hitTest(…) , 반품 목록에 DepthPoint 가 있는지 확인하세요.
|
Plane |
수평 또는 수직 표면을 쳐서 포인트의 정확한 깊이와 방향을 결정합니다. | 3D 표면에 수직 | 평면의 전체 도형을 사용하여 평면 (바닥 또는 벽)에 객체를 배치합니다. 즉시 올바른 배율이 필요합니다. 깊이 히트 테스트의 대체 |
Frame.hitTest(…) , 반환 목록에 Plane 가 있는지 확인합니다.
|
특징점 (Point ) |
사용자가 탭한 지점 주변의 시각적 특징을 사용하여 지점의 올바른 위치와 방향을 결정합니다. | 3D 표면에 수직 | 바닥과 벽뿐만 아니라 임의의 표면에 물체를 놓습니다. |
Frame.hitTest(…) , 반환 목록에 Point 가 있는지 확인합니다.
|
순간 게재위치 (InstantPlacementPoint ) |
화면 공간을 사용하여 콘텐츠를 배치합니다. 처음에는 앱에서 제공하는 예상 깊이를 사용합니다. 즉시 작동하지만 ARCore가 실제 장면 도형을 파악할 수 있게 되면 포즈와 실제 깊이가 변경됩니다. | +Y가 중력 반대쪽을 향함 | 빠른 배치가 중요하고 환경에서 알 수 없는 초기 깊이와 크기를 허용할 수 있는 평면의 전체 도형을 사용하여 평면(바닥 또는 벽)에 물체를 배치합니다. |
Frame.hitTestInstantPlacement(float, float, float)
|
표준 히트 테스트 실행
Frame.hitTest()
를 호출하여 AR 뷰에서 MotionEvent
를 가져오는 TapHelper
유틸리티를 사용하여 Hit Test를 실행합니다.
MotionEvent tap = tapHelper.poll();
if (tap == null) {
return;
}
if (usingInstantPlacement) {
// When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
// how far away the anchor will be placed, relative to the camera's view.
List<HitResult> hitResultList =
frame.hitTestInstantPlacement(tap.getX(), tap.getY(), APPROXIMATE_DISTANCE_METERS);
// Hit-test results using Instant Placement will only have one result of type
// InstantPlacementResult.
} else {
List<HitResult> hitResultList = frame.hitTest(tap);
// TODO: Filter hitResultList to find a hit result of interest.
}
val tap = tapHelper.poll() ?: return
val hitResultList =
if (usingInstantPlacement) {
// When using Instant Placement, the value in APPROXIMATE_DISTANCE_METERS will determine
// how far away the anchor will be placed, relative to the camera's view.
frame.hitTestInstantPlacement(tap.x, tap.y, APPROXIMATE_DISTANCE_METERS)
// Hit-test results using Instant Placement will only have one result of type
// InstantPlacementResult.
} else {
frame.hitTest(tap)
}
관심 있는 유형을 기준으로 조회 결과를 필터링합니다. 예를 들어 DepthPoint
에 집중하려면 다음을 실행합니다.
// 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.
for (HitResult hit : hitResultList) {
Trackable trackable = hit.getTrackable();
if (trackable instanceof DepthPoint) { // Replace with any type of trackable type
// Do something with this hit result. For example, create an anchor at this point of
// interest.
Anchor anchor = hit.createAnchor();
// TODO: Use this anchor in your AR experience.
break;
}
}
// 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.
val firstHitResult =
hitResultList.firstOrNull { hit ->
when (val trackable = hit.trackable!!) {
is DepthPoint -> true // Replace with any type of trackable type
else -> false
}
}
if (firstHitResult != null) {
// Do something with this hit result. For example, create an anchor at this point of interest.
val anchor = firstHitResult.createAnchor()
// TODO: Use this anchor in your AR experience.
}
임의의 광선과 방향을 사용하여 히트 테스트 수행
히트 테스트는 일반적으로 기기 또는 기기 카메라의 광선으로 취급되지만 Frame.hitTest(float[], int, float[], int)
를 사용하여 화면 공간 포인트 대신 공간 좌표에서 임의의 광선을 사용하여 히트 테스트를 실행할 수 있습니다.
조회 결과를 사용하여 앵커 만들기
조회 결과가 있으면 해당 포즈를 입력으로 사용하여 장면에 AR 콘텐츠를 배치할 수 있습니다. HitResult.createAnchor()
를 사용하여 새 Anchor
를 만들어 콘텐츠가 조회 결과의 기본 Trackable
에 연결되도록 합니다. 예를 들어, 앵커는 비행기 적중 결과의 경우 감지된 평면에 연결된 상태로 유지되므로 현실 세계의 일부인 것처럼 보입니다.
다음 단계
- GitHub에서
hello_ar_java
및hello_ar_kotlin
샘플 앱을 확인하세요.