Android 앱에서 Hit Test 실행

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

조회 결과 유형

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

조회 결과 유형 설명 수업 소개 사용 사례 메서드 호출
깊이 (DepthPoint) 전체 장면의 깊이 정보를 사용하여 지점의 정확한 깊이와 방향을 결정합니다. 3D 표면에 수직 바닥과 벽뿐 아니라 임의의 표면에 가상 객체를 배치합니다. 이 작업을 수행하려면 ArDepthMode를 사용 설정해야 합니다.

Frame.hitTest(…)님, 반품 목록에서 DepthPoint을 확인하세요.
Plane 점의 정확한 깊이와 방향을 결정하기 위해 수평 또는 수직면을 누릅니다. 3D 표면에 수직 항공기의 전체 형태를 사용하여 평면 (바닥 또는 벽)에 객체를 배치합니다. 정확한 체중계가 즉시 필요합니다. 깊이 Hit Test의 대체 Frame.hitTest(…)님, 반품 목록에서 Plane을(를) 확인하세요.
특성 포인트 (Point) 지점의 올바른 위치와 방향을 결정하기 위해 사용자가 탭하는 지점 주변의 시각적 기능을 사용합니다. 3D 표면에 수직 물체를 바닥과 벽뿐만 아니라 임의의 표면에 배치합니다. Frame.hitTest(…)님, 반품 목록에서 Point을(를) 확인하세요.
인스턴트 게재위치 (InstantPlacementPoint) 화면 공간을 사용하여 콘텐츠를 배치합니다. 처음에는 앱에서 제공하는 추정 깊이를 사용합니다. 즉시 작동하지만 ARCore가 실제 장면의 기하학적 구조를 확인할 수 있게 되면 포즈와 실제 깊이가 변경됩니다. 중력 반대편에 있는 +Y가 위를 향함 빠른 배치가 중요하며 항공기의 전체 형태를 사용하여 평면 (바닥 또는 벽)에 객체를 배치합니다. 알 수 없는 초기 깊이와 규모를 감당할 수 있습니다. Frame.hitTestInstantPlacement(float, float, float)

표준 Hit Test 실행

Frame.hitTest()를 호출하여 Hit 테스트를 실행합니다. TapHelper 유틸리티를 사용하여 AR 뷰에서 MotionEvent를 가져옵니다.

Java

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.
}

Kotlin

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에 집중하려면 다음을 실행합니다.

Java

// 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;
  }
}

Kotlin

// 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.
}

임의의 광선과 방향을 사용하여 Hit Test 실행

Hit 테스트는 일반적으로 기기나 기기 카메라의 광선으로 처리되지만, Frame.hitTest(float[], int, float[], int)를 사용하면 화면 공간 포인트 대신 세계 공간 좌표에서 임의의 광선을 사용하여 Hit 테스트를 실행할 수 있습니다.

조회 결과를 사용하여 앵커 만들기

히트 결과가 있으면 이 포즈를 입력으로 사용하여 장면에 AR 콘텐츠를 배치할 수 있습니다. HitResult.createAnchor()를 사용하여 새 Anchor를 만들어 콘텐츠가 조회 결과의 기본 Trackable에 연결되도록 합니다. 예를 들어 비행기 적중 결과에서 앵커가 감지된 평면에 연결된 상태로 유지되므로 실제 세계의 일부인 것처럼 보입니다.

다음 단계