किसी मौजूदा Godot XR प्रोजेक्ट में Android XR के लिए सहायता जोड़ना

एक्सआर डिवाइस, जिन पर यह सुविधा काम करती है
इस गाइड की मदद से, इन एक्सआर डिवाइस के लिए अनुभव बनाए जा सकते हैं.
एक्सआर हेडसेट
वायर वाले एक्सआर ग्लास

अगर Godot में आपका कोई मौजूदा एक्सआर प्रोजेक्ट है, तो आपको नया और अलग प्रोजेक्ट शुरू किए बिना, उसमें Android XR की सुविधा जोड़ी जा सकती है. कुछ चरण सभी प्रोजेक्ट के लिए ज़रूरी होते हैं, जबकि अन्य चरण ज़रूरी नहीं होते. यह इस बात पर निर्भर करता है कि आपका प्रोजेक्ट, एक्सआर की किन सुविधाओं का इस्तेमाल करता है. हमने चरणों के साथ-साथ, Android XR की सुविधा जोड़ने वाले Godot के कई ओपन-सोर्स एक्सआर प्रोजेक्ट के लिंक भी शामिल किए हैं. साथ ही, हमने काम के पुल अनुरोध भी शामिल किए हैं, जिनसे पता चलता है कि कुछ सुविधाओं को चालू करने के लिए, किन बदलावों की ज़रूरत होती है.

सभी प्रोजेक्ट के लिए ज़रूरी चरण

यहां दिए गए विषयों में बताए गए चरणों को पूरा करें. भले ही, आपका प्रोजेक्ट एक्सआर की किसी भी तरह की सुविधाओं के साथ काम करता हो. इसके बाद, ज़रूरी नहीं वाले चरणों की सूची में बताई गई सुविधाओं की समीक्षा करें, ताकि यह पता चल सके कि आपके प्रोजेक्ट के लिए, अतिरिक्त काम करने की ज़रूरत है या नहीं.

Godot और Godot OpenXR Vendors प्लगिन को अपडेट करना

अपने प्रोजेक्ट को ज़रूरी नए वर्शन पर अपडेट करने और Android XR के लिए अपने प्रोजेक्ट की सेटिंग कॉन्फ़िगर करने के लिए, यह तरीका अपनाएं:

  1. अपने Godot वर्शन को 4.6.2 या इसके बाद वाले वर्शन पर अपडेट करें. अगर आपको अपने प्रोजेक्ट के लिए ज़्यादा मदद चाहिए, तो नए वर्शन पर माइग्रेट करने से जुड़ा दस्तावेज़ देखें.
  2. Asset Store, Asset Library या GitHub पर मौजूद डेटाबेस से, Godot OpenXR Vendors प्लगिन का 5.1 या इसके बाद वाला वर्शन डाउनलोड करें.

  3. Android XR के लिए अपने प्रोजेक्ट की सेटिंग कॉन्फ़िगर करें:

    1. Android XR के लिए एक्सपोर्ट प्रीसेट जोड़ें.
    2. Gradle Build का इस्तेमाल करें को चालू करें.

    चालू करें

    1. एक्सआर की सुविधाएं सेक्शन में, एक्सआर मोड के लिए OpenXR को चुनें. इसके बाद, AndroidXR प्लगिन चालू करें को चुनें.

    में दिए गए विकल्पों को कॉन्फ़िगर करें

हाथ ट्रैक करने की सुविधा जोड़ना

Android XR हेडसेट और एक्सआर ग्लास पर, हाथ ट्रैक करने की सुविधा, इनपुट का मुख्य तरीका है. हालांकि, इनमें कंट्रोलर भी उपलब्ध हो सकते हैं. अगर मुमकिन हो, तो आपको अपने Godot प्रोजेक्ट में हाथ ट्रैक करने की सुविधा जोड़नी चाहिए.

हाथ ट्रैक करने की सुविधा जोड़ना: प्रोजेक्ट की सेटिंग कॉन्फ़िगर करना

