Android XR

Unity की मदद से, Android XR पर स्पेशल कॉन्टेंट बनाना

स्पीकर

  • लेवाना चेन

    सॉफ़्टवेयर इंजीनियर

  • जेनिफ़र स्टैंटन

    सीनियर सॉफ़्टवेयर इंजीनियर

इसके बारे में

बातचीत के बारे में जानकारी

Unity और Android XR का इस्तेमाल करके, असल दुनिया में 3D अनुभवों को ऐंकर करने और उन्हें बनाए रखने का तरीका जानें. इस सेशन में, Spatial Entities फ़्रेमवर्क, क्लाउड ऐंकर, और Geospatial API के बारे में बताया गया है. इसमें यह भी बताया गया है कि कॉन्टेक्स्ट के हिसाब से काम करने वाले ऐसे ऐप्लिकेशन कैसे बनाए जाएं जो फ़िज़िकल प्लेसमेंट को याद रखते हैं और अलग-अलग सेशन में डिवाइस के एक से ज़्यादा उपयोगकर्ताओं के स्पेशल डेटा को सिंक करते हैं.

हम स्पेशल एंटिटी के पीछे के आर्किटेक्चर की जांच करेंगे. साथ ही, यह समझेंगे कि डिजिटल ऐसेट को फ़िज़िकल ऑब्जेक्ट, प्लैटफ़ॉर्म, और भौगोलिक जगहों पर कैसे ऐंकर किया जाए. आपको Unity के ऐसे वर्कफ़्लो के बारे में जानकारी मिलेगी जो स्पेस को मैप करने, अलग-अलग सेशन में कॉन्टेंट को बनाए रखने, और जगह की जानकारी के हिसाब से एआर/एक्सआर के अनुभव शेयर करने में मदद करते हैं.

खास जानकारी

  • AR Foundation, OpenXR एक्सटेंशन का इस्तेमाल करके, एक्सआर प्लैटफ़ॉर्म पर यूनिफ़ाइड स्क्रिप्टिंग एपीआई उपलब्ध कराता है. इसकी मदद से, असल दुनिया की सुविधाओं को दिखाया जा सकता है और उनके बारे में क्वेरी की जा सकती है. जैसे, प्लेन और मेश.
  • परसिस्टेंट ऐंकर, अलग-अलग सेशन और डिवाइस को रीस्टार्ट करने के दौरान, डिजिटल कॉन्टेंट को स्थिर रखते हैं. TrySaveAnchorAsync का इस्तेमाल करके, उन्हें सेव रखा जा सकता है. साथ ही, सीरियलाइज़ किए गए जीयूआईडी का इस्तेमाल करके, उन्हें फिर से लोड किया जा सकता है.
  • स्पेशल एंटिटी फ़्रेमवर्क, ट्रैक किए जा सकने वाले एक्सटेंशन की जगह लेता है. इससे क्रॉस-प्लैटफ़ॉर्म सहायता मिलती है. साथ ही, बाउंडिंग बॉक्स और मार्कर जैसे आइटम को ट्रैक करने के लिए बेहतर परफ़ॉर्मेंस मिलती है.
  • Android XR की अनुमतियां मिलने तक, मैनेजर कॉम्पोनेंट बंद होने चाहिए. इससे, संवेदनशील एनवायरमेंट डेटा के ऐक्सेस पर लगी पाबंदी की वजह से, सबसिस्टम को शुरू करने में आने वाली गड़बड़ियों से बचा जा सकता है.
  • Geospatial API, Google Cloud ARCore सेवाओं और वीपीएस का इस्तेमाल करके, कॉन्टेंट को असल दुनिया में आउटडोर जगहों पर दिखाता है.

संसाधन

Gemini Notebook

विषय

  • android-xr
  • unity
  • ar-foundation
  • openxr
  • spatial-entities
  • एंकर
  • geospatial-api

ट्रांसक्रिप्ट

ट्रांसक्रिप्ट डाउनलोड करें

AR Foundation के बारे में जानकारी और खास जानकारी

  • ठीक है।

  • सभी का स्वागत है.

  • यह Unity की मदद से, Android XR पर स्पेशल कॉन्टेंट बनाने के बारे में है.

  • मेरा नाम जेनिफ़र स्टैंटन है.

  • मैं Unity में सीनियर सॉफ़्टवेयर इंजीनियर के तौर पर काम करता हूं.

  • मैं XR की सुविधाओं पर काम करने वाली टीम में हूं. खास तौर पर, AR Foundation और उससे जुड़े पैकेज पर काम करती हूं. ये पैकेज, Unity में ऑगमेंटेड और मिक्स्ड रिएलिटी की सुविधाएं उपलब्ध कराते हैं.

  • मैं Google की XR गेम इंजन टीम से लेवाना चेन हूं.

  • हमारी टीमों ने ऐसे प्लगिन और पैकेज उपलब्ध कराने पर फ़ोकस किया जो XR की बेहतर सुविधाएं और गेम इंजन के साथ आसानी से इंटिग्रेशन की सुविधा देते हैं.

  • हमें आपसे पता चला है कि एक ही कोड बेस से कई एक्सआर प्लैटफ़ॉर्म को सपोर्ट करना काफ़ी मुश्किल काम है.

  • एआर फ़ाउंडेशन, Unity की हाई-लेवल एक्सटेंडेड रिएलिटी एपीआई लेयर है.

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

  • इससे आपको अपना ऐप्लिकेशन, गेम या अनुभव बनाने पर फ़ोकस करने में मदद मिलती है. साथ ही, Unity आपके लिए प्लैटफ़ॉर्म की जानकारी का ध्यान रखता है.

  • AR Foundation, OpenXR एक्सटेंशन की मदद से ऐसा करता है.

  • ये ओपन, इंडस्ट्री स्टैंडर्ड एपीआई का एक सेट हैं, जिन्हें Khronos Group ने तय किया है.

  • OpenXR ने स्पेशल एंटिटी भी बनाई हैं.

  • यह डिजिटल कॉन्टेंट के लिए एक फ़्रेमवर्क है, जो असल दुनिया को दिखाता है और उसके साथ इंटरैक्ट करता है.

  • स्पेशल एंटिटी, असल दुनिया के एलिमेंट को डिजिटल ऑब्जेक्ट के तौर पर दिखाने के लिए एक यूनिफ़ाइड मॉडल उपलब्ध कराती हैं.

  • मुझे आपके साथ AR Foundation के बारे में कुछ नई जानकारी शेयर करते हुए खुशी हो रही है. इससे आपको एक्सआर के लिए अनुभव बनाने का अपना सफ़र शुरू करने में मदद मिलेगी.

  • इसके बाद, मैं AR Foundation की सुविधाओं के बारे में बताऊंगी, ताकि आपका डिजिटल कॉन्टेंट असल दुनिया के साथ इंटरैक्ट कर सके.

  • इसके बाद, मैं प्रोजेक्ट सेटअप के बारे में बताऊंगी. इसमें पैकेज और अन्य डिपेंडेंसी शामिल हैं, ताकि आप इसे अपने प्रोजेक्ट में लागू कर सकें.

  • इसके बाद, मैं Android XR की कुछ खास सुविधाओं के बारे में बताकर इस सेशन को खत्म करूंगा.

