Godot'ta mevcut bir XR projeniz varsa yeni ve ayrı bir proje başlatmadan Android XR desteği ekleyebilirsiniz. Bazı adımlar tüm projeler için zorunluyken bazıları, projenizin kullandığı XR özelliklerine bağlı olarak isteğe bağlıdır. Adımlarda, Android XR desteği eklenmiş birden fazla açık kaynaklı Godot XR projesinin bağlantılarını ve belirli özelliklerin etkinleştirilmesi için gereken değişiklikleri gösteren ilgili çekme isteklerini ekledik.
Tüm projeler için zorunlu adımlar
Projenizin desteklediği XR özelliklerinin türü ne olursa olsun aşağıdaki konularda yer alan adımları tamamlayın. Ardından, projenizin ek çalışma gerektirip gerektirmediğini belirlemek için isteğe bağlı adımlar listesinde belirtilen özellikleri inceleyin.
Godot'u ve Godot OpenXR Vendors eklentisini güncelleme
Projenizi gerekli en son sürümlere güncellemek ve projenizin Android XR ayarlarını yapılandırmak için aşağıdaki adımları uygulayın:
- Godot sürümünüzü 4.6.2 veya sonraki bir sürüme güncelleyin. Projenizle ilgili ek yardıma ihtiyacınız varsa yeni bir sürüme taşıma ile ilgili dokümanlara bakın.
Godot OpenXR Vendors Plugin 5.1 veya daha yeni bir sürümünü Asset Store, Asset Library ya da GitHub'daki depodan indirin.
Projenizin Android XR ayarlarını yapılandırın:
- Android XR için dışa aktarma hazır ayarı ekleyin.
- Gradle Build'i kullan'ı etkinleştirin.
- XR Özellikleri bölümünde, XR Modu için OpenXR'ı seçin. Ardından AndroidXR Eklentisini Etkinleştir'i seçin.
El takibi için destek ekleme
Kumandalar kullanılabilir ancak Android XR başlıklarında ve XR gözlüklerinde birincil giriş yöntemi el takibidir. Mümkünse Godot projenize el izleme desteği eklemelisiniz.
El takibi desteği ekleme: Proje ayarlarını yapılandırma
Öncelikle, el izlemeyi ve ilgili OpenXR uzantılarını etkinleştirmek için proje ayarlarınızı yapılandırmak üzere aşağıdaki adımları uygulayın.
- Projenizin ayarlarını açın ve Genel > XR > OpenXR'a gidin.
Uzantılar bölümünde El Takibi ve El Etkileşimi Profili'ni seçin.
Uzantılar bölümünde Meta alt bölümünü bulun ve El Takibi Ağı ile El Takibi Hedefi'ni seçin.
El takibi desteği ekleme: Kontrol cihazı düğümleri ekleme ve yapılandırma
El izleme için mevcut XRController3D düğümlerini dinamik olarak değiştirmek yerine, el modellerini izlemek ve görüntülemek için kontrol cihazı düğümleri ekleyin. Ayrıca, El İzleme Hedefleme uzantısından gelen girişleri de işleyin:
XROrigin3Ddüğümünüze üç tane dahaXRController3Ddüğümü ekleyin.- Birine "HandTrackingLeft" adını verin ve izleyici özelliğini
/user/hand_tracker/leftolarak ayarlayın. - Başka bir "HandTrackingRight" adlandırın ve izleyici özelliğini
/user/hand_tracker/rightolarak ayarlayın. - Sonuncuyu "HandTrackingAimLeft" olarak adlandırın ve izleyici özelliğini
/user/fbhandaim/leftolarak ayarlayın.
Projenizin orijinal
XRController3Ddüğümleri "XRController3D_left" ve "XRController3D_right" olarak adlandırılmışsa sahneniz aşağıdaki gibi görünür:
- Birine "HandTrackingLeft" adını verin ve izleyici özelliğini
Sinyali bağlayın
tracking_changedHandTrackingLeft ve HandTrackingRight üzerinde, ilgili denetleyici izleyicilerin görünürlüğünü güncelleyen ayrı işlevlere (önceki örnekteki XRController3D_left ve XRController3D_right).Örneğin, HandTrackingLeft üzerindeki sinyale bağlı işlev şu şekilde görünebilir:
func _on_hand_tracking_left_hand_tracking_changed(tracking): $XROrigin3D/XRController3D_left.visible = not trackingEl takibi kontrol cihazı düğümlerinde İzlenirken Göster özelliğini etkinleştirin.
Artık projeniz, kullanıcının el takibi veya kontrol cihazları kullanmasına bağlı olarak kontrol cihazı modelleri ve el takibi modelleri arasında görsel olarak geçiş yapabilir.
El takibi denetleyici düğümlerinize
OpenXRFbHandTrackingMeshdüğümlerini alt öğe olarak ekleyin.Modellere gerçek zamanlı el takibi verilerini uygulamak için bu
OpenXRFbHandTrackingMeshdüğümlerineXRHandModifier3Ddüğümlerini alt öğe olarak ekleyin ve doğru Hand Tracker özelliğinin ayarlandığından emin olun.
El izleme desteği ekleme: OpenXR Action Map'te bir El Etkileşimi profili oluşturun
Ardından, OpenXR Action Map'te El Etkileşimi profilini ayarlayacaksınız:
- Düzenleyicinin alt kısmındaki OpenXR İşlem Haritası menüsünü açın.
- Galaxy XR kumandalarıyla uyumluluk sorunlarını önlemek için Simple Controller profilini silin.
- Profil Ekle'yi tıklayın, El Etkileşimi'ni seçin ve Tamam'ı tıklayın.
Bu profili istediğiniz gibi bir veya daha fazla işlem grubuna eşleyin.
Uygulamanızın gereksinimlerine bağlı olarak, uygulamanızın el takibiyle kullanıcı girişini nasıl işlediğini de ayarlamak isteyebilirsiniz.
El takibi desteği ekleme: Android XR için menü hareketi ayarlama
Son olarak, Android XR için bir menü hareketi uygulayabilirsiniz. Bu, oyuncunun sol eli menü hareketini gerçekleştirmek için doğru konumda olduğunda bir simge gösterir ve kullanıcı hareketi yaptığında menüyü gösterir veya gizler. Bunu yapmak için daha önce eklediğiniz HandTrackingAimLeft düğümünü kullanacaksınız.
Seçtiğiniz simgeyi gösteren, soldaki el takibi düğümüne billboard'lu bir dörtgen ekleyin (Daha önce eklediğiniz kumanda düğümlerinden aşağıdaki resimde MenuIcon düğümüne bakın).
HandTrackingAimLeft üzerindeki
button_pressedvebutton_releasedsinyallerine bağlanarak aşağıdaki gibi işlevleri kullanabilirsiniz:@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
Belirli özellikler için isteğe bağlı adımlar
Projeniz için gerekli adımları tamamladıktan sonra, uygulamanızın gereksinimlerine ve özelliklerine bağlı olarak belirli özellikler için ek çalışma yapmanız gerekip gerekmediğine karar verirsiniz. Bu isteğe bağlı özelliklerin her biri hakkında daha fazla bilgi için aşağıdaki bölümlere bakın.
Pinch hareketlerini düğmeye basma olarak kaydetme
Android XR'da birçok temel sistem işlemi için parmakla yakınlaştırma kullanılır. Örneğin, öğe seçme, kaydırma, pencereleri taşıma veya yeniden boyutlandırma, kullanıcı arayüzü öğelerini ya da nesneleri 2D ve 3D alanda taşıma gibi işlemler için parmakla yakınlaştırma kullanılır. Bu kalıplara uyum sağlamak ve tutarlı bir kullanıcı deneyimi sunmak için uygulamanız, el takibi kullanılırken parmakla sıkıştırma hareketlerini kontrol cihazındaki düğme basma hareketlerine benzer şekilde kaydetmelidir.
Uygulamanızı bu şekilde yapılandırmak için oluşturduğunuz el etkileşimi profilinde sağlanan kayan değerleri kullanarak sanal bir işlem oluşturun:
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)
Kodla ilgili önemli noktalar
floatdeğerinin,XRController3Dinput_float_changedsinyallerindeki belirli eşiklerden büyük veya küçük olup olmadığını kontrol eder.pinch_pressedadlı bir sanal işlem oluşturur.
XR Araçları işlevlerini el takibi ile birlikte kullanma
Birçok Godot XR projesi, bu sayfada bağlantısı verilen açık kaynaklı projeler de dahil olmak üzere Godot XR Araçları'nı kullanır. Bazı XR Araçları işlevlerinin (ör. menü etkileşimleri için FunctionPointer) çalışması için, kullanıcı el takibine geçtiğinde aradığı işlemi değiştirecek ek kodlar gerekir.
Örneğin, menü etkileşimleri için FunctionPointer kullanılırken active_button_action özelliğini, el takibi için XRController3D düğümlerinin tracking_changed sinyaline göre el takibi işlemiyle güncelleyin (bu düğümler, önceki el takibi kurulum adımlarında HandTrackingLeft ve HandTrackingRight idi).
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
Kodla ilgili önemli noktalar
- Bu kod,
pinch_pressedsanal işlemine dayanır. Bu işlemi, parmakla sıkıştırma hareketlerini düğmeye basma olarak kaydetmek için oluşturabilirsiniz.
Yapay hareketle birlikte el takibini kullanma
Projenizde yapay hareket kullanılıyorsa el takibi desteği yine de mümkündür. Örneğin, oyuncuların bir hareketle geçecekleri yolları çizmelerine olanak tanıyan bir hareket sistemi oluşturabilir veya oyuncuların zıplama, tırmanma ve süzülme için ek hareketlerle hızlanmak üzere ellerini yukarı ve aşağı hareket ettirmelerine izin verebilirsiniz.
The Museum of All Things'de, kumandalardaki başparmak çubukları kullanılarak yapay hareket sağlanır. El takibiyle hareket, oyuncunun havada parmağını kıstırarak tetiklediği ve elini başparmak çubuğunun hareket etmesini istediği yönde hareket ettirerek kullandığı "sanal başparmak çubukları" eklenerek uygulandı.
Bu desteği uygulayan çekme isteğinden çıkarılacak önemli derslerden bazıları şunlardır:
- Pinch hareketi algılandığında
XRVirtualThumbsticksahnesi oluşturulur. - Sıkıştırma işlemi sürerken, orijinal sıkıştırma konumuna göre olan mesafe ve yön
Vector2olarak değiştirilir ve normal analog çubuk girişine sanal olarak eşlenir. - Bu girişin görsel geri bildirimi, başparmak çubuğunun konumunu gösteren iki billboard'lu dörtlü ağ şeklinde oynatıcıya da verilir.
Mevcut başparmak çubuğuyla hareket kodunuzu minimum değişiklikle çalışır hale getirmek için benzer bir yaklaşım deneyebilirsiniz. Ancak projenizde el takibi için özel bir hareket çözümü gerekebilir.
Passthrough desteği ekleme
Kullanıcılarınızın gerçek dünyadaki çevrelerini görebilmesi için uygulamanıza geçiş desteği ekleyebilirsiniz.
Uygulamanız için bunu yapmak üzere aşağıdaki kod değişikliklerini yapın:
- OpenXR
XRInterface'ninenvironment_blend_modedeğeriniXR_ENV_BLEND_MODE_ALPHA_BLENDolarak ayarlayın. WorldEnvironmentdüğümününbackground_modedeğeriniBG_COLORolarak ayarlayın.WorldEnvironmentdüğümününbackground_colorözelliğini tamamen şeffaf olacak şekilde herhangi bir renge ayarlayın.Viewport transparent_bgözelliğinitrueolarak ayarlayın.
Işık tahmini uzantısını kullanma
Geçişi etkinleştirirken Android XR Light Estimation OpenXR uzantısını kullanmayı düşünebilirsiniz. Bu uzantı, kullanıcının gerçek dünya ortamındaki ışıklandırmayı daha iyi taklit etmek için WorldEnvironment ve DirectionalLight3D özelliklerini düzenler. Böylece sanal nesneler, gerçek dünyadaki ışıklandırma koşullarıyla daha iyi uyum sağlar. Bu uzantıyı projenizin ayarlarından etkinleştirebilirsiniz.
- Projenizin ayarlarını açın ve Genel > XR > OpenXR'a gidin.
Androidxr bölümünde Light Estimation'ı (Işık Tahmini) seçin.
Sahne ağacınıza bir
OpenXRAndroidLightEstimationdüğümü ekleyin ve bunu sahnenizinWorldEnvironmentveDirectionalLight3Döğelerine bağlayın.
Örnek: Geçiş ve ışık tahminini etkinleştirme veya devre dışı bırakma
Aşağıdaki kod, geçişi ve ışık tahminini etkinleştirir veya devre dışı bırakır:
@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
Kodla ilgili önemli noktalar
- Işık tahmini devre dışı bırakıldığında,
DirectionalLight3Döğesinin orijinal yönü manuel olarak geri yüklenmelidir. - Passthrough ve Light Estimation'ı kullanan bir projenin tam örneği için GitLab'deki Expedition to Blobotopia'ya göz atın.