सबसे पहले, हाथ ट्रैक करने की सुविधा और इससे जुड़े OpenXR एक्सटेंशन को चालू करने के लिए, अपने प्रोजेक्ट की सेटिंग सेट अप करने के लिए यह तरीका अपनाएं.

  1. अपने प्रोजेक्ट की सेटिंग खोलें और सामान्य > एक्सआर > OpenXR पर जाएं.
  2. एक्सटेंशन सेक्शन में, हाथ ट्रैक करने की सुविधा और हाथ के इंटरैक्शन की प्रोफ़ाइल को चुनें.

    में दिए गए विकल्पों को कॉन्फ़िगर करें

  3. एक्सटेंशन सेक्शन में, Meta सबसेक्शन ढूंढें. इसके बाद, हाथ ट्रैक करने के लिए मेश और हाथ ट्रैक करने के लिए निशाना को चुनें.

    में दिए गए विकल्पों को कॉन्फ़िगर करें

हाथ ट्रैक करने की सुविधा जोड़ना: कंट्रोलर नोड जोड़ना और कॉन्फ़िगर करना

हाथ ट्रैक करने की सुविधा के लिए, मौजूदा XRController3D नोड में डाइनैमिक तरीके से बदलाव करने के बजाय, हाथ के मॉडल को ट्रैक करने और दिखाने के लिए कंट्रोलर नोड जोड़ें. साथ ही, Hand Tracking Aim एक्सटेंशन से मिलने वाले इनपुट को मैनेज करने के लिए भी कंट्रोलर नोड जोड़ें:

  1. अपने XROrigin3D नोड में, तीन और XRController3D नोड जोड़ें.

    1. एक नोड का नाम "HandTrackingLeft" रखें और ट्रैकर प्रॉपर्टी को /user/hand_tracker/left पर सेट करें.
    2. दूसरे नोड का नाम "HandTrackingRight" रखें और ट्रैकर प्रॉपर्टी को /user/hand_tracker/right पर सेट करें.
    3. आखिरी नोड का नाम "HandTrackingAimLeft" रखें और ट्रैकर प्रॉपर्टी को /user/fbhandaim/left पर सेट करें.

    अगर आपके प्रोजेक्ट के ओरिजनल XRController3D नोड के नाम "XRController3D_left" और "XRController3D_right" थे, तो आपका सीन कुछ ऐसा दिखेगा:

    कंट्रोलर नोड जोड़ने के बाद, आपका सीन कैसा दिख सकता है.

  2. HandTrackingLeft और HandTrackingRight पर मौजूद signal tracking_changed को, उन अलग-अलग फ़ंक्शन से कनेक्ट करें जो संबंधित कंट्रोलर ट्रैकर (XRController3D_left और XRController3D_right पिछले उदाहरण में) की विज़िबिलिटी को अपडेट करते हैं.

    उदाहरण के लिए, HandTrackingLeft पर मौजूद सिग्नल से कनेक्ट किया गया फ़ंक्शन ऐसा दिख सकता है:

    func _on_hand_tracking_left_hand_tracking_changed(tracking):
        $XROrigin3D/XRController3D_left.visible = not tracking
    
  3. हाथ ट्रैक करने वाले कंट्रोलर नोड पर, ट्रैक किए जाने पर दिखाएं प्रॉपर्टी को चालू करें.

    अब आपका प्रोजेक्ट, कंट्रोलर मॉडल और हाथ ट्रैक करने वाले मॉडल के बीच विज़ुअल तरीके से बदलाव कर सकता है. यह इस बात पर निर्भर करता है कि उपयोगकर्ता, हाथ ट्रैक करने की सुविधा का इस्तेमाल कर रहा है या कंट्रोलर का.

  4. हाथ ट्रैक करने वाले कंट्रोलर नोड में, कुछ OpenXRFbHandTrackingMesh नोड को चाइल्ड के तौर पर जोड़ें.

  5. इन OpenXRFbHandTrackingMesh नोड में, XRHandModifier3D नोड को चाइल्ड के तौर पर जोड़ें. साथ ही, यह पक्का करें कि हाथ ट्रैक करने की सुविधा प्रॉपर्टी सही तरीके से सेट हो, ताकि मॉडल पर रीयल टाइम में हाथ ट्रैक करने का डेटा लागू किया जा सके.

    चाइल्ड नोड को कंट्रोलर नोड में जोड़ने के बाद, आपका सीन कैसा दिखेगा.