AR Foundation की मुख्य सुविधाएं

  • AR Foundation, असल दुनिया को डिजिटल तौर पर दिखाने के लिए, प्लेन का इस्तेमाल करता है.

  • ये असल दुनिया में मौजूद सपाट सतहें होती हैं. जैसे, फ़र्श, दीवारें, छतें, और यहां तक कि टेबल और काउच.

  • मेश, 3D स्ट्रक्चर होते हैं. ये असल दुनिया की ज्यामिति को दिखाते हैं.

  • इसके बाद, हमारे पास असल दुनिया के साथ इंटरैक्ट करने के तरीके भी हैं, जैसे कि रे कास्ट.

  • इनसे यह तय होता है कि रे, डिजिटल कॉन्टेंट को कहां इंटरसेक्ट करती है.

  • इसे लेज़र पॉइंटर की तरह समझें. आपको यह जानकारी मिलती है कि वह लेज़र पॉइंटर कहां चमक रहा है.

  • हमारे पास ऐंकर भी हैं. इनकी मदद से, स्पेस में किसी पॉइंट को स्थिर किया जा सकता है और उसकी जगह बदली जा सकती है.

  • हम इस प्रज़ेंटेशन में आगे चलकर, ऐंकर के बारे में ज़्यादा जानकारी देंगे.

  • इसलिए, इन चारों को AR Foundation की सुविधाएं माना जाता है.

  • इस स्लाइड में बताई गई सुविधाओं के अलावा, और भी कई सुविधाएं उपलब्ध हैं.

  • खास तौर पर, प्लेन और ऐंकर को ट्रैक किया जा सकता है, क्योंकि वे ARTrackable क्लास को एक्सटेंड करते हैं. साथ ही, उनके मैनेजर रन टाइम से अपडेट ट्रैक करते हैं.

  • चलिए, अब प्लेन के बारे में बात करते हैं.

  • प्लेन के लिए, हमारे पास ARPlane कॉम्पोनेंट है. इससे रीयल-टाइम में फ़्लैट सरफ़ेस की पहचान की जा सकती है.

  • इनमें सिमैंटिक लेबल होते हैं, जिनसे क्वेरी की जा सकती है. इससे आपको पता चलता है कि आपका प्लेन फ़्लोर, टेबल, दीवार वगैरह है या नहीं.

  • प्लेन की सीमाएं भी डाइनैमिक होती हैं. इसलिए, जब उपयोगकर्ता असल दुनिया में आगे बढ़ता है और उसे ज़्यादा सतहें दिखती हैं, तो प्लेन की सीमाएं रीयल टाइम में डाइनैमिक तौर पर फैलती हैं, मर्ज होती हैं, और बेहतर होती हैं.

  • हम फ़िज़िक्स को हैंडल करने के लिए, प्लेन में मेश कोलाइडर भी अटैच कर सकते हैं.

  • यहां प्लेन की पहचान करने का एक उदाहरण देखा जा सकता है.

  • यह AR Foundation के सैंपल का रे कास्ट सीन है, जो Android XR डिवाइस पर चल रहा है.

  • यह रीयल-टाइम, डाइनैमिक, और 2D पॉलीगॉन का पता लगाता है.

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

  • इसके बाद, हमारे पास मेश हैं.

  • मेश, एआर की एक सुविधा है. इससे आस-पास के माहौल के 3D मेश मिलते हैं.

  • हम जनरेट की गई इन मेश में मेश कोलाइडर अटैच कर सकते हैं. इससे आपका डिजिटल कॉन्टेंट, असल दुनिया के ऑब्जेक्ट के साथ इंटरैक्ट कर पाता है.

  • मेश की मदद से, ऑब्जेक्ट को बेहतर तरीके से छिपाया जा सकता है.

  • इसलिए, कोई वर्चुअल ऑब्जेक्ट किसी फ़िज़िकल ऑब्जेक्ट के पीछे दिख सकता है.

  • अगर आपका डिजिटल ऑब्जेक्ट स्पेस में मूव कर सकता है, तो उसी ज्यामिति का इस्तेमाल करके ऐसा पाथ ढूंढा जा सकता है जो असल दुनिया के ऑब्जेक्ट से बचता हो.

  • इसके बाद, हमारे पास रे कास्टिंग है.

  • रे कास्टिंग, आपके 3D सीन में वर्चुअल रे प्रोजेक्ट करती है, ताकि इंटरसेक्शन ढूंढे जा सकें. इसके लिए, आपको मुश्किल गणित की चिंता करने की ज़रूरत नहीं है.

  • प्रोजेक्ट की गई रे, आपके एनवायरमेंट में मौजूद कई 3D ऑब्जेक्ट को इंटरसेक्ट कर सकती है.

  • रे कास्ट को इस तरह कॉन्फ़िगर किया जा सकता है कि वह सिर्फ़ कुछ खास तरह के डिजिटल कॉन्टेंट को हिट करे.

  • उदाहरण के लिए, इसे इस तरह कॉन्फ़िगर किया जा सकता है कि यह प्लेन से न टकराए और सिर्फ़ मेश को इंटरसेक्ट करे.

