사용자가 머리 추적 권한을 부여하면 앱이 Jetpack XR용 ARCore를 통해 머리 포즈 정보를 가져올 수 있습니다. 머리 포즈 정보는 앱이 사용자의 시야를 따라가는 창과 같은 더 직관적인 환경을 만드는 데 도움이 될 수 있습니다.
Jetpack XR용 ARCore 세션 만들기
Jetpack XR 세션용 ARCore를 통해 머리 포즈 정보를 획득합니다.
Session
를 가져오려면 세션의 수명 주기 이해하기를 참고하세요.
세션 구성
머리 추적은 XR 세션에서 기본적으로 사용 설정되지 않습니다. 헤드 추적을 사용 설정하려면 세션을 구성하고 HeadTrackingMode.LAST_KNOWN
모드를 설정합니다.
val newConfig = session.config.copy( headTracking = Config.HeadTrackingMode.LAST_KNOWN, ) when (val result = session.configure(newConfig)) { is SessionConfigureSuccess -> TODO(/* Success! */) is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) else -> TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */) }
머리 자세 데이터 가져오기
머리 자세 데이터는 RenderViewpoint
을 통해 노출됩니다.
RenderViewpoint
는 기기의 특정 시점의 포즈와 시야를 설명합니다. 기기의 기능에 따라 기기에 왼쪽, 오른쪽 또는 모노 시점이 있을 수 있습니다.
모노 뷰포인트의 데이터를 가져오려면 다음 단계를 따르세요.
val mono = RenderViewpoint.mono(session) ?: return mono.state.collect { state -> val fov = state.fieldOfView val viewpointPose = state.pose }
머리 추적 적용
앱이 헤드 트래킹을 사용하는 한 가지 방법은 사용자가 둘러보거나 이동해야 하는 앱의 경우 사용자의 시야에 엔티티를 유지하는 것입니다.
사용자의 시야에서 headlocked 엔티티를 사용하지 마세요. 멀미를 유발할 수 있습니다. 대신 짧은 시간 후 사용자의 머리를 따라가는 엔티티 이동을 사용하세요.
val viewpointPose = RenderViewpoint.left(session)!!.state lifecycleScope.launch { while (true) { delay(2000) val start = panel.getPose() val startTime = session.state.value.timeMark val pose = session.scene.perceptionSpace.transformPoseTo( viewpointPose.value.pose, session.scene.activitySpace ) val target = Pose(pose.translation + pose.forward * 1f, pose.rotation) while (true) { val ratio = (session.state.value.timeMark - startTime).inWholeMilliseconds / 500f panel.setPose(Pose.lerp(start, target, ratio)) if (ratio > 1f) break } } }