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