पैकेज और डिपेंडेंसी सेटअप

  • चलिए, अब काम के पैकेज पर नज़र डालते हैं.

  • ये सभी पैकेज एक-दूसरे के साथ काम करते हैं, ताकि वे एक-दूसरे से कम्यूनिकेट कर सकें और एक्सआर का पूरा अनुभव दे सकें.

  • जैसा कि बताया गया है, AR Foundation, प्लेन और ऐंकर जैसी सुविधाओं को मैनेज करता है.

  • OpenXR प्लग-इन, अलग-अलग XR प्लैटफ़ॉर्म पर नेटिव एपीआई को मैनेज करता है. इसलिए, अगर आपका डिवाइस OpenXR का इस्तेमाल करता है, तो आपको इस पैकेज का इस्तेमाल करना चाहिए.

  • OpenXR प्लग-इन को OpenXR Spatial Entities पैकेज के साथ जोड़ा जा सकता है. इससे Spatial Entities एक्सटेंशन को ऐक्सेस किया जा सकता है. इसके बारे में ज़्यादा जानकारी बाद में दी जाएगी.

  • अगर आपको खास तौर पर Android XR डिवाइसों को टारगेट करना है, जैसे कि XR हेडसेट और तार वाले XR चश्मे, तो इसके लिए Unity OpenXR Android XR पैकेज की ज़रूरत होगी.

  • यह सब प्लग-इन पैटर्न के मुताबिक होता है. इसलिए, आपके कोड पर इसका असर कम से कम होना चाहिए.

  • सभी सुविधाएं, AR Foundation के सभी पैकेज में उपलब्ध नहीं हैं.

  • उदाहरण के लिए, इस चार्ट को देखें. इसमें बताया गया है कि फ़िलहाल, Unity OpenXR Spatial Entities पैकेज में मेशिंग की सुविधा उपलब्ध नहीं है.

  • XR प्लग-इन मैनेजमेंट की मदद से, यह मैनेज किया जा सकता है कि आपके प्रोजेक्ट में OpenXR की कौनसी सुविधाएं चुनी गई हैं.

  • इसलिए, अगर Unity एडिटर का इस्तेमाल किया जा रहा है, तो Edit और Project Settings पर जाएं. इसके बाद, बाईं ओर मौजूद साइडबार में XR Plug-in Management पर जाएं.

  • यहां आपको OpenXR की सुविधाएं और सुविधाओं के ग्रुप दिखेंगे. इससे आपको यह चुनने में मदद मिलेगी कि आपको अपने बिल्ड में कौनसी सुविधाएं और सुविधाओं के ग्रुप शामिल करने हैं और कौनसे नहीं.

  • उदाहरण के लिए, इस स्क्रीनशॉट में Android XR OpenXR पैकेज के साथ मिलने वाले सभी एक्सटेंशन देखे जा सकते हैं.

  • इसके बाद, इन्हें स्पेस से जुड़ी इकाइयों के साथ मिलाया जा सकता है. उदाहरण के लिए, अगर आपको ऐसा करना है.

  • यह पैकेज मैनेजर विंडो है.

  • हमने कुछ ऐसे पैकेज हाइलाइट किए हैं जो आपको किसी सामान्य XR प्रोजेक्ट सेटअप में दिख सकते हैं.

  • जैसा कि आप देख सकते हैं, हमारे पास एआर फ़ाउंडेशन है, जिसके बारे में बताया गया है.

  • हमारे पास OpenXR प्लग-इन भी है.

  • हमारे पास Android XR पैकेज है.

  • मैंने अन्य प्लैटफ़ॉर्म के कुछ और प्लैटफ़ॉर्म भी हाइलाइट किए हैं, क्योंकि आपके पास ऐसा प्रोजेक्ट बनाने का विकल्प है जो कई प्लैटफ़ॉर्म पर कंपाइल हो.

  • इसके अलावा, सबसे नीचे दाईं ओर कुछ अन्य पैकेज भी मौजूद हैं.

  • Composition Layers, जो OpenXR डिवाइसों के साथ काम करते हैं; Core Utils, जो XR से जुड़ी हर चीज़ के लिए बहुत काम का है; और फिर XR Hands और XR Interaction Toolkit, ताकि आपका इनपुट मिल सके, जो कि बहुत ज़रूरी है.

  • इसके बाद, प्रोजेक्ट की पुष्टि करने की प्रोसेस आती है.

  • इसलिए, यह भी XR प्लग-इन मैनेजमेंट का हिस्सा है.

  • प्रोजेक्ट की पुष्टि करने की सुविधा, डुप्लीकेट सुविधाओं के साथ-साथ आपके प्रोजेक्ट में मौजूद अन्य समस्याओं का पता लगा सकती है. प्रोजेक्ट को चलाने के लिए, आपको इन समस्याओं को ठीक करना होगा.

  • हालांकि, इस स्क्रीनशॉट में मैंने डुप्लीकेट सुविधाओं को हाइलाइट किया है.

  • इसका मतलब है कि दो एक जैसी सुविधाएं, जैसे कि मुझे लगता है कि हमारे पास ऐंकर, शायद प्लेन, और रेकास्ट हैं.

  • उपयोगकर्ता ने कई पैकेज से इन सुविधाओं के डुप्लीकेट शामिल करने का विकल्प चुना है. साथ ही, यह उपयोगकर्ता को इनमें से किसी एक को चुनने के लिए कह रहा है.