हाथ ट्रैक करने की सुविधा जोड़ना: OpenXR ऐक्शन मैप पर, हाथ के इंटरैक्शन की प्रोफ़ाइल सेट अप करना

इसके बाद, हाथ के इंटरैक्शन की प्रोफ़ाइल, OpenXR ऐक्शन मैप पर सेट अप करें:

  1. एडिटर में सबसे नीचे मौजूद, OpenXR ऐक्शन मैप मेन्यू खोलें.
  2. सिंपल कंट्रोलर प्रोफ़ाइल मिटाएं, ताकि Galaxy XR कंट्रोलर के साथ काम करने से जुड़ी समस्याएं न हों.
  3. प्रोफ़ाइल जोड़ें पर क्लिक करें. इसके बाद, हाथ के इंटरैक्शन को चुनें. फिर, ठीक है पर क्लिक करें.
  4. इस प्रोफ़ाइल को, अपनी पसंद के मुताबिक एक या एक से ज़्यादा ऐक्शन सेट पर मैप करें.

आपके ऐप्लिकेशन की ज़रूरतों के हिसाब से, हो सकता है कि आपको यह भी तय करना हो कि आपका ऐप्लिकेशन, हाथ ट्रैक करने की सुविधा के साथ उपयोगकर्ता के इनपुट को कैसे मैनेज करता है.

हाथ ट्रैक करने की सुविधा जोड़ना: Android XR के लिए मेन्यू जेस्चर सेट अप करना

आखिर में, Android XR के लिए मेन्यू जेस्चर लागू किया जा सकता है. इससे, प्लेयर का बायां हाथ, मेन्यू जेस्चर करने के लिए सही पोज़िशन में होने पर एक आइकॉन दिखता है. साथ ही, उपयोगकर्ता के जेस्चर करने पर मेन्यू दिखता या छिपता है. इसके लिए, पहले जोड़ा गया HandTrackingAimLeft नोड इस्तेमाल करें .

  1. बाएं हाथ को ट्रैक करने वाले नोड में, बिलबोर्ड वाला क्वाड जोड़ें. इसमें, आपके चुने गए आइकॉन को दिखाया जाता है. इसके लिए, पहले जोड़े गए कंट्रोलर नोड में मौजूद MenuIcon नोड देखें.

    चाइल्ड नोड को कंट्रोलर नोड में जोड़ने के बाद, आपका सीन कैसा दिखेगा.

  2. HandTrackingAimLeft पर मौजूद button_pressed और button_released सिग्नल को, इस तरह के फ़ंक्शन से कनेक्ट करें:

    @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
    

कुछ सुविधाओं के लिए ज़रूरी नहीं वाले चरण

अपने प्रोजेक्ट के लिए ज़रूरी चरण पूरे करने के बाद, यह तय करें कि आपको कुछ सुविधाओं के लिए अतिरिक्त काम करने की ज़रूरत है या नहीं. यह आपके ऐप्लिकेशन की ज़रूरतों और क्षमताओं पर निर्भर करता है. ज़रूरी नहीं वाली इन सुविधाओं के बारे में ज़्यादा जानने के लिए, यहां दिए गए सेक्शन देखें.

पिंच को बटन दबाने की तरह रजिस्टर करना

