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

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

जियोस्पेशल ऐंकर के टाइप

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

  1. WGS84 ऐंकर:
    WGS84 ऐंकर की मदद से, किसी भी अक्षांश, देशांतर, और ऊंचाई पर 3D कॉन्टेंट डाला जा सकता है.

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

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

WGS84 इलाका रूफ़टॉप
हॉरिज़ॉन्टल पोज़िशन अक्षांश, देशांतर अक्षांश, देशांतर अक्षांश, देशांतर
वर्टिकल पोज़िशन WGS84 ऊंचाई के हिसाब से Google Maps के तय किए गए इलाके के लेवल के हिसाब से Google Maps के हिसाब से, छत के लेवल के हिसाब से
क्या इसे सर्वर-साइड से हल करना ज़रूरी है? नहीं हां हां

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

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

जियोस्पेशल ऐंकर जोड़ना

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

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

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

एआर पोज़ से भौगोलिक डेटा वाला पोज़ पाना

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

जियोस्पेशल पोज़ से एआर पोज़ पाना

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

चुनें कि आपके इस्तेमाल के उदाहरण के हिसाब से कौनसा तरीका सही है

ऐंकर बनाने के हर तरीके के साथ कुछ फ़ायदे और नुकसान जुड़े होते हैं. इन पर ध्यान रखें:

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

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

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

  • Geospatial Creator का इस्तेमाल करके, किसी जगह पर जाने के बिना, दुनिया को 3D कॉन्टेंट में देखें और उसमें बदलाव करें. इससे Unity Editor में 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. प्लेसमार्क के टाइटल फ़ील्ड में, प्लेसमार्क का नाम डालें.

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

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

KLM फ़ाइल, <coordinates> टैग में किसी प्लेसमार्क के अक्षांश, देशांतर, और ऊंचाई की जानकारी देती है. यह जानकारी कॉमा लगाकर अलग की जाती है. यह जानकारी इस तरह दी जाती है:

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

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

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

किसी जगह की ऊंचाई का हिसाब लगाने के लिए, वहां जाकर स्थानीय निगरानी की जा सकती है.

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

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

WGS84 एंकर

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

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

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

किसी जगह की ऊंचाई का पता लगाना

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

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

एंकर बनाना

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

if (earthTrackingState == TrackingState.Tracking)
{
  var anchor =
      AnchorManager.AddAnchor(
          latitude,
          longitude,
          altitude,
          quaternion);
  var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}

इलाके के हिसाब से एंकर

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

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

प्लेन ढूंढने का मोड सेट करना

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

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

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

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

टेरेन ऐंकर बनाने और उसे प्लेस करने के लिए, 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 कार्रवाई रद्द कर दी गई है.

Promise के नतीजे के लिए, टेरेन ऐंकर की स्थिति देखना

TerrainAnchorState, असाइनिश्नल ऑपरेशन से जुड़ा है और यह Promise के आखिरी नतीजे का हिस्सा है.

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() को कॉल करें. टेरेन ऐंकर की तरह ही, आपको Promise का 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 होगा. ऊपर दी गई टेबल देखें.

Promise के नतीजे की रूफ़टॉप ऐंकर की स्थिति देखना

RooftopAnchorState, असाइनिश्नल ऑपरेशन से जुड़ा है और यह Promise के आखिरी नतीजे का हिस्सा है.

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;
}

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