लोकल ऐंकर और परसिस्टेंस

  • इसलिए, अब हम लोकल ऐंकर और पर्सिस्टेंस के बारे में बात करते हैं.

  • ऐंकर यह पक्का करते हैं कि डिजिटल कॉन्टेंट, आस-पास के माहौल में आपकी पसंद की जगहों पर बना रहे. भले ही, एआर सेशन की ट्रैकिंग की स्थिति में बदलाव हो.

  • एआर प्लैटफ़ॉर्म, समय के साथ ऐंकर की पोज़ को अपने-आप अपडेट करते हैं, ताकि यह पक्का किया जा सके कि वे एक ही पोज़ में रहें. साथ ही, ऐंकर यह पक्का करने का सबसे अच्छा तरीका है कि अगर आप अपने ऐंकर से दूर जाते हैं और फिर वापस उसकी ओर आते हैं, तो आपका कॉन्टेंट अपनी जगह पर बना रहे.

  • अगर उपयोगकर्ता अपना ऐप्लिकेशन बंद करके, उसे बाद में फिर से चालू करता है और किसी अलग सेशन में वापस आता है, तो क्या होगा?

  • परसिस्टेंट ऐंकर की मदद से, किसी एआर सेशन में ऐंकर सेव किए जा सकते हैं. इसके बाद, उन्हें बाद के सेशन में लोड किया जा सकता है.

  • ये ऐप्लिकेशन के लाइफ़ साइकल और डिवाइस के रीस्टार्ट होने के बाद भी बने रहते हैं.

  • यहां AR Foundation Samples प्रोजेक्ट में, परसिस्टेंट ऐंकर का सैंपल दिखाया गया है.

  • सैंपल सीन में एक मेन्यू होता है. इसमें उस प्लैटफ़ॉर्म पर काम करने वाली सभी सुविधाएं मौजूद होती हैं. जैसे, ऐंकर सेव करना और लोड करना.

  • अब बात करते हैं परसिस्टेंट ऐंकर की लाइफ़ साइकल की.

  • सबसे पहले, आपको डिवाइस पर एक ऐंकर बनाना होगा. यह ऐंकर अभी कहीं भी सेव नहीं किया गया है. यह स्थायी स्टोरेज में सेव नहीं किया गया है, बल्कि यह सिर्फ़ एक लोकल ऐंकर है.

  • इसके बाद, इसे स्टोरेज में सेव किया जाता है.

  • इसके बाद, ऐप्लिकेशन को रीस्टार्ट करें और फिर उसे स्टोरेज से लोड करें.

  • Android XR जैसे कुछ प्लैटफ़ॉर्म, ऐंकर मिटाने या उन्हें सेव न करने की सुविधा भी देते हैं.

  • स्पेशल एंटिटी प्रोवाइडर, सेव किए गए सभी ऐंकर को अपने-आप लोड करने की सुविधा देता है. इससे आपको हर ऐंकर के आईडी का इस्तेमाल करके, मैन्युअल तरीके से अनुरोध करने की ज़रूरत नहीं पड़ती.

  • XR प्लग-इन मैनेजमेंट की सेटिंग में जाकर, Spatial Entities: Anchors सुविधा पर, सेव किए गए ऐंकर अपने-आप लोड होने का विकल्प चुना जा सकता है.

  • ऐंकर को सेव करने के लिए, कोड की कुछ ही लाइनों की ज़रूरत होती है.

  • सबसे पहले, हम Unity एडिटर में जाकर यह पक्का करते हैं कि आपका सीन तैयार है. इसके लिए, हम आपके XR Origin गेम ऑब्जेक्ट में एआर ऐंकर मैनेजर कॉम्पोनेंट जोड़ते हैं.

  • मैनेजर, रन-टाइम से ट्रैक किए गए ऐंकर की मदद से सीन को अपडेट रखता है.

  • अब बात करते हैं कोड की.

  • एंकर जोड़ने के लिए, TryAddAnchorAsync को कॉल करें और उस पोज़ को पास करें जहां आपको अपना एंकर रखना है.

    async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
        var result = await manager.TryAddAnchorAsync(pose);
        if (result.status.IsError()) {
            // handle error
            return;
        }
        var anchor = result.value;
    }
  • इसके बाद, हम ऐंकर हटाने के बारे में बात करेंगे.

    void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
        var result = manager.TryRemoveAnchor(anchor.trackableId);
        if (result.status.IsError()) {
            // handle error
            return;
        }
    }
    
    void DestroyAnchorComponent(ARAnchor anchor) {
        Destroy(anchor);
    }
  • इसी तरह, यह भी सिर्फ़ एक लाइन का कोड है.

  • TryRemoveAnchor को कॉल करें और ऐंकर का ट्रैक किया जा सकने वाला आईडी पास करें.

  • ऐंकर बनाते समय, उसे पहले ही ट्रैक किया जा सकने वाला आईडी दिया गया था.

  • इसके बाद, हमारे पास TrySaveAnchorAsync है.

    async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
        var result = await manager.TrySaveAnchorAsync(anchor);
        if (result.status.IsError()) {
            // handle error
            return;
        }
    
        // Save this value, then return it as an input parameter
        SerializableGuid guid = result.value;
    }
  • इनपुट के तौर पर एआर ऐंकर पास करें.

  • यह फ़ंक्शन एक SerializableGuid दिखाता है, जो स्थायी स्टोरेज में ऐंकर की पहचान करता है.

  • बाद में, ऐंकर लोड करते समय जीयूआईडी का इस्तेमाल किया जा सकता है.

  • अब बात करते हैं लोडिंग ऐंकर की.

    async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
        var result = await manager.TryLoadAnchorAsync(guid);
        if (result.status.IsError()) {
            // handle error
            return;
        }
    
        ARAnchor anchor = result.value;
    }
  • यहां कॉल करने के लिए फ़ंक्शन TryLoadAnchorAsync है. साथ ही, आपको पहले से मौजूद सीरियलाइज़्ड GUID को पास करना होगा.

  • नतीजे के तौर पर, यह एआर ऐंकर दिखाएगा.

  • बस इतना ही.

  • इन फ़ंक्शन की मदद से, लोकल और परसिस्टेंट ऐंकर, दोनों को आसानी से मैनेज किया जा सकता है.

  • इसलिए, ज़्यादातर एआर प्लैटफ़ॉर्म पर ऐंकर ट्रैकिंग काफ़ी महंगा टास्क है.

  • ऐंकर के साथ काम करते समय, इन सबसे सही तरीकों को अपनाएं: एक-दूसरे के बहुत करीब कई ऐंकर बनाने से बचें. साथ ही, यह देखें कि क्या कोई दूसरा ऐंकर बनाने के बजाय, आस-पास मौजूद किसी ऐंकर का इस्तेमाल किया जा सकता है. जब ऐंकर का इस्तेमाल न किया जा रहा हो, तो उन्हें हटा दें. इसके अलावा, अगर आपने ऐंकर के लिए सही पोज़ का पता लगाने के लिए, कोई दूसरी एआर सुविधा चालू की है, तो देखें कि ऐंकर बन जाने के बाद, उस सुविधा को बंद किया जा सकता है या नहीं.

  • अब मैं लेवाना को बुलाना चाहूँगी.

