Unity पर असल दुनिया के कॉन्टेंट की जगह तय करने के लिए, जियोस्पेशियल ऐंकर का इस्तेमाल करें

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

अलग-अलग तरह के जियोस्पेशियल ऐंकर

जियोस्पेशियल ऐंकर तीन तरह के होते हैं. इनमें से हर ऐंकर अलग-अलग तरह से ऊंचाई को हैंडल करता है:

  1. WGS84 ऐंकर:
    WGS84 ऐंकर से, किसी भी दिए गए अक्षांश पर 3D कॉन्टेंट रखा जा सकता है, देशांतर और ऊंचाई तक पहुंचने की सुविधा देते हैं.

  2. इलाके के ऐंकर:
    इलाके वाले ऐंकर से, सिर्फ़ अक्षांश और देशांतर का इस्तेमाल करके कॉन्टेंट दिखाया जा सकता है उस जगह की स्थिति के हिसाब से ऊंचाई वाला देशांतर. ऊंचाई को भूतल या तल के सापेक्ष ज्ञात किया जाता है VPS की मदद से.

  3. छत पर मौजूद ऐंकर:
    छत पर मौजूद ऐंकर से, सिर्फ़ अक्षांश और देशांतर का इस्तेमाल करके कॉन्टेंट दिखाया जा सकता है किसी इमारत की छत से जुड़ी ऊंचाई के साथ देशांतर. ऊंचाई किसी इमारत की चोटी के हिसाब से तय की जाती है जिसे Streetscape Geometry से मिले. किसी इमारत पर न डाले जाने पर यह डिफ़ॉल्ट रूप से इलाके की ऊंचाई पर सेट हो जाएगा.

WGS84 इलाका छत का ऊपरी हिस्सा
हॉरिज़ॉन्टल पोज़िशन अक्षांश, देशांतर अक्षांश, देशांतर अक्षांश, देशांतर
लंबवत स्थिति WGS84 ऊंचाई के सापेक्ष Google Maps के तय किए गए इलाके के स्तर के सापेक्ष Google Maps की ओर से तय किए गए छत के स्तर के आधार पर
क्या सर्वर से जुड़ी समस्या का हल चाहिए? नहीं हां हां

ज़रूरी शर्तें

आगे बढ़ने से पहले, पक्का करें कि आपने Geospatial API चालू किया है.

जियोस्पेशल ऐंकर लगाएं

हर तरह के ऐंकर में इन्हें बनाने के लिए, खास एपीआई होते हैं; ज़्यादा जानकारी के लिए, जियोस्पेशियल ऐंकर के टाइप देखें.

हिट-टेस्ट से ऐंकर बनाना

हिट-टेस्ट के नतीजे से भी जियोस्पेशियल ऐंकर बनाया जा सकता है. हिट-टेस्ट के पोज़ का इस्तेमाल करें और उसे GeospatialPose में बदलें. इसका इस्तेमाल, बताए गए तीन तरह के ऐंकर के लिए करें.

एआर पोज़ की मदद से, जियोस्पेशियल पोज़ पाएं

AREarthManager.Convert(Pose), एआर पोज़ को जियोस्पेशल पोज़ में बदलकर, अक्षांश और देशांतर को तय करने का एक और तरीका देता है.

जियोस्पेशल पोज़ की मदद से एआर पोज़ पाएं

AREarthManager.Convert(GeospatialPose) जीएल वर्ल्ड कोऑर्डिनेट के हिसाब से, पूर्व-ऊपर दक्षिण कोऑर्डिनेट फ़्रेम के हिसाब से, पृथ्वी के हिसाब से तय की गई हॉरिज़ॉन्टल पोज़िशन, ऊंचाई, और क्वाटर्नियन रोटेशन को एआर पोज़ में कन्वर्ट करता है.

अपने इस्तेमाल के हिसाब से सही तरीका चुनना

