Menggabungkan posisi kepala dalam aplikasi Anda dengan ARCore untuk Jetpack XR

Setelah pengguna memberikan izin untuk pelacakan 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

Mendapatkan informasi postur kepala melalui sesi ARCore untuk Jetpack XR. Lihat Memahami siklus proses Sesi untuk mendapatkan Session.

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 sudut 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 dalam 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 gerakan entitas yang mengikuti gerakan 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
        }
    }
}