Unity के लिए Android XR SDK

  • धन्यवाद, जेनिफ़र.

  • अब हम आपको Unity में Android XR के सफ़र में Google के योगदान के बारे में बताएंगे.

  • इसलिए, जेनिफ़र ने अब तक जिन Unity OpenXR प्लग इन के बारे में बताया है उनके अलावा, Google, Unity के लिए Android XR SDK टूल उपलब्ध कराता है. इसमें Android XR प्लैटफ़ॉर्म पर उपलब्ध अतिरिक्त सुविधाएं भी शामिल हैं.

  • इस SDK टूल में कई सुविधाएं और पैकेज शामिल हैं. इस बातचीत में, हम Unity पैकेज के लिए Android XR एक्सटेंशन पर फ़ोकस करेंगे.

  • इसलिए, OpenXR Android XR और OpenXR Spatial Entities की तरह, Android XR Extension for Unity पैकेज भी OpenXR की सुविधा देता है.

  • इस पैकेज का आर्किटेक्चर कुछ ऐसा दिखता है. ये दोनों पैकेज, एक साथ या अलग-अलग काम कर सकते हैं.

  • इसलिए, OpenXR की सेवा देने वाली अन्य कंपनियों की तरह, Google का पैकेज भी सीधे तौर पर स्टैंडर्ड OpenXR इंटरफ़ेस पर बनाया गया है.

  • इसलिए, यहां हमने इंटरनेट सेवा देने वाली अन्य कंपनियों की तुलना में, कई सुविधाओं के बारे में बताया है.

  • इसलिए, आपको यह तय करने में मदद मिल सकती है कि कब और क्यों एक को दूसरे के मुकाबले चुनना चाहिए.

  • इसलिए, इस टेबल में दिखाए गए ट्रैक किए जा सकने वाले और स्पेशल एंटिटी मार्कर के बारे में आपका कोई सवाल हो सकता है.

  • एक और बात: जिन लोगों ने पहले से ही Android XR पर ऐप्लिकेशन और अनुभव बनाए हैं उनके लिए, हमने ये सुविधाएं एक्सटेंशन के ज़रिए उपलब्ध कराई हैं. ये एक्सटेंशन, सिर्फ़ Android XR पर काम करते हैं.

  • इसके बाद, जैसा कि जेनिफ़र ने बताया, OpenXR ओपन ग्रुप के तौर पर काम किया और फिर दाईं ओर Spatial Entities Extension को रिलीज़ किया. साथ ही, एक जैसा और क्रॉस-प्लैटफ़ॉर्म अनुभव दिया.

  • फ़िलहाल, हम ट्रैक किए जा सकने वाले एक्सटेंशन को बंद कर रहे हैं, ताकि Spatial Entities फ़्रेमवर्क का इस्तेमाल किया जा सके.

  • यह न सिर्फ़ बेहतर परफ़ॉर्मेंस देता है, बल्कि क्रॉस-प्लैटफ़ॉर्म के साथ भी काम करता है.

स्पेशल एंटिटी की मदद से वर्चुअल दुनिया बनाना

  • इसके बाद, आइए स्पेशल इकाइयों के बारे में ज़्यादा जानें.

  • जेनिफ़र ने प्लेन, रे कास्टिंग, और ऐंकर के बारे में बताया है. इनके अलावा, यह सुविधा स्पेशल एंटिटी प्रोवाइडर के साथ भी काम करती है. जैसे, मार्कर, जो स्टैंडर्ड 2D बारकोड का पता लगा सकते हैं और उन्हें डिकोड कर सकते हैं. साथ ही, 3D स्पेस में उनकी पोज़िशन को ट्रैक कर सकते हैं. इसके अलावा, इमेज, जाने-पहचाने 2D ग्राफ़िक की पहचान करेगी और उन्हें 3D स्पेस में ट्रैक करेगी.

  • इसके बाद, बाउंडिंग बॉक्स, कीबोर्ड, लैपटॉप या माउस जैसे फ़िज़िकल ऑब्जेक्ट की पहचान करेगा. साथ ही, 3D पोज़ में उनके बाउंडिंग बॉक्स को ट्रैक करेगा.

  • अगले उदाहरण में, हम Google के एक्सटेंशन पैकेज में मौजूद बाउंडिंग बॉक्स की सुविधा को कॉन्फ़िगर करेंगे.

  • इसलिए, OpenXR की सभी सुविधाओं के लिए यह व्यू काफ़ी हद तक एक जैसा है.

  • इसलिए, आपको सबसे पहले Android XR प्लैटफ़ॉर्म पर स्विच करना होगा. इसके बाद, OpenXR प्रोवाइडर को चालू करें और वह OpenXR सुविधा चुनें जिसका इस्तेमाल करके आपको ऐप्लिकेशन बनाना है. उदाहरण के लिए, यहां स्पेशल एंटिटी बाउंडिंग बॉक्स की सुविधा दिखाई गई है. इसके बाद, प्रोजेक्ट की पुष्टि से जुड़ी समस्याएं ठीक करें.

  • इससे आपको किसी सुविधा के लिए ज़रूरी सभी डिपेंडेंसी ढूंढने में मदद मिलेगी. इसके बाद, एक ही सब-सिस्टम में कई सुविधाओं के योगदान की वजह से होने वाली समस्याओं को हल किया जा सकेगा.

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

  • आखिर में, सैंपल सीन या टेस्ट सीन बनाया जा सकता है.

  • रन टाइम के दौरान, ट्रैक किए जा सकने वाले ऑब्जेक्ट को ऐक्सेस करने के लिए, एआर बाउंडिंग बॉक्स मैनेजर कॉम्पोनेंट को जोड़ें. यह एआर ऐंकर मैनेजर जैसा ही कॉम्पोनेंट है. इसके बाद, इसे ऐक्सेस करने के लिए एआर फ़ाउंडेशन इंटरफ़ेस का इस्तेमाल करें.

  • इसके अलावा, हमारे एक्सटेंशन पैकेज से मिले स्पेशल एंटिटी सैंपल को टेंप्लेट के तौर पर इंपोर्ट करके भी शुरुआत की जा सकती है.

  • Android XR पर AR Foundation की सुविधा का इस्तेमाल करने पर, यह मुख्य अंतर दिखता है.

  • उपयोगकर्ता के आस-पास के माहौल को समझने के लिए, आपके ऐप्लिकेशन को आम तौर पर आस-पास के माहौल से जुड़े संवेदनशील डेटा के ऐक्सेस की ज़रूरत होती है.

  • उपयोगकर्ता की निजता को सुरक्षित रखने के लिए, Android XR सिस्टम को डेटा ऐक्सेस करने से रोकता है. इसके लिए, अनुमतियों की ज़रूरत होती है.

  • आपको शायद इसके बारे में पहले से पता हो. जैसे, Android की सामान्य अनुमति कॉल, जैसे कि कैमरे का ऐक्सेस या जगह की जानकारी का ऐक्सेस वगैरह.

  • इसके बाद, सबसे सही तरीका यह है कि स्टार्टअप के समय मैनेजर कॉम्पोनेंट को बंद कर दें. इसके लिए, एडिटर का इस्तेमाल करें, जैसा कि दाईं ओर देखा जा सकता है. इसके अलावा, स्क्रिप्ट का इस्तेमाल करें, जैसे कि Awake इवेंट.

    void Awake() {
        planeManager = GetComponent<ARPlaneManager>();
        planeManager.enabled = false;
        boundingBoxManager = GetComponent<ARBoundingBoxManager>();
        boundingBoxManager.enabled = false;
        permissionUtil = GetComponent<AndroidXRPermissionUtil>();
    }
    
    void OnEnable() {
        StartCoroutine(WaitForPermissions());
    }
  • सभी ज़रूरी अनुमतियां देने के बाद, स्क्रिप्ट से मैनेजर को चालू किया जा सकता है. ठीक वैसे ही जैसे WaitForPermissions हेल्पर यहां करता है.

    IEnumerator WaitForPermissions() {
        planeManager.enabled = false;
        boundingBoxManager.enabled = false;
    
        yield return new WaitUntil(() =>
            permissionUtil.AllPermissionGranted());
    
        // Enable after granted permissions and
        // restart subsystems.
        planeManager.enabled = true;
        boundingBoxManager.enabled = true;
    
        // Save permission status.
        permissionGranted = true;
    }
  • ऐसा करने से, ज़रूरी अनुमति न होने की वजह से सबसिस्टम के शुरू न होने की समस्या से बचा जा सकता है.

  • यह इस जगह की एक खास सुविधा है.

  • जैसा कि जेनिफ़र ने हमें AR Foundation का इस्तेमाल करके ऐंकर के बारे में बताया, Android XR पर ऐंकर की क्षमता बढ़ाने के लिए, हमारे पैकेज में शेयर किए जा सकने वाले ऐंकर की नई सुविधा भी शामिल है.

  • यह सुविधा, AR Foundation की ऐंकर सुविधा की तरह ही काम करती है. साथ ही, इसमें कुछ अतिरिक्त सुविधाएं भी मिलती हैं. जैसे, जियोस्पेशल ऐंकर.

  • जैसा कि आप सोच सकते हैं, ऐंकर वर्चुअल और असल दुनिया को जोड़ने वाला असली पुल है.

  • जेनिफ़र ने हमें इन्हें बनाने, सेव करने, और लोड करने का तरीका बताया. हालांकि, यह सब लोकल स्पेस में हुआ, जैसे कि आपके उपयोगकर्ता का लिविंग रूम.

  • हालांकि, दुनिया के बाकी देशों या इलाकों का क्या?

  • हम इसे एक-दूसरे के साथ कैसे शेयर कर सकते हैं?