Android XR में, पिंच का इस्तेमाल कई बुनियादी सिस्टम ऐक्शन के लिए किया जाता है. जैसे, आइटम चुनना, स्क्रोल करना, विंडो को घुमाना या उसका साइज़ बदलना, और 2D और 3D स्पेस में यूज़र इंटरफ़ेस (यूआई) एलिमेंट या ऑब्जेक्ट को घुमाना. इन पैटर्न के मुताबिक काम करने और उपयोगकर्ता को एक जैसा अनुभव देने के लिए, हाथ ट्रैक करने की सुविधा का इस्तेमाल करते समय, आपके ऐप्लिकेशन को पिंच को कंट्रोलर पर बटन दबाने की तरह रजिस्टर करना चाहिए.

अपने ऐप्लिकेशन को इस तरह कॉन्फ़िगर करने के लिए, आपके बनाए गए हाथ के इंटरैक्शन की प्रोफ़ाइल से मिली फ़्लोट वैल्यू का इस्तेमाल करके, वर्चुअल ऐक्शन बनाएं:

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)

कोड के बारे में अहम बातें

  • यह जांचता है कि float वैल्यू, तय की गई थ्रेशोल्ड से ज़्यादा है या कम XRController3D input_float_changed सिग्नल में.
  • pinch_pressed नाम का वर्चुअल ऐक्शन बनाता है.

हाथ ट्रैक करने की सुविधा के साथ, एक्सआर टूल के फ़ंक्शन का इस्तेमाल करना

Godot के कई एक्सआर प्रोजेक्ट, Godot XR Tools का इस्तेमाल करते हैं. इनमें, इस पेज पर लिंक किए गए कुछ ओपन-सोर्स प्रोजेक्ट भी शामिल हैं. एक्सआर टूल के कुछ फ़ंक्शन काम करें, इसके लिए आपको कुछ अतिरिक्त कोड की ज़रूरत होगी. जैसे, मेन्यू इंटरैक्शन के लिए FunctionPointer. इससे, उपयोगकर्ता के हाथ ट्रैक करने की सुविधा पर स्विच करने पर, यह उस ऐक्शन को बदल देगा जिसे वह ढूंढ रहा है.

उदाहरण के लिए, मेन्यू इंटरैक्शन के लिए FunctionPointer का इस्तेमाल करते समय, हाथ ट्रैक करने की सुविधा के लिए XRController3D नोड के tracking_changed सिग्नल के आधार पर, active_button_action प्रॉपर्टी को हाथ ट्रैक करने वाले ऐक्शन पर अपडेट करें. हाथ ट्रैक करने की सुविधा के सेटअप के पिछले चरणों में, ये नोड HandTrackingLeft और HandTrackingRight थे.

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

कोड के बारे में अहम बातें

आर्टिफ़िशियल लोकोमोशन के साथ, हाथ ट्रैक करने की सुविधा का इस्तेमाल करना

अगर आपका प्रोजेक्ट, आर्टिफ़िशियल लोकोमोशन का इस्तेमाल करता है, तब भी हाथ ट्रैक करने की सुविधा का इस्तेमाल किया जा सकता है. उदाहरण के लिए, ऐसा मूवमेंट सिस्टम बनाया जा सकता है जिससे प्लेयर, जेस्चर की मदद से पाथ बनाकर घूम सकें. इसके अलावा, प्लेयर को हाथ ऊपर-नीचे करके तेज़ी से चलने की सुविधा दी जा सकती है. साथ ही, कूदने, चढ़ने, और ग्लाइड करने के लिए अतिरिक्त जेस्चर की सुविधा दी जा सकती है.

The Museum of All Things में, कंट्रोलर पर मौजूद थंबस्टिक का इस्तेमाल करके आर्टिफ़िशियल लोकोमोशन की सुविधा दी गई है. हाथ ट्रैक करने की सुविधा से लोकोमोशन को लागू करने के लिए, "वर्चुअल थंबस्टिक" जोड़े गए हैं. प्लेयर, हवा में पिंच करके इन्हें ट्रिगर करता है. साथ ही, जिस दिशा में थंबस्टिक को घुमाना होता है, उस दिशा में अपना हाथ घुमाता है.