ऐंकर बनाने के हर तरीके में कुछ समस्याएं हैं, जिन्हें ध्यान में रखना चाहिए:

  • स्ट्रीटस्केप ज्यामिति का इस्तेमाल करते समय, किसी बिल्डिंग में कॉन्टेंट जोड़ने के लिए हिट-टेस्ट का इस्तेमाल करना.
  • WGS84 ऐंकर के ऊपर, इलाके या छत के ऊपर दिखने वाले ऐंकर को प्राथमिकता दें, क्योंकि वे Google Maps से तय की गई ऊंचाई की वैल्यू का इस्तेमाल करते हैं.

किसी जगह का अक्षांश और देशांतर तय करना

किसी जगह के अक्षांश और देशांतर का हिसाब, तीन तरीकों से लगाया जा सकता है:

  • जियोस्पेशियल क्रिएटर का इस्तेमाल करके, दुनिया भर की जानकारी को 3D कॉन्टेंट से देखें और उसे बेहतर बनाएं. इसके लिए, आपको किसी जगह पर जाने की ज़रूरत नहीं है. इसकी मदद से, Unity एडिटर में Google Maps का इस्तेमाल करके, इमर्सिव 3D कॉन्टेंट को विज़ुअल तौर पर दिखाया जा सकता है. आपके लिए कॉन्टेंट के अक्षांश, देशांतर, रोटेशन, और ऊंचाई की गिनती अपने-आप हो जाएगी.
  • Google मैप का उपयोग करें
  • Google Earth का इस्तेमाल करें. ध्यान दें कि Google Maps के उलट, Google Earth का इस्तेमाल करके ये निर्देशांक हासिल करने पर आपको कई मीटर तक का गड़बड़ी का मार्जिन मिलेगा.
  • कारोबार की जगह पर जाएं

Google मैप का उपयोग करें

Google Maps का इस्तेमाल करके किसी जगह का अक्षांश और देशांतर जानने के लिए:

  1. अपने डेस्कटॉप कंप्यूटर पर Google Maps पर जाएं.

  2. लेयर पर जाएं > ज़्यादा.

  3. मैप टाइप को सैटलाइट में बदलें और स्क्रीन पर सबसे नीचे बाएं कोने में मौजूद ग्लोब व्यू चेकबॉक्स से सही का निशान हटाएं.

    यह 2D व्यू को ज़बरदस्ती दिखाएगा और कोण वाले 3D व्यू से आने वाली संभावित गड़बड़ियों को खत्म कर देगा.

  4. मैप पर, जगह की जानकारी पर राइट क्लिक करें और देशांतर/अक्षांश को अपने क्लिपबोर्ड पर कॉपी करने के लिए चुनें.

Google Earth का इस्तेमाल करना

Google Earth से जगह के अक्षांश और देशांतर का हिसाब लगाने के लिए, यूज़र इंटरफ़ेस (यूआई) में किसी जगह पर क्लिक करें और प्लेसमार्क की जानकारी से डेटा पढ़ें.

Google Earth का इस्तेमाल करके किसी जगह का अक्षांश और देशांतर जानने के लिए:

  1. अपने डेस्कटॉप कंप्यूटर पर, Google Earth पर जाएं.

  2. हैमबर्गर मेन्यू पर जाएं और मैप की शैली चुनें.

  3. 3D बिल्डिंग स्विच को बंद करें.

  4. 3D बिल्डिंग स्विच को बंद करने के बाद, चुनी गई जगह में प्लेसमार्क जोड़ने के लिए पिन आइकॉन पर क्लिक करें.

  5. अपना प्लेसमार्क शामिल करने के लिए कोई प्रोजेक्ट चुनें. इसके बाद, सेव करें पर क्लिक करें.

  6. प्लेसमार्क के लिए, Title फ़ील्ड में, प्लेसमार्क के लिए कोई नाम डालें.

  7. प्रोजेक्ट पैनल में, बैक ऐरो पर क्लिक करें और ज़्यादा कार्रवाइयां मेन्यू चुनें.

  8. मेन्यू से, KML फ़ाइल के तौर पर एक्सपोर्ट करें चुनें.

