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

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

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

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

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

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

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

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

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

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

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

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

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

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

एआर (ऑगमेंटेड रिएलिटी) वाले पोज़ से जियोस्पेशियल पोज़ पाएं

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

जियोस्पेशियल पोज़ से एआर (ऑगमेंटेड रिएलिटी) पोज़ पाएं

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

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

ऐंकर बनाने के हर तरीके से जुड़े कुछ ऐसे ट्रेड-ऑफ़ होते हैं जिन्हें ध्यान में रखना ज़रूरी है:

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

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

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

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

Google Maps का इस्तेमाल करें

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. मेन्यू से, केएमएल फ़ाइल के तौर पर एक्सपोर्ट करें को चुनें.

केएलएम फ़ाइल, <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 फ़ाइल में <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);
}

इलाक़े के ऐंकर

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

ऊंचाई इनपुट करने के बजाय, आप इलाके से ऊपर ऊंचाई देते हैं. जब यह शून्य होता है, तो ऐंकर, इलाके के बराबर हो जाएगा.

विमान ढूंढने का मोड सेट करना

हवाई जहाज़ ढूंढना ज़रूरी नहीं है और ऐंकर का इस्तेमाल करने के लिए इसकी ज़रूरत नहीं है. ध्यान दें कि सिर्फ़ हॉरिज़ॉन्टल प्लेन का ही इस्तेमाल किया गया है. क्षैतिज तल, भूमि पर भू-दृश्य लंगर के गतिशील संरेखण में मदद करेंगे.

ध्यान दें कि इलाके के ऐंकर 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;
}

वादे की स्थिति देखें

Promise के साथ एक 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() को कॉल करें. इलाके के ऐंकर की तरह ही, आपको प्रॉमिस के PromiseState को भी ऐक्सेस करना होगा. इसके बाद, RooftopAnchorState को ऐक्सेस करने के लिए, Promise नतीजा देखा जा सकता है.

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

वादे की स्थिति देखें

Promise में एक 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;
}

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