Geospatial API

  • यहीं पर Geospatial API काम आता है.

  • इसकी मदद से, असल दुनिया की किसी जगह के आधार पर जियोस्पेशल ऐंकर बनाया जा सकता है. जैसे, आपकी पसंदीदा किताबों की दुकान या किसी बड़े पार्क में मीटिंग की जगह.

  • इसलिए, जियोस्पेशल एपीआई आपको वीपीएस के ज़रिए सटीक जियोपोज़िशनल ट्रैकर दे सकता है. इसे वर्चुअल पोज़िशनिंग सिस्टम भी कहा जाता है. यह जीपीएस की तरह ही होता है, लेकिन यह ज़्यादा सटीक ट्रैकिंग नतीजे देने के लिए, आउटडोर Street View डेटा का इस्तेमाल करता है.

  • इसलिए, हो सकता है कि आप में से कुछ लोग इस व्यू के बारे में पहले से जानते हों. ऐसा तब हो सकता है, जब आपने पहले ARCore की जियोस्पेशल सुविधा का इस्तेमाल किया हो.

  • इसलिए, Android XR पर Geospatial API को ऐक्सेस करने के लिए, हमें सबसे पहले Google Cloud प्लैटफ़ॉर्म पर होस्ट किए गए बैकएंड से कनेक्ट करना होगा.

  • जियोस्पेशल बैकएंड, Google Cloud पर ARCore सेवा से काम करता है. इसलिए, ARCore API के ऐक्सेस के साथ अपने Google Cloud प्रोजेक्ट को कॉन्फ़िगर करने के लिए, बिलकुल यही तरीका अपनाया जा सकता है.

  • इसके बाद, Android XR Google Cloud की सुविधा का इस्तेमाल किया जा सकेगा. यह सुविधा, हमारे एक्सटेंशन पैकेज से मिलती है.

  • Geospatial API को चालू करने और Google Cloud प्रोजेक्ट से एपीआई पासकोड लेने के बाद, इस सुविधा को चालू किया जा सकता है. साथ ही, OpenXR सेटिंग मेन्यू की मदद से पुष्टि करने की सुविधा को कॉन्फ़िगर किया जा सकता है. इसके लिए, यहां दिए गए तरीके का इस्तेमाल करें. इसके अलावा, TrySetAuthenticationAsync नाम के स्क्रिप्टिंग एपीआई की मदद से, इसे मैन्युअल तरीके से कॉन्फ़िगर किया जा सकता है.

    async Task TrySetAuthentication() {
        googleCloudFeature =
            OpenXRSettings.Instance
                .GetFeature<XRGoogleCloudFeature>();
        var result = await googleCloudFeature
            .TrySetAuthenticationAsync(
                strategy, credential);
        if (result.IsSuccess()) {
            // Ready to use for geospatial tracker.
        } else if (result.IsUnsupported())  {
            // Google Cloud feature is not supported
        } else if (result.IsKeylessError()) {
            // Confirm if keyless has been set up properly.
        } else {
            // Handling other common OpenXR errors.
        }
    }
  • ध्यान दें कि फ़िलहाल Android XR प्लैटफ़ॉर्म पर, पुष्टि करने के लिए सिर्फ़ एपीआई पासकोड का इस्तेमाल किया जा सकता है. हालांकि, आने वाले समय में क्रेडेंशियल के अन्य तरीके भी उपलब्ध होंगे.

  • इसलिए, पुष्टि करने के बाद, जियोस्पेशल मैनेजर का इस्तेमाल करके जियोस्पेशल सुविधाओं को ऐक्सेस किया जा सकता है.

  • हमारा सुझाव है कि इंटिग्रेशन से पहले, Google Maps पर वीपीएस कवरेज की जांच कर लें.

  • इसलिए, इस सुविधा का इस्तेमाल करते समय आपके पास इंटरनेट ऐक्सेस भी होना चाहिए.

  • इसलिए, XR Geospatial Manager, AR Foundation के AR Session कॉम्पोनेंट की तरह ही काम करता है.

  • इसलिए, इसमें स्टैटिक स्टेट प्रॉपर्टी होती है, जो सिस्टम के साथ काम करने की क्षमता और जियोस्पेशल ट्रैकर की ट्रैकिंग स्थिति के बारे में बताती है.

  • इस तरह के कॉलबैक की मदद से, स्थिति में बदलाव वाले इवेंट को रजिस्टर किया जा सकता है.

    void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
        bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
        if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
            // Handle cloud authentication issues.
        } else if (isInitFailed) {
            // Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
        } else {
            // Iterate runtime state change, and handle accordingly.
        }
    }
    
    private void OnEnable() {
        XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
    }
  • जियोस्पेशल स्टेट के चालू होने के बाद, इस मैनेजर इंस्टेंस का इस्तेमाल इन सभी फ़ंक्शन के लिए किया जा सकता है.

  • सबसे पहले, दी गई जीपीएस लोकेशन के साथ वीपीएस की उपलब्धता की जांच करने के लिए, हम जीपीएस वैल्यू पाने के लिए Unity के लोकेशन एपीआई का इस्तेमाल करते हैं. इसके बाद, वीपीएस की उपलब्धता की जांच करते हैं.

    async Task CheckVPSAvailability(CancellationToken token) {
        var location = Input.location.lastData;
        try {
            var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
                location.latitude, location.longitude);
            token.ThrowIfCancellationRequested();
            if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
                // Invalid coordinates, try with another location.
            } else if (result.status.IsError()) {
                // Handle common OpenXR error: result.status.ToOpenXRStatus()
            }  else if (result.value == XRVPSAvailability.Available)  {
                // You may use this pose to attach geospatial anchors.
                var currentGeospatialPose = new XRGeospatialPose(location);
            }
        }
    }
  • इसलिए, अगर आपको मैप की मदद से वीपीएस की सुविधा की जांच नहीं करनी है, तो यह एक विकल्प है. हालांकि, जीपीएस की असल स्थिति की जांच करने के लिए, आपको बाहर जाना होगा.

  • इसके बाद, TryLocate का इस्तेमाल करके, पोज़ को Unity पोज़ और जियोस्पेशल पोज़ के बीच बदला जा सकता है.

    // Geospatial Pose -> Unity Pose
    var geospatialPose =
        new XRGeospatialPose(Input.location.lastData);
    if (geospatialManager.TryLocate(
            geospatialPose, out XRPoseResult result)) {
        if (result.IsPositionValid ||
            result.IsPositionTracked) {
            transform.position = result.Pose.position;
        }
        if (result.IsRotationValid ||
            result.IsRotationTracked) {
            transform.rotation = result.Pose.rotation;
        }
    }
    // Unity Pose -> Geospatial Pose
    Pose pose = new Pose(
        transform.position, transform.rotation);
    if (geospatialManager.TryLocate(
          pose, out XRGeospatialPoseResult result)) {
        if (result.IsPositionValid ||
            result.IsRotationValid) {
            // You may use for anchor attachment.
        }
    }
  • वीपीएस की जांच या पोज़ कन्वर्ज़न से मिले नतीजे का इस्तेमाल करके, स्पेशल ऐंकर को किसी दिए गए जियोस्पेशल पोज़ या किसी जाने-पहचाने प्लैटफ़ॉर्म टाइप से अटैच किया जा सकता है. जैसे, ज़मीन या छत.

    async void PlaceAnchor(XRGeospatialPose pose) {
        try {
            Result<ARShareableAnchor> anchorResult;
            XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
            if (typeToPlace == XRGeospatialSurfaceType.Default) {
                anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
            } else {
                pose.Altitude = 0;
                anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
            }
            if (anchorResult.status.IsSuccess()) {
                // ARShareableAnchorManager will track the anchor and update it.
            } else {
                // Handle OpenXR failures.
            }
        }
    }
  • इन सभी को एक साथ इस्तेमाल करके, असल दुनिया को सामने और सेंटर में रखकर, कुछ शानदार स्पेशल एक्सपीरियंस बनाए जा सकते हैं.

  • इसलिए, हम यहां एक ऐरो दिखाते हैं, ताकि ऑडियंस को असल दुनिया में टारगेट की गई जगह पर जाने में मदद मिल सके.

  • ठीक है।

  • इसलिए, Android XR SDK ही एकमात्र पैकेज नहीं है जो हमने Unity डेवलपर को उपलब्ध कराया है.

  • Unity के लिए Google के Android XR SDK में, अब Android XR इंटरैक्शन फ़्रेमवर्क और Android XR ऑडियो पैकेज भी शामिल है.

  • हमें यह बताते हुए बेहद खुशी हो रही है कि हम Android XR SDK में और सुविधाएं जोड़ रहे हैं. साथ ही, इसमें ज़्यादा स्पेशल एंटिटी भी शामिल कर रहे हैं.

