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() का इस्तेमाल करें.

JavaKotlin
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.
}
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 में उपलब्ध हो जाएगा.

JavaKotlin
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
      }
    });
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, असाइनमेंट के साथ-साथ होने वाली प्रोसेस का हिस्सा है. यह फ़्यूचर रिज़ल्ट का हिस्सा है.

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

छत पर बने ऐंकर

छत पर बने बार के हीरो

रूफ़टॉप ऐंकर एक तरह के ऐंकर होते हैं. ये ऊपर दिए गए टेरेन ऐंकर से काफ़ी मिलते-जुलते हैं. अंतर यह है कि आपको इलाके के ऊपर की ऊंचाई के बजाय, छत के ऊपर की ऊंचाई देनी होगी.

नए एसिंक्रोनस एपीआई का इस्तेमाल करके, रूफ़टॉप ऐंकर बनाना

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

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

JavaKotlin
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
      }
    });
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, असाइनमेंट के साथ-साथ होने वाली प्रोसेस का हिस्सा है. यह फ़्यूचर रिज़ल्ट का हिस्सा है.

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

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