Mevcut bir Godot XR projesine Android XR desteği ekleme

Uygun XR cihazlar
Bu kılavuz, bu tür XR cihazlar için deneyimler oluşturmanıza yardımcı olur.
XR Kulaklığı
Kablolu XR Gözlükleri

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:

  1. 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.
  2. Godot OpenXR Vendors Plugin 5.1 veya daha yeni bir sürümünü Asset Store, Asset Library ya da GitHub'daki depodan indirin.

  3. Projenizin Android XR ayarlarını yapılandırın:

    1. Android XR için dışa aktarma hazır ayarı ekleyin.
    2. Gradle Build'i kullan'ı etkinleştirin.

    Etkinleştirin.

    1. 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.

  1. Projenizin ayarlarını açın ve Genel > XR > OpenXR'a gidin.
  2. Uzantılar bölümünde El Takibi ve El Etkileşimi Profili'ni seçin.

  3. 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:

  1. XROrigin3D düğümünüze üç tane daha XRController3D düğümü ekleyin.

    1. Birine "HandTrackingLeft" adını verin ve izleyici özelliğini /user/hand_tracker/left olarak ayarlayın.
    2. Başka bir "HandTrackingRight" adlandırın ve izleyici özelliğini /user/hand_tracker/right olarak ayarlayın.
    3. Sonuncuyu "HandTrackingAimLeft" olarak adlandırın ve izleyici özelliğini /user/fbhandaim/left olarak ayarlayın.

    Projenizin orijinal XRController3D düğümleri "XRController3D_left" ve "XRController3D_right" olarak adlandırılmışsa sahneniz aşağıdaki gibi görünür:

    Kontrol düğümlerini ekledikten sonra sahnenizin nasıl görünebileceği.

  2. Sinyali bağlayın tracking_changed HandTrackingLeft 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 tracking
    
  3. El 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.

  4. El takibi denetleyici düğümlerinize OpenXRFbHandTrackingMesh düğümlerini alt öğe olarak ekleyin.

  5. Modellere gerçek zamanlı el takibi verilerini uygulamak için bu OpenXRFbHandTrackingMesh düğümlerine XRHandModifier3D düğümlerini alt öğe olarak ekleyin ve doğru Hand Tracker özelliğinin ayarlandığından emin olun.

    Çocuk düğümlerini denetleyici düğümlerinize ekledikten sonra sahnenizin nasıl görünebileceği.

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:

  1. Düzenleyicinin alt kısmındaki OpenXR İşlem Haritası menüsünü açın.
  2. Galaxy XR kumandalarıyla uyumluluk sorunlarını önlemek için Simple Controller profilini silin.
  3. Profil Ekle'yi tıklayın, El Etkileşimi'ni seçin ve Tamam'ı tıklayın.
  4. 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.

  1. 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).

    Çocuk düğümlerini denetleyici düğümlerinize ekledikten sonra sahnenizin nasıl görünebileceği.

  2. HandTrackingAimLeft üzerindeki button_pressed ve button_released sinyallerine 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

  • float değerinin, XRController3D input_float_changed sinyallerindeki belirli eşiklerden büyük veya küçük olup olmadığını kontrol eder.
  • pinch_pressed adlı 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

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 XRVirtualThumbstick sahnesi oluşturulur.
  • Sıkıştırma işlemi sürerken, orijinal sıkıştırma konumuna göre olan mesafe ve yön Vector2 olarak 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'nin environment_blend_mode değerini XR_ENV_BLEND_MODE_ALPHA_BLEND olarak ayarlayın.
  • WorldEnvironment düğümünün background_mode değerini BG_COLOR olarak ayarlayın.
  • WorldEnvironment düğümünün background_color özelliğini tamamen şeffaf olacak şekilde herhangi bir renge ayarlayın.
  • Viewport transparent_bg özelliğini true olarak 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.

  1. Projenizin ayarlarını açın ve Genel > XR > OpenXR'a gidin.
  2. Androidxr bölümünde Light Estimation'ı (Işık Tahmini) seçin.

  3. Sahne ağacınıza bir OpenXRAndroidLightEstimation düğümü ekleyin ve bunu sahnenizin WorldEnvironment ve DirectionalLight3D öğelerine bağlayın.

    Seçenekler

Ö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.