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