Jetpack XR용 ARCore를 사용하여 평면 감지

Jetpack XR용 ARCore는 사용자 환경에서 평평한 표면을 감지하고 포즈, 크기, 방향과 같은 정보를 제공할 수 있습니다. 이렇게 하면 앱에서 테이블과 같은 표면을 찾아 객체를 배치할 수 있습니다.

Jetpack XR용 ARCore 세션 만들기

Jetpack XR 세션용 ARCore를 통해 평면 정보에 액세스합니다. Session를 가져오려면 세션 수명 주기 이해하기를 참고하세요.

세션 구성

평면 감지는 XR 세션에서 기본적으로 사용 설정되지 않습니다. 비행기 추적을 사용 설정하려면 세션을 구성합니다.

val newConfig = session.config.copy(
    planeTracking = Config.PlaneTrackingMode.HorizontalAndVertical,
)
when (val result = session.configure(newConfig)) {
    is SessionConfigureConfigurationNotSupported ->
        TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
    is SessionConfigurePermissionsNotGranted ->
        TODO(/* The required permissions in result.permissions have not been granted. */)
    is SessionConfigureSuccess -> TODO(/* Success! */)
}

인식된 평면의 상태를 가져옵니다.

Jetpack XR용 ARCore는 평면 상태를 내보내는 StateFlow를 통해 평면 상태를 제공합니다. 세션에서 평면을 구독하면 평면이 추가, 업데이트 또는 삭제될 때 앱에 알림이 전송됩니다.

Plane.subscribe(session).collect { planes ->
    // Planes have changed; update plane rendering
}

평면에는 다음과 같은 속성이 있습니다.

  • label: 지정된 Plane의 시맨틱 설명입니다. Wall, Floor, Ceiling 또는 Table일 수 있습니다.
  • centerPose: 감지된 평면 중심의 포즈입니다.
  • extents: 감지된 평면의 크기(단위: 미터)입니다.
  • vertices: 평면을 근사하는 볼록 다각형의 정점 목록입니다.

평면에 대한 히트 테스트 실행

히트 테스트는 세션에서 추적하는 객체와 광선의 교차를 계산하는 방법입니다. 히트 테스트의 일반적인 적용은 표를 가리키고 해당 위치에 객체를 배치하는 것입니다. 히트 테스트를 실행하면 히트 객체 목록이 생성됩니다. 즉, 첫 번째 객체에서 히트 테스트가 중지되지 않습니다. 그러나 특정 유형의 첫 번째 객체에만 관심이 있는 경우가 많습니다.

히트 테스트를 실행하려면 Interaction.hitTest()Ray을 사용합니다.

val results = androidx.xr.arcore.hitTest(session, ray)
// When interested in the first Table hit:
val tableHit = results.firstOrNull {
    val trackable = it.trackable
    trackable is Plane && trackable.state.value.label == Plane.Label.Table
}