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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 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.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 फ़ाइल में <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.
}

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

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

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

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

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

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

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

इलाक़ा ऐंकर बनाने और रखने के लिए, 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
      }
    }
  )

आने वाले समय के बारे में जानें

The Future में एक 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.
  }
}

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