使用 ARCore for Jetpack XR 在应用中纳入头部位置信息

适用的 XR 设备
本指南可帮助您为这些类型的 XR 设备打造体验。
XR 头戴设备
有线 XR 眼镜

用户授予头部跟踪权限后,您的应用可以通过 ARCore for Jetpack XR 检索头部姿势信息。头部姿态信息可帮助您的应用打造更直观的体验,例如让窗口跟随用户的视野。

创建 ARCore for Jetpack XR 会话

通过 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
        }
    }
}