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

用户授予头部跟踪权限后,您的应用可以通过 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
        }
    }
}