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

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

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

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

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

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

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

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

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

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

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

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

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

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

एआर ट्रांसफ़ॉर्म से जियोस्पेशल ट्रांसफ़ॉर्म पाना

GARSession.geospatialTransformFromTransform:error:, अक्षांश और देशांतर का पता लगाने का एक और तरीका उपलब्ध कराता है. इसके लिए, यह एआर ट्रांसफ़ॉर्म को भौगोलिक डेटा के ट्रांसफ़ॉर्म में बदलता है.

जियोस्पेशल ट्रांसफ़ॉर्म से एआर ट्रांसफ़ॉर्म पाना

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

चुनें कि आपके इस्तेमाल के उदाहरण के हिसाब से कौनसा तरीका सही है

ऐंकर बनाने के हर तरीके के साथ कुछ फ़ायदे और नुकसान जुड़े होते हैं. इन बातों का ध्यान रखें:

  • 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. प्लेसमार्क के लिए, Title फ़ील्ड में, प्लेसमार्क के लिए कोई नाम डालें.

  7. प्रोजेक्ट पैनल में, बैक ऐरो पर क्लिक करें और ज़्यादा कार्रवाइयां मेन्यू चुनें.

  8. मेन्यू से KML फ़ाइल के तौर पर एक्सपोर्ट करें को चुनें.

KLM फ़ाइल, <coordinates> टैग में किसी प्लेसमार्क के अक्षांश, देशांतर, और ऊंचाई की जानकारी देती है. यह जानकारी कॉमा लगाकर अलग की जाती है. यह जानकारी इस तरह दिखती है:

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

<LookAt> टैग में मौजूद अक्षांश और देशांतर का इस्तेमाल करें. इससे कैमरे की पोज़िशन का पता चलता है, न कि जगह की.

कारोबार की जगह पर जाएं

किसी जगह की ऊंचाई का हिसाब लगाने के लिए, वहां जाकर स्थानीय निगरानी की जा सकती है.

रोटेशन क्वार्टरनियन पाना

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

WGS84 एंकर

WGS84 ऐंकर, ऐंकर का एक टाइप है. इसकी मदद से, किसी भी दिए गए अक्षांश, देशांतर, और ऊंचाई पर 3D कॉन्टेंट रखा जा सकता है. इसे असल दुनिया में दिखाने के लिए, ट्रांसफ़ॉर्म और ओरिएंटेशन का इस्तेमाल किया जाता है. जगह की जानकारी में अक्षांश, देशांतर, और ऊंचाई शामिल होती है. ये जानकारी WGS84 निर्देशांक सिस्टम में दी जाती है. ओरिएंटेशन में क्वार्टरनियन रोटेशन होता है.

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

असल दुनिया में WGS84 ऐंकर डालना

किसी जगह की ऊंचाई का पता लगाना

ऐंकर लगाने के लिए, किसी जगह की ऊंचाई तय करने के कुछ तरीके यहां दिए गए हैं:

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

ऐंकर बनाना

अक्षांश, देशांतर, ऊंचाई, और रोटेशन क्वार्टरनियन की जानकारी मिलने के बाद, कॉन्टेंट को अपने तय किए गए भौगोलिक निर्देशांकों पर ऐंकर करने के लिए, createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error: का इस्तेमाल करें.

  NSError *error = nil;
  GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
                                                         altitude:altitude
                                               eastUpSouthQAnchor:eastUpSouthQAnchor
                                                            error:&error];

इलाके के ऐंकर

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

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

प्लेन ढूंढने वाला मोड सेट करना

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

ARWorldTrackingConfiguration.PlaneDetection का इस्तेमाल करके चुनें कि आपका ऐप्लिकेशन, प्लेन का पता कैसे लगाएगा.

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

टेरेन ऐंकर बनाने और उसे प्लेस करने के लिए, GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error: को कॉल करें.

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

GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveTerrain:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

'आने वाले समय में क्या होगा' सेक्शन देखना

फ़्यूचर के साथ एक GARFutureState जुड़ा होगा.

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

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

GARTerrainAnchorState, असाइनमेंट के साथ-साथ होने वाली प्रोसेस का हिस्सा है और यह फ़्यूचर फ़ंक्शन के नतीजे का हिस्सा है.

switch (future.resultTerrainAnchorState) {
  case GARTerrainAnchorStateSuccess:
    // Terrain anchor finished resolving.
    break;
  case GARTerrainAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARTerrainAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARTerrainAnchorStateErrorInternal:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

छत पर बने ऐंकर

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

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

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

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

रूफ़टॉप ऐंकर बनाने और उसे प्लेस करने के लिए, GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error: बोलें. टेरेन ऐंकर की तरह ही, आपको फ़्यूचर की GARFutureState सुविधा भी मिलेगी. इसके बाद, GARRooftopAnchorState को ऐक्सेस करने के लिए, आने वाले समय का नतीजा देखें.

GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveRooftop:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

'आने वाले समय में क्या होगा' सेक्शन देखना

आने वाले समय में, GARFutureState से जुड़ी जानकारी दिखेगी. इसके लिए, ऊपर दी गई टेबल देखें.

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

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

switch (future.resultRooftopAnchorState) {
  case GARRooftopAnchorStateSuccess:
    // Rooftop anchor finished resolving.
    break;
  case GARRooftopAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARRooftopAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARRooftopAnchorStateErrorInternal:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

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