केएलएम फ़ाइल, <coordinates> टैग में मौजूद प्लेसमार्क के अक्षांश, देशांतर, और ऊंचाई के बारे में इस तरह रिपोर्ट करती है:

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

<LookAt> टैग से अक्षांश और देशांतर का इस्तेमाल करें. इससे कैमरे की पोज़िशन की जानकारी मिलती है, जगह की जानकारी नहीं.

कारोबार की जगह पर जाएं

किसी जगह पर खुद जाकर और स्थानीय ऑब्ज़र्वेशन करके, वहां की ऊंचाई देखी जा सकती है.

रोटेशन क्वाटर्नियन पाएं

GeospatialPose.EunRotation जियोस्पेशल पोज़ से ओरिएंटेशन निकालता है और एक क्वाटर्नियन देता है, जो ऐसे रोटेशन मैट्रिक्स को दिखाता है जो टारगेट से पूर्व-ऊपर-उत्तर (EUN) कोऑर्डिनेट सिस्टम में वेक्टर को बदलता है. X+ बिंदु पूर्व की ओर, Y+ बिंदु गुरुत्वाकर्षण से दूर, और Z+ उत्तर दिशा में इशारा करता है.

WGS84 ऐंकर

WGS84 ऐंकर, ऐंकर का एक टाइप है. इसकी मदद से, किसी भी दिए गए अक्षांश, देशांतर, और ऊंचाई पर 3D कॉन्टेंट रखा जा सकता है. असल दुनिया में दिखाने के लिए, यह पोज़ और ओरिएंटेशन पर निर्भर करता है. स्थिति में अक्षांश, देशांतर, और ऊंचाई शामिल होते हैं, जिनकी जानकारी WGS84 निर्देशांक सिस्टम में दी जाती है. ओरिएंटेशन में क्वाटरनियन रोटेशन होता है.

ऊंचाई को संदर्भ WGS84 दीर्घवृत्त के ऊपर मीटर में इस तरह से रिपोर्ट किया जाता है कि ज़मीन का स्तर शून्य पर नहीं हो. बनाए गए हर ऐंकर के लिए ये निर्देशांक उपलब्ध कराने की ज़िम्मेदारी आपका ऐप्लिकेशन की है.

असल दुनिया में WGS84 ऐंकर लगाएं

किसी जगह की ऊंचाई तय करना

ऐंकर लगाने के लिए, किसी जगह की ऊंचाई तय करने के कुछ तरीके यहां दिए गए हैं:

  • अगर ऐंकर की जगह असल में उपयोगकर्ता के आस-पास है, तो आपके पास उपयोगकर्ता के डिवाइस की ऊंचाई के बराबर की ऊंचाई का इस्तेमाल करने का विकल्प होता है.
  • अक्षांश और देशांतर की जानकारी पाने के बाद, EGM96 स्पेसिफ़िकेशन के हिसाब से ऊंचाई की जानकारी पाने के लिए, Eveation API का इस्तेमाल करें. GeospatialPose की ऊंचाई से तुलना करने के लिए, आपको Maps API EGM96 की ऊंचाई को WGS84 में बदलना होगा. GeoidEval देखें. इसमें कमांड लाइन और एचटीएमएल इंटरफ़ेस, दोनों हैं. Maps API, WGS84 स्पेसिफ़िकेशन के मुताबिक अक्षांश और देशांतर की जानकारी देता है.
  • Google Earth से किसी जगह के अक्षांश, देशांतर, और ऊंचाई की जानकारी पाई जा सकती है. इससे आपको गड़बड़ी का कुछ मीटर तक का मार्जिन मिलेगा. KML फ़ाइल में <coordinates> टैग, न कि <LookAt> टैग के अक्षांश, देशांतर, और ऊंचाई का इस्तेमाल करें.
  • अगर कोई मौजूदा ऐंकर आस-पास मौजूद है और अगर आप ज़्यादा चढ़ाई पर नहीं हैं, तो कैमरे की GeospatialPose ऊंचाई का इस्तेमाल किया जा सकता है. इसके लिए, Maps API जैसे किसी दूसरे सोर्स का इस्तेमाल नहीं किया जा सकता.

