用户授予头部跟踪权限后,您的应用可以通过 ARCore for Jetpack XR 检索头部姿势信息。头部姿态信息可帮助您的应用打造更直观的体验,例如让窗口跟随用户的视野。
创建 ARCore for Jetpack XR 会话
通过 ARCore for Jetpack XR 会话获取头部姿态信息。
请参阅了解会话的生命周期,以获取 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 }
头部跟踪的应用
应用可以使用头部跟踪功能来确保实体始终位于用户的视野范围内,这对于需要用户四处查看或移动的应用非常有用。
避免在用户的视野范围内使用头部锁定实体,因为这可能会导致晕动症。请改为使用在短时间后跟随用户头部移动的实体:
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 } } }