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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Earth.getPose(), पूर्व-ऊपर-दक्षिण निर्देशांक फ़्रेम के हिसाब से, पृथ्वी की तय की गई हॉरिज़ॉन्टल पोज़िशन, ऊंचाई, और क्वार्टरनियन रोटेशन को 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. मेन्यू से KML फ़ाइल के तौर पर एक्सपोर्ट करें को चुनें.

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

एंकर बनाना

अक्षांश, देशांतर, ऊंचाई, और रोटेशन क्वाटरनियन होने के बाद, अपने तय किए गए भौगोलिक निर्देशांक के हिसाब से कॉन्टेंट को ऐंकर करें. इसके लिए, 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.
  }
}

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