Menggabungkan posisi kepala dalam aplikasi Anda dengan ARCore untuk Jetpack XR

Perangkat XR yang kompatibel
Panduan ini membantu Anda membangun pengalaman untuk jenis perangkat XR ini.
Headset XR
Kacamata XR Berkabel

Setelah pengguna memberikan izin untuk pelacakan gerak kepala, aplikasi Anda dapat mengambil informasi postur kepala melalui ARCore untuk Jetpack XR. Informasi pose kepala dapat membantu aplikasi Anda menciptakan pengalaman yang lebih intuitif, seperti jendela yang mengikuti bidang pandang pengguna.

Membuat sesi ARCore untuk Jetpack XR

Dapatkan informasi pose kepala melalui Jetpack XR Runtime Session, yang dapat dibuat oleh aplikasi Anda.

Mengonfigurasi sesi

Pelacakan gerak kepala tidak diaktifkan secara default pada sesi XR. Untuk mengaktifkan pelacakan kepala, konfigurasi sesi dan tetapkan mode 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. */)
}

Mengambil data pose kepala

Data pose kepala diekspos melalui RenderViewpoint. RenderViewpoint menjelaskan pose dan bidang pandang untuk titik pandang tertentu dari perangkat. Perangkat dapat memiliki sudut pandang kiri, kanan, atau mono, bergantung pada kemampuan perangkat.

Untuk mendapatkan data untuk sudut pandang mono:

val mono = RenderViewpoint.mono(session) ?: return
mono.state.collect { state ->
    val fov = state.fieldOfView
    val viewpointPose = state.pose
}

Penerapan pelacakan gerak kepala

Salah satu cara aplikasi Anda dapat menggunakan pelacakan kepala adalah dengan menjaga agar entitas tetap berada di bidang pandang pengguna, untuk aplikasi yang mengharuskan pengguna melihat atau bergerak.

Hindari penggunaan entitas yang terkunci di kepala dalam bidang pandang pengguna karena hal ini dapat menyebabkan mabuk perjalanan. Sebagai gantinya, gunakan pergerakan entitas yang mengikuti kepala pengguna setelah durasi singkat:

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