Android SDK (Kotlin/Java) पर असल दुनिया के कॉन्टेंट की जगह तय करने के लिए जियोस्पेशियल ऐंकर का इस्तेमाल करें

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • स्ट्रीटस्केप ज्यामिति का इस्तेमाल करते समय, किसी बिल्डिंग में कॉन्टेंट जोड़ने के लिए हिट-टेस्ट का इस्तेमाल करना.
  • 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.getEastUpSouthQuaternion() जियोस्पेशल पोज़ से ओरिएंटेशन निकालता है और एक क्वाटर्नियन देता है, जो रोटेशन मैट्रिक्स को टारगेट से पूर्व-ऊपर-दक्षिण (ईयूएस) कोऑर्डिनेट सिस्टम में वेक्टर को बदल देता है. X+ पॉइंट पूर्व की ओर, Y+ पॉइंट ऊपर, और Z+ पॉइंट दक्षिण की ओर. वैल्यू, {x, y, z, w} के क्रम में लिखी जाती हैं.

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 जैसे किसी दूसरे सोर्स का इस्तेमाल नहीं किया जा सकता.

ऐंकर बनाना

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

Java

if (earth != null && earth.getTrackingState() == TrackingState.TRACKING) {
  Anchor anchor =
    earth.createAnchor(
      /* Location values */
      latitude,
      longitude,
      altitude,
      /* Rotational pose values */
      qx,
      qy,
      qz,
      qw);

  // Attach content to the anchor specified by geodetic location and pose.
}

Kotlin

if (earth.trackingState == TrackingState.TRACKING) {
  val anchor =
    earth.createAnchor(
      /* Location values */
      latitude,
      longitude,
      altitude,
      /* Rotational pose values */
      qx,
      qy,
      qz,
      qw
    )

  // Attach content to the anchor specified by geodetic location and pose.
}

इलाके के ऐंकर

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

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

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

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

आपका ऐप्लिकेशन हवाई जहाज़ों की पहचान कैसे करता है, यह चुनने के लिए Config.PlaneFindingMode का इस्तेमाल करें.

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

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

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

Java

final ResolveAnchorOnTerrainFuture future =
  earth.resolveAnchorOnTerrainAsync(
    latitude,
    longitude,
    /* altitudeAboveTerrain= */ 0.0f,
    qx,
    qy,
    qz,
    qw,
    (anchor, state) -> {
      if (state == TerrainAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    });

Kotlin

var future =
  earth.resolveAnchorOnTerrainAsync(
    latitude,
    longitude,
    altitudeAboveTerrain,
    qx,
    qy,
    qz,
    qw,
    { anchor, state ->
      if (state == TerrainAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    }
  )

भविष्य की स्थिति की जांच करना

फ़्यूचर में एक FutureState जुड़ा होगा.

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

आने वाले समय के नतीजे के लिए इलाके के ऐंकर की स्थिति देखना

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

Java

switch (terrainAnchorState) {
  case SUCCESS:
    // A resolving task for this Terrain anchor has finished successfully.
    break;
  case ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized
    // for troubleshooting steps.
    break;
  case ERROR_INTERNAL:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    // not reachable
    break;
}

Kotlin

when (state) {
  TerrainAnchorState.SUCCESS -> {
    // A resolving task for this Terrain anchor has finished successfully.
  }
  TerrainAnchorState.ERROR_UNSUPPORTED_LOCATION -> {
    // The requested anchor is in a location that isn't supported by the Geospatial API.
  }
  TerrainAnchorState.ERROR_NOT_AUTHORIZED -> {
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized
    // for troubleshooting steps.
  }
  TerrainAnchorState.ERROR_INTERNAL -> {
    // The Terrain anchor could not be resolved due to an internal error.
  }
  else -> {
    // Default.
  }
}

रूफ़टॉप ऐंकर

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

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

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

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

छत पर ऐंकर बनाने और उसे लगाने के लिए, Earth.resolveAnchorOnRooftopAsync() को कॉल करें. टेरेन ऐंकर की तरह, फ़्यूचर के FutureState को भी ऐक्सेस किया जा सकता है. इसके बाद, Anchor.RooftopAnchorState को ऐक्सेस करने के लिए, आने वाले समय का नतीजा देखा जा सकता है.

Java

final ResolveAnchorOnRooftopFuture future =
  earth.resolveAnchorOnRooftopAsync(
    latitude,
    longitude,
    /* altitudeAboveRooftop= */ 0.0f,
    qx,
    qy,
    qz,
    qw,
    (anchor, state) -> {
      if (state == RooftopAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    });

Kotlin

var future =
  earth.resolveAnchorOnRooftopAsync(
    latitude,
    longitude,
    altitudeAboveRooftop,
    qx,
    qy,
    qz,
    qw,
    { anchor, state ->
      if (state == RooftopAnchorState.SUCCESS) {
        // do something with the anchor here
      } else {
        // the anchor failed to resolve
      }
    }
  )

भविष्य की स्थिति की जांच करना

फ़्यूचर में एक FutureState जुड़ा होगा, ऊपर दी गई टेबल देखें.

आने वाले समय के नतीजे की रूफ़टॉप ऐंकर स्थिति देखना

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

Java

switch (rooftopAnchorState) {
  case SUCCESS:
    // A resolving task for this Rooftop anchor has finished successfully.
    break;
  case ERROR_UNSUPPORTED_LOCATION:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case ERROR_NOT_AUTHORIZED:
    // An error occurred while authorizing your app with the ARCore API.
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized
    // for troubleshooting steps.
    break;
  case ERROR_INTERNAL:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    // not reachable
    break;
}

Kotlin

when (state) {
  RooftopAnchorState.SUCCESS -> {
    // A resolving task for this Rooftop anchor has finished successfully.
  }
  RooftopAnchorState.ERROR_UNSUPPORTED_LOCATION -> {
    // The requested anchor is in a location that isn't supported by the Geospatial API.
  }
  RooftopAnchorState.ERROR_NOT_AUTHORIZED -> {
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized
    // for troubleshooting steps.
  }
  RooftopAnchorState.ERROR_INTERNAL -> {
    // The Rooftop anchor could not be resolved due to an internal error.
  }
  else -> {
    // Default.
  }
}

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