इस सुविधा को लागू करने वाले पुल अनुरोध से मिली कुछ अहम जानकारी यहां दी गई है: सहायता

  • पिंच का पता लगने पर, XRVirtualThumbstick सीन इंस्टैंशिएट हो जाता है.
  • जब तक पिंच को दबाकर रखा जाता है, तब तक पिंच की ओरिजनल जगह से रिलेटिव दूरी और दिशा को Vector2 में बदल दिया जाता है. साथ ही, इसे वर्चुअल तरीके से, सामान्य थंबस्टिक इनपुट पर मैप कर दिया जाता है.
  • प्लेयर को इस इनपुट का विज़ुअल फ़ीडबैक भी दिया जाता है. इसके लिए, बिलबोर्ड वाले दो क्वाड मेश का इस्तेमाल किया जाता है. इससे थंबस्टिक की पोज़िशन दिखती है.

मौजूदा थंबस्टिक-ड्राइव वाले लोकोमोशन कोड को, कम से कम बदलावों के साथ काम करने के लिए, इसी तरह का तरीका आज़माया जा सकता है. हालांकि, हो सकता है कि आपके प्रोजेक्ट के लिए, हाथ ट्रैक करने की सुविधा के लिए कस्टम लोकोमोशन सलूशन की ज़रूरत पड़े.

पासथ्रू की सुविधा जोड़ना

अपने ऐप्लिकेशन में पासथ्रू की सुविधा जोड़ी जा सकती है, ताकि आपके उपयोगकर्ता, अपने आस-पास की असल दुनिया को देख सकें.

अपने ऐप्लिकेशन के लिए, कोड में ये बदलाव करें:

  • OpenXR XRInterface के environment_blend_mode को XR_ENV_BLEND_MODE_ALPHA_BLEND पर सेट करें.
  • WorldEnvironment नोड के background_mode को BG_COLOR पर सेट करें.
  • WorldEnvironment नोड के background_color को, पूरी तरह से पारदर्शी किसी भी रंग पर सेट करें.
  • Viewport transparent_bg प्रॉपर्टी को true पर सेट करें.

लाइट एस्टिमेशन एक्सटेंशन का इस्तेमाल करना

पासथ्रू की सुविधा चालू करते समय, Android XR Light Estimation OpenXR एक्सटेंशन का इस्तेमाल करने पर विचार करें. यह एक्सटेंशन, WorldEnvironment और DirectionalLight3D की प्रॉपर्टी में बदलाव करता है, ताकि उपयोगकर्ता के असल दुनिया के एनवायरमेंट की लाइटिंग को बेहतर तरीके से एम्युलेट किया जा सके. इससे, वर्चुअल ऑब्जेक्ट, असल दुनिया की लाइटिंग की स्थितियों के साथ बेहतर तरीके से ब्लेंड हो जाते हैं. इस एक्सटेंशन को अपने प्रोजेक्ट की सेटिंग में चालू किया जा सकता है.

  1. अपने प्रोजेक्ट की सेटिंग खोलें और सामान्य > एक्सआर > OpenXR पर जाएं.
  2. Androidxr सेक्शन में, लाइट एस्टिमेशन को चुनें.

    में दिए गए विकल्पों को कॉन्फ़िगर करें

  3. अपने सीन ट्री में, OpenXRAndroidLightEstimation नोड जोड़ें और इसे अपने सीन के WorldEnvironment और DirectionalLight3D से कनेक्ट करें.

    के लिए विकल्प

उदाहरण: पासथ्रू और लाइट एस्टिमेशन की सुविधा चालू या बंद करना

यहां दिया गया कोड, पासथ्रू और लाइट एस्टिमेशन की सुविधा को चालू या बंद करता है:

@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
कोड के बारे में अहम बातें
  • लाइट एस्टिमेशन की सुविधा बंद करते समय, DirectionalLight3D की ओरिजनल दिशा को मैन्युअल तरीके से वापस लाना ज़रूरी है.
  • पासथ्रू और लाइट एस्टिमेशन की सुविधा का इस्तेमाल करने वाले प्रोजेक्ट का पूरा उदाहरण देखने के लिए, GitLab पर Expedition to Blobotopia देखें.