ऐंकर बनाना

अक्षांश, देशांतर, ऊंचाई, और रोटेशन क्वाटर्नियन होने के बाद, ARAnchorManagerExtensions.AddAnchor() का इस्तेमाल करें का इस्तेमाल, कॉन्टेंट को आपके तय भौगोलिक निर्देशांकों पर ऐंकर करने के लिए किया जाता है.

if (earthTrackingState == TrackingState.Tracking)
{
  var anchor =
      AnchorManager.AddAnchor(
          latitude,
          longitude,
          altitude,
          quaternion);
  var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

इलाके के ऐंकर

इलाके का ऐंकर ऐंकर का एक टाइप है. इसकी मदद से, सिर्फ़ अक्षांश और देशांतर का इस्तेमाल करके एआर ऑब्जेक्ट डाले जा सकते हैं. इसमें, VPS से मिली जानकारी का इस्तेमाल करके, ज़मीन के ऊपर मौजूद सटीक ऊंचाई का पता लगाया जा सकता है.

अपने हिसाब से ऊंचाई डालने के बजाय, इलाके के हिसाब से ऊंचाई की जानकारी दें. जब यह संख्या शून्य होगी, तो ऐंकर इलाके के हिसाब से दिखेगा.

हवाई जहाज़ ढूंढने का मोड सेट करें

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

ध्यान दें कि इलाके वाले ऐंकर पर Horizontal और Horizontal | Vertical का असर पड़ता है

पहचान मोड सेट करने के लिए पहचान मोड ड्रॉप-डाउन मेन्यू का इस्तेमाल करें:

नए एसिंक्रोनस एपीआई का इस्तेमाल करके इलाके का ऐंकर बनाएं

इलाका ऐंकर बनाने और लगाने के लिए, ARAnchorManagerExtensions.resolveAnchorOnTerrainAsync() को कॉल करें.

ऐंकर तुरंत तैयार नहीं होगा और इसे ठीक करना होगा. इस समस्या के ठीक होने के बाद, यह ResolveAnchorOnTerrainPromise में उपलब्ध होगा.

public GameObject TerrainAnchorPrefab;

public void Update()
{
    ResolveAnchorOnTerrainPromise terrainPromise =
        AnchorManager.ResolveAnchorOnTerrainAsync(
            latitude, longitude, altitudeAboveTerrain, eunRotation);

    // The anchor will need to be resolved.
    StartCoroutine(CheckTerrainPromise(terrainPromise));
}

private IEnumerator CheckTerrainPromise(ResolveAnchorOnTerrainPromise promise)
{
    yield return promise;

    var result = promise.Result;
    if (result.TerrainAnchorState == TerrainAnchorState.Success &&
        result.Anchor != null)
    {
        // resolving anchor succeeded
        GameObject anchorGO = Instantiate(TerrainAnchorPrefab,
            result.Anchor.gameObject.transform);
        anchorGO.transform.parent = result.Anchor.gameObject.transform;
    }
    else
    {
       // resolving anchor failed
    }

    yield break;
}

वादे की स्थिति की जांच करना

प्रॉमिस में एक PromiseState जुड़ा होगा.

स्थिति ब्यौरा
Pending कार्रवाई अब भी लंबित है.
Done कार्रवाई पूरी हो गई है और नतीजा उपलब्ध है.
Cancelled कार्रवाई रद्द कर दी गई है.

प्रॉमिस नतीजे में, इलाके के ऐंकर की स्थिति देखें

TerrainAnchorState एसिंक्रोनस कार्रवाई वाला है और प्रॉमिस के आखिरी नतीजे का हिस्सा है.

switch (result.TerrainAnchorState)
{
    case TerrainAnchorState.Success:
        // Anchor has successfully resolved
        break;
    case TerrainAnchorState.ErrorUnsupportedLocation:
        // The requested anchor is in a location that isn't supported by the Geospatial API.
        break;
    case TerrainAnchorState.ErrorNotAuthorized:
        // An error occurred while authorizing your app with the ARCore API. See
        // https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
        // for troubleshooting steps.
        break;
    case TerrainAnchorState.ErrorInternal:
        // The Terrain anchor could not be resolved due to an internal error.
        break;
    default:
        break;
}

रूफ़टॉप ऐंकर

रूफ़टॉप ऐंकर हीरो

छत पर लगे ऐंकर ऐंकर की तरह होते हैं. ये ऊपर दिए गए इलाके के ऐंकर की तरह होते हैं. अंतर यह है कि आप इलाके के ऊपर की ऊंचाई के बजाय छत से ऊपर की ऊंचाई देंगे.

नए Async API का इस्तेमाल करके, छत पर ऐंकर बनाएं

ऐंकर तुरंत तैयार नहीं होगा और इसे ठीक करना होगा.

छत पर ऐंकर बनाने और उसे लगाने के लिए, ARAnchorManagerExtensions.resolveAnchorOnRooftopAsync() को कॉल करें. इलाके के ऐंकर की तरह, प्रॉमिस के PromiseState को भी ऐक्सेस किया जा सकता है. इसके बाद, RooftopAnchorState को ऐक्सेस करने के लिए, प्रॉमिस का नतीजा देखा जा सकता है.

public GameObject RooftopAnchorPrefab;

public void Update()
{
    ResolveAnchorOnRooftopPromise rooftopPromise =
        AnchorManager.ResolveAnchorOnRooftopAsync(
            latitude, longitude, altitudeAboveRooftop, eunRotation);

    // The anchor will need to be resolved.
    StartCoroutine(CheckRooftopPromise(rooftopPromise));
}

private IEnumerator CheckRooftopPromise(ResolveAnchorOnTerrainPromise promise)
{
    yield return promise;

    var result = promise.Result;
    if (result.RooftopAnchorState == RooftopAnchorState.Success &&
        result.Anchor != null)
    {
        // resolving anchor succeeded
        GameObject anchorGO = Instantiate(RooftopAnchorPrefab,
            result.Anchor.gameObject.transform);
        anchorGO.transform.parent = result.Anchor.gameObject.transform;
    }
    else
    {
       // resolving anchor failed
    }

    yield break;
}

वादे की स्थिति की जांच करना

प्रॉमिस में एक PromiseState शामिल होगा, ऊपर दी गई टेबल देखें.

प्रॉमिस नतीजे की छत पर ऐंकर की स्थिति देखना

RooftopAnchorState एसिंक्रोनस कार्रवाई वाला है और प्रॉमिस के आखिरी नतीजे का हिस्सा है.

switch (result.RooftopAnchorState)
{
    case TerrainAnchorState.Success:
        // Anchor has successfully resolved
        break;
    case RooftopAnchorState.ErrorUnsupportedLocation:
        // The requested anchor is in a location that isn't supported by the Geospatial API.
        break;
    case RooftopAnchorState.ErrorNotAuthorized:
        // An error occurred while authorizing your app with the ARCore API. See
        // https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
        // for troubleshooting steps.
        break;
    case RooftopAnchorState.ErrorInternal:
        // The Rooftop anchor could not be resolved due to an internal error.
        break;
    default:
        break;
}

आगे क्या करना है