आखिरी जानकारी और संसाधन

  • ठीक है, तो अब हम सेशन के आखिर में पहुंच गए हैं.

  • Unity के रोडमैप को ऑनलाइन फ़ॉलो करके, यह देखा जा सकता है कि आगे क्या होने वाला है.

  • यह न भूलें कि अगले साल की शुरुआत में, Unity का अगला वर्शन Unity 7 लॉन्च होने वाला है.

  • इस बीच, इन टूल को आज़माएं और मिक्स्ड रिएलिटी टेंप्लेट का इस्तेमाल करके कोई प्रोजेक्ट बनाएं. इसके अलावा, हमारे GitHub पर एआर फ़ाउंडेशन के सैंपल प्रोजेक्ट देखें.

  • स्पेशल एंटिटी और Unity पैकेज के साथ काम करने की सुविधा के बारे में ज़्यादा जानने के लिए, Android डेवलपर साइट पर जाएं.

  • इसके बाद, आप सभी का धन्यवाद.

  • हमें यह देखने का बेसब्री से इंतज़ार है कि Android XR पर AR Foundation और Spatial Entity का इस्तेमाल करके, क्या-क्या बनाया जा सकता है.

कोड

कोड स्निपेट

"लोकल ऐंकर और पर्सिस्टेंस" में 10:34 पर C# स्निपेट
async void CreateAnchorAsync(ARAnchorManager manager, Pose pose) {
    var result = await manager.TryAddAnchorAsync(pose);
    if (result.status.IsError()) {
        // handle error
        return;
    }
    var anchor = result.value;
}
"लोकल ऐंकर और पर्सिस्टेंस" में 10:43 पर C# स्निपेट
void RemoveAnchor(ARAnchorManager manager, ARAnchor anchor) {
    var result = manager.TryRemoveAnchor(anchor.trackableId);
    if (result.status.IsError()) {
        // handle error
        return;
    }
}

void DestroyAnchorComponent(ARAnchor anchor) {
    Destroy(anchor);
}
"लोकल ऐंकर और पर्सिस्टेंस" में 11:00 पर C# स्निपेट
async void SaveAnchorAsync(ARAnchorManager manager, ARAnchor anchor) {
    var result = await manager.TrySaveAnchorAsync(anchor);
    if (result.status.IsError()) {
        // handle error
        return;
    }

    // Save this value, then return it as an input parameter
    SerializableGuid guid = result.value;
}
"लोकल ऐंकर और पर्सिस्टेंस" में 11:17 पर C# स्निपेट
async void LoadAnchorAsync(ARAnchorManager manager, SerializableGuid guid) {
    var result = await manager.TryLoadAnchorAsync(guid);
    if (result.status.IsError()) {
        // handle error
        return;
    }

    ARAnchor anchor = result.value;
}
"स्पेशल एंटिटी की मदद से ऐप्लिकेशन बनाना" में 16:45 पर C# स्निपेट
void Awake() {
    planeManager = GetComponent<ARPlaneManager>();
    planeManager.enabled = false;
    boundingBoxManager = GetComponent<ARBoundingBoxManager>();
    boundingBoxManager.enabled = false;
    permissionUtil = GetComponent<AndroidXRPermissionUtil>();
}

void OnEnable() {
    StartCoroutine(WaitForPermissions());
}
"स्पेशल एंटिटी की मदद से ऐप्लिकेशन बनाना" में 16:58 पर C# स्निपेट
IEnumerator WaitForPermissions() {
    planeManager.enabled = false;
    boundingBoxManager.enabled = false;

    yield return new WaitUntil(() =>
        permissionUtil.AllPermissionGranted());

    // Enable after granted permissions and
    // restart subsystems.
    planeManager.enabled = true;
    boundingBoxManager.enabled = true;

    // Save permission status.
    permissionGranted = true;
}
"Geospatial API" में 19:12 पर C# स्निपेट
async Task TrySetAuthentication() {
    googleCloudFeature =
        OpenXRSettings.Instance
            .GetFeature<XRGoogleCloudFeature>();
    var result = await googleCloudFeature
        .TrySetAuthenticationAsync(
            strategy, credential);
    if (result.IsSuccess()) {
        // Ready to use for geospatial tracker.
    } else if (result.IsUnsupported())  {
        // Google Cloud feature is not supported
    } else if (result.IsKeylessError()) {
        // Confirm if keyless has been set up properly.
    } else {
        // Handling other common OpenXR errors.
    }
}
"Geospatial API" में 20:24 पर C# स्निपेट
void OnGeospatialStateChanged(XRGeospatialStateChangedEventArgs eventArgs) {
    bool isInitFailed = eventArgs.CurrState == XRGeospatialState.InitializationFailed;
    if (isInitFailed && XRGeospatialManager.InitializationResult.IsCloudAuthError()) {
        // Handle cloud authentication issues.
    } else if (isInitFailed) {
        // Check XRGeospatialManager.InitializationResult for other common OpenXR errors.
    } else {
        // Iterate runtime state change, and handle accordingly.
    }
}

private void OnEnable() {
    XRGeospatialManager.OnStateChanged += OnGeospatialStateChanged;
}
"Geospatial API" में 20:38 पर C# स्निपेट
async Task CheckVPSAvailability(CancellationToken token) {
    var location = Input.location.lastData;
    try {
        var result = await geospatialManager.TryCheckVPSAvailabilityAsync(
            location.latitude, location.longitude);
        token.ThrowIfCancellationRequested();
        if (result.status.nativeStatusCode == (int)XrResultAndroid.GeospatialCoordinateInvalid) {
            // Invalid coordinates, try with another location.
        } else if (result.status.IsError()) {
            // Handle common OpenXR error: result.status.ToOpenXRStatus()
        }  else if (result.value == XRVPSAvailability.Available)  {
            // You may use this pose to attach geospatial anchors.
            var currentGeospatialPose = new XRGeospatialPose(location);
        }
    }
}
"Geospatial API" में 21:03 पर C# स्निपेट
// Geospatial Pose -> Unity Pose
var geospatialPose =
    new XRGeospatialPose(Input.location.lastData);
if (geospatialManager.TryLocate(
        geospatialPose, out XRPoseResult result)) {
    if (result.IsPositionValid ||
        result.IsPositionTracked) {
        transform.position = result.Pose.position;
    }
    if (result.IsRotationValid ||
        result.IsRotationTracked) {
        transform.rotation = result.Pose.rotation;
    }
}
"Geospatial API" में 21:03 पर C# स्निपेट
// Unity Pose -> Geospatial Pose
Pose pose = new Pose(
    transform.position, transform.rotation);
if (geospatialManager.TryLocate(
      pose, out XRGeospatialPoseResult result)) {
    if (result.IsPositionValid ||
        result.IsRotationValid) {
        // You may use for anchor attachment.
    }
}
"Geospatial API" में 21:11 पर C# स्निपेट
async void PlaceAnchor(XRGeospatialPose pose) {
    try {
        Result<ARShareableAnchor> anchorResult;
        XRGeospatialSurfaceType typeToPlace = /* Choose your target type */;
        if (typeToPlace == XRGeospatialSurfaceType.Default) {
            anchorResult = geospatialManager.TryAttachGeospatialAnchor(pose);
        } else {
            pose.Altitude = 0;
            anchorResult = await geospatialManager.TryAttachSurfaceAnchorAsync(typeToPlace, pose);
        }
        if (anchorResult.status.IsSuccess()) {
            // ARShareableAnchorManager will track the anchor and update it.
        } else {
            // Handle OpenXR failures.
        }
    }
}