Jika memiliki project XR yang ada di Godot, Anda dapat menambahkan dukungan untuk Android XR tanpa memulai project baru yang terpisah. Beberapa langkah diperlukan untuk semua project, sementara langkah lainnya bersifat opsional, bergantung pada fitur XR yang digunakan project Anda. Selama langkah-langkah ini, kami telah menyertakan link ke beberapa project Godot XR open source yang telah menambahkan dukungan untuk Android XR, beserta permintaan pull yang relevan yang menunjukkan perubahan yang diperlukan untuk mengaktifkan fitur tertentu.
Langkah-langkah yang diperlukan untuk semua project
Selesaikan langkah-langkah dalam topik berikut, apa pun jenis fitur XR yang didukung project Anda. Setelah itu, tinjau fitur yang diuraikan dalam daftar langkah opsional untuk menentukan apakah project Anda memerlukan pekerjaan tambahan.
Mengupdate Godot dan Plugin Vendor Godot OpenXR
Ikuti langkah-langkah berikut untuk mengupdate project Anda ke versi terbaru yang diperlukan dan mengonfigurasi setelan project untuk Android XR:
- Update versi Godot Anda ke 4.6.2 atau yang lebih baru. Lihat dokumentasi tentang migrasi ke versi baru jika Anda memerlukan bantuan tambahan untuk project Anda.
Download Plugin Vendor Godot OpenXR versi 5.1 atau yang lebih baru dari Asset Store, Asset Library atau repositori di GitHub.
Konfigurasi setelan project Anda untuk Android XR:
- Tambahkan preset ekspor untuk Android XR.
- Aktifkan Use Gradle Build.
- Di bagian XR Features, pilih OpenXR untuk XR Mode, lalu pilih Enable AndroidXR Plugin.
Menambahkan dukungan untuk pelacakan tangan
Meskipun pengontrol mungkin tersedia, metode input utama di headset Android XR dan kacamata XR adalah pelacakan tangan. Jika memungkinkan, Anda harus menambahkan dukungan pelacakan tangan ke project Godot Anda.
Menambahkan dukungan untuk pelacakan tangan: Mengonfigurasi setelan project
Pertama, ikuti langkah-langkah berikut untuk menyiapkan setelan project Anda guna mengaktifkan pelacakan tangan dan ekstensi OpenXR terkait.
- Buka setelan project Anda dan buka General > XR > OpenXR.
Di bagian Extensions, pilih Hand Tracking dan Hand Interaction Profile.
Temukan subbagian Meta di bagian Extensions, lalu pilih Hand Tracking Mesh dan Hand Tracking Aim.
Menambahkan dukungan untuk pelacakan tangan: Menambahkan dan mengonfigurasi node pengontrol
Daripada mengubah node XRController3D yang ada secara dinamis untuk pelacakan tangan, tambahkan node pengontrol untuk melacak dan menampilkan model tangan, serta menangani input dari ekstensi Hand Tracking Aim:
Tambahkan tiga node
XRController3Dtambahan ke nodeXROrigin3DAnda.- Beri nama satu "HandTrackingLeft", dan tetapkan properti pelacak ke
/user/hand_tracker/left. - Beri nama satu "HandTrackingRight", dan tetapkan properti pelacak ke
/user/hand_tracker/right. - Beri nama yang terakhir "HandTrackingAimLeft", dan tetapkan properti pelacak ke
/user/fbhandaim/left.
Jika node
XRController3Dasli project Anda diberi nama "XRController3D_left" dan "XRController3D_right", scene Anda akan terlihat seperti ini:
- Beri nama satu "HandTrackingLeft", dan tetapkan properti pelacak ke
Hubungkan sinyal
tracking_changeddi HandTrackingLeft dan HandTrackingRight ke fungsi individual yang memperbarui visibilitas pelacak pengontrol yang sesuai (XRController3D_left dan XRController3D_right dalam contoh sebelumnya).Misalnya, fungsi yang terhubung ke sinyal di HandTrackingLeft dapat terlihat seperti:
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingAktifkan properti Show When Tracked di node pengontrol pelacakan tangan.
Sekarang project Anda dapat bertukar secara visual antara model pengontrol dan model pelacakan tangan, bergantung pada apakah pengguna menggunakan pelacakan tangan atau pengontrol.
Tambahkan beberapa node
OpenXRFbHandTrackingMeshsebagai turunan ke node pengontrol pelacakan tangan Anda.Tambahkan node
XRHandModifier3Dsebagai turunan ke nodeOpenXRFbHandTrackingMeshini, pastikan properti Hand Tracker yang benar ditetapkan, untuk menerapkan data pelacakan tangan real time ke model.
Menambahkan dukungan untuk pelacakan tangan: Menyiapkan profil Interaksi Tangan di Peta Tindakan OpenXR
Selanjutnya, Anda akan menyiapkan profil Hand Interaction di OpenXR Action Map:
- Buka menu OpenXR Action Map di bagian bawah editor.
- Hapus profil Simple Controller untuk menghindari masalah kompatibilitas dengan pengontrol Galaxy XR.
- Klik Add Profile, pilih Hand Interaction, lalu klik OK.
Petakan profil ini ke satu atau beberapa set tindakan sesuai keinginan Anda.
Bergantung pada persyaratan aplikasi Anda, Anda mungkin juga ingin menyesuaikan cara aplikasi menangani input pengguna dengan pelacakan tangan.
Menambahkan dukungan untuk pelacakan tangan: Menyiapkan gestur menu untuk Android XR
Terakhir, Anda dapat menerapkan gestur menu untuk Android XR. Hal ini akan menampilkan ikon saat tangan kiri pemain berada di posisi yang benar untuk melakukan gestur menu, serta menampilkan atau menyembunyikan menu saat pengguna melakukan gestur. Anda akan menggunakan node HandTrackingAimLeft yang ditambahkan sebelumnya untuk menanganinya.
Tambahkan quad billboard ke node pelacakan tangan kiri yang menampilkan ikon yang telah Anda pilih (lihat node MenuIcon pada gambar berikut dari node pengontrol yang Anda tambahkan sebelumnya).
Hubungkan ke sinyal
button_presseddanbutton_releaseddi HandTrackingAimLeft ke fungsi seperti ini:@onready var menu_icon: MeshInstance3D = $XROrigin3D/HandTrackingLeft/MenuIcon func _on_hand_tracking_aim_left_button_pressed(p_name): if p_name == "menu_pressed": toggle_menu() elif p_name == "menu_gesture": if OS.has_feature("androidxr"): menu_icon.visible = true func _on_hand_tracking_aim_left_button_released(p_name): if p_name == "menu_gesture": menu_icon.visible = false
Langkah-langkah opsional untuk fitur tertentu
Setelah menyelesaikan langkah-langkah yang diperlukan untuk project Anda, Anda dapat memutuskan apakah perlu melakukan pekerjaan tambahan untuk fitur tertentu, bergantung pada persyaratan dan kemampuan aplikasi Anda. Untuk mengetahui informasi selengkapnya tentang setiap fitur opsional ini, lihat bagian berikut.
Mendaftarkan gerakan mencubit sebagai penekanan tombol
Di Android XR, gerakan mencubit digunakan untuk banyak tindakan sistem dasar, seperti memilih item, men-scroll, memindahkan atau mengubah ukuran jendela, dan memindahkan elemen atau objek UI di ruang 2D dan 3D. Untuk menyelaraskan dengan pola ini dan meningkatkan pengalaman pengguna yang konsisten, aplikasi Anda harus mendaftarkan gerakan mencubit dengan cara yang sama seperti penekanan tombol pada pengontrol saat menggunakan pelacakan tangan.
Untuk mengonfigurasi aplikasi Anda dengan cara ini, gunakan nilai float yang disediakan oleh profil Interaksi Tangan yang Anda buat untuk membuat tindakan virtual:
const PRESSED_THRESHOLD := 0.8
const RELEASED_THRESHOLD := 0.6
@onready var left_controller: XRController3D = $XROrigin/XRController3D_left
func _on_xr_controller_3d_left_input_float_changed(p_name: String, value: float):
if p_name == "pinch":
var xr_tracker = XRServer.get_tracker(left_controller.tracker)
if _left_hand_pinching:
if value < RELEASED_THRESHOLD:
_left_hand_pinching = false
xr_tracker.set_input("pinch_pressed", false)
else:
if value > PRESSED_THRESHOLD:
_left_hand_pinching = true
xr_tracker.set_input("pinch_pressed", true)
Poin-poin penting tentang kode
- Memeriksa apakah nilai
floatlebih besar atau lebih kecil dari nilai minimum tertentu dalam sinyalXRController3Dinput_float_changed. - Membuat tindakan virtual yang disebut
pinch_pressed.
Menggunakan fungsi Alat XR bersama dengan pelacakan tangan
Banyak project Godot XR menggunakan Alat XR Godot, termasuk beberapa
project open source yang ditautkan di halaman ini. Agar beberapa fungsi Alat XR berfungsi, seperti FunctionPointer untuk interaksi menu, Anda memerlukan beberapa kode tambahan untuk menukar tindakan yang dicari saat pengguna beralih ke pelacakan tangan.
Misalnya, saat menggunakan FunctionPointer untuk interaksi menu, perbarui properti
active_button_action ke tindakan pelacakan tangan berdasarkan sinyal
tracking_changed dari node XRController3D untuk pelacakan tangan (node
ini adalah HandTrackingLeft dan HandTrackingRight dalam langkah penyiapan pelacakan tangan
sebelumnya).
const TRIGGER_POINTER_ACTION = "trigger_click"
const PINCH_POINTER_ACTION = "pinch_pressed"
@onready var func_point_left: XRToolsFunctionPointer = %FunctionPointerLeft
func _on_hand_tracking_left_tracking_changed(tracking: bool) -> void:
if tracking:
func_point_left.active_button_action = PINCH_POINTER_ACTION
else:
func_point_left.active_button_action = TRIGGER_POINTER_ACTION
Poin-poin penting tentang kode
- Kode ini bergantung pada tindakan virtual
pinch_pressedyang dapat Anda buat untuk mendaftarkan gerakan mencubit sebagai penekanan tombol.
Menggunakan pelacakan tangan bersama dengan lokomosi buatan
Jika project Anda menggunakan lokomosi buatan, dukungan pelacakan tangan masih memungkinkan. Misalnya, Anda dapat membuat sistem gerakan yang memungkinkan pemain menggambar jalur untuk dilalui dengan gestur, atau Anda dapat mengizinkan pemain menggerakkan tangan ke atas dan ke bawah untuk mempercepat, dengan gestur tambahan untuk melompat, memanjat, dan meluncur.
Museum of All Things memiliki lokomosi buatan menggunakan thumbstick pada pengontrol. Lokomosi pelacakan tangan diterapkan dengan menambahkan "thumbstick virtual" yang dipicu pemain dengan mencubit di udara, dan menggerakkan tangan ke arah yang diinginkan thumbstick tersebut.
Berikut beberapa poin penting dari permintaan pull yang menerapkan dukungan ini:
- Scene
XRVirtualThumbstickdibuat instance-nya saat gerakan mencubit terdeteksi. - Saat gerakan mencubit ditahan, jarak dan arah relatif dari lokasi gerakan mencubit asli akan diubah menjadi
Vector2dan dipetakan secara virtual ke input thumbstick normal. - Masukan visual dari input ini juga diberikan kepada pemain dalam bentuk dua mesh quad billboard, yang menggambarkan posisi thumbstick.
Anda dapat mencoba pendekatan serupa untuk membuat kode lokomosi berbasis thumbstick yang ada berfungsi dengan perubahan minimal. Namun, project Anda mungkin masih memerlukan solusi lokomosi kustom untuk pelacakan tangan.
Menambahkan dukungan passthrough
Anda dapat menambahkan dukungan passthrough ke aplikasi sehingga pengguna dapat melihat lingkungan dunia nyata mereka.
Untuk melakukannya di aplikasi Anda, lakukan perubahan kode berikut:
- Tetapkan
environment_blend_modeOpenXRXRInterfacekeXR_ENV_BLEND_MODE_ALPHA_BLEND. - Tetapkan
background_modenodeWorldEnvironmentkeBG_COLOR. - Tetapkan
background_colornodeWorldEnvironmentke warna apa pun yang sepenuhnya transparan. - Tetapkan properti
Viewport transparent_bgketrue.
Menggunakan ekstensi estimasi cahaya
Saat mengaktifkan passthrough, pertimbangkan untuk menggunakan ekstensi OpenXR Estimasi Cahaya Android XR. Ekstensi ini mengubah properti WorldEnvironment dan DirectionalLight3D untuk meniru pencahayaan lingkungan dunia nyata pengguna dengan lebih baik, sehingga objek virtual dapat berbaur dengan lebih baik dengan kondisi pencahayaan dunia nyata. Anda dapat mengaktifkan ekstensi ini di setelan project Anda.
- Buka setelan project Anda dan buka General > XR > OpenXR.
Di bagian Androidxr, pilih Light Estimation.
Tambahkan node
OpenXRAndroidLightEstimationke pohon scene Anda dan hubungkan keWorldEnvironmentdanDirectionalLight3Dscene Anda.
Contoh: Mengaktifkan atau menonaktifkan passthrough dan estimasi cahaya
Kode berikut mengaktifkan atau menonaktifkan passthrough dan estimasi cahaya:
@onready var world_environment = $WorldEnvironment
@onready var directional_light = $DirectionalLight3D
@onready var directional_light_orig_transform: Transform3D = directional_light.transform
func set_passthrough_enabled(p_enabled: bool) -> void:
var xr_interface = XRServer.find_interface("OpenXR")
if xr_interface == null:
return
var supported_blend_modes = xr_interface.get_supported_environment_blend_modes()
if not supported_blend_modes.has(XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND):
return
# Passthrough
if p_enabled:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_STAGE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_ALPHA_BLEND
world_environment.environment.background_mode = Environment.BG_COLOR
world_environment.environment.background_color = Color(0.0, 0.0, 0.0, 0.0)
get_viewport().transparent_bg = true
else:
xr_interface.set_play_area_mode(XRInterface.XR_PLAY_AREA_ROOMSCALE)
xr_interface.environment_blend_mode = XRInterface.XR_ENV_BLEND_MODE_OPAQUE
world_environment.environment.background_mode = Environment.BG_SKY
get_viewport().transparent_bg = false
# Light Estimation
if OS.has_feature("androidxr"):
var light_estimation = Engine.get_singleton("OpenXRAndroidLightEstimationExtension")
if p_enabled and light_estimation.is_light_estimation_supported():
light_estimation.start_light_estimation()
elif light_estimation.is_light_estimation_started():
light_estimation.stop_light_estimation()
directional_light.transform = directional_light_orig_transform
Poin-poin penting tentang kode
- Saat menonaktifkan estimasi cahaya, arah asli
DirectionalLight3Dharus dipulihkan secara manual. - Untuk contoh lengkap project yang menggunakan passthrough dan Estimasi Cahaya, lihat Expedition to Blobotopia di GitLab.