जियोस्पेशियल ऐंकर एक तरह के ऐंकर होते हैं. इनकी मदद से, 3D कॉन्टेंट को असल दुनिया में दिखाया जा सकता है.
जियोस्पेशल ऐंकर के टाइप
जियोस्पेशल ऐंकर तीन तरह के होते हैं. इनमें से हर ऐंकर, ऊंचाई को अलग-अलग तरीके से मैनेज करता है:
WGS84 ऐंकर:
WGS84 ऐंकर की मदद से, 3D कॉन्टेंट को किसी भी अक्षांश, देशांतर, और ऊंचाई पर रखा जा सकता है.इलाके के हिसाब से ऐंकर:
इलाके के हिसाब से ऐंकर की मदद से, सिर्फ़ अक्षांश और देशांतर का इस्तेमाल करके कॉन्टेंट को उस जगह की ऊंचाई के हिसाब से रखा जा सकता है. ऊंचाई का पता, VPS के ज़रिए, ज़मीन या फ़्लोर के हिसाब से लगाया जाता है.रूफ़टॉप ऐंकर:
रूफ़टॉप ऐंकर की मदद से, सिर्फ़ अक्षांश और देशांतर का इस्तेमाल करके कॉन्टेंट को उस जगह पर रखा जा सकता है जहां इमारत की छत है. ऊंचाई का पता, इमारत की छत के हिसाब से लगाया जाता है. इसे स्ट्रीटस्केप ज्यामिति कहा जाता है. अगर इसे किसी इमारत पर नहीं रखा जाता है, तो यह डिफ़ॉल्ट रूप से इलाके की ऊंचाई पर सेट हो जाएगा.
WGS84 | इलाका | रूफ़टॉप | |
---|---|---|---|
हॉरिज़ॉन्टल पोज़िशन | अक्षांश, देशांतर | अक्षांश, देशांतर | अक्षांश, देशांतर |
वर्टिकल पोज़िशन | WGS84 ऊंचाई के हिसाब से | Google Maps के तय किए गए इलाके के लेवल के हिसाब से | Google Maps के हिसाब से, छत के लेवल के हिसाब से |
क्या इसे सर्वर से हल करना ज़रूरी है? | नहीं | हां | हां |
ज़रूरी शर्तें
आगे बढ़ने से पहले, पक्का करें कि आपने Geospatial API चालू किया हो.
जियोस्पेशल ऐंकर जोड़ना
हर तरह के ऐंकर बनाने के लिए, खास एपीआई उपलब्ध हैं. ज़्यादा जानकारी के लिए, जियोस्पेशल ऐंकर के टाइप देखें.
हिट-टेस्ट से ऐंकर बनाना
हिट-टेस्ट के नतीजे से भी जियोस्पेशल ऐंकर बनाया जा सकता है.
हिट-टेस्ट से पोज़ का इस्तेमाल करें और उसे GeospatialPose
में बदलें. यहां बताए गए तीनों तरह के ऐंकर को जोड़ने के लिए, इसका इस्तेमाल करें.
एआर पोज़ से भौगोलिक डेटा वाला पोज़ पाना
AREarthManager.Convert(Pose)
, एआर पोज़ को भौगोलिक पोज़ में बदलकर, अक्षांश और देशांतर का पता लगाने का एक और तरीका उपलब्ध कराता है.
भौगोलिक डेटा के आधार पर पोज़ से एआर पोज़ पाना
AREarthManager.Convert(GeospatialPose)
, पूर्व-ऊपर-दक्षिण निर्देशांक फ़्रेम के हिसाब से, पृथ्वी की तय की गई हॉरिज़ॉन्टल पोज़िशन, ऊंचाई, और क्वार्टरनियन रोटेशन को GL वर्ल्ड निर्देशांक के हिसाब से, एआर पोज़ में बदलता है.
चुनें कि आपके इस्तेमाल के उदाहरण के हिसाब से कौनसा तरीका सही है
ऐंकर बनाने के हर तरीके के साथ कुछ फ़ायदे और नुकसान जुड़े होते हैं. इन पर ध्यान रखें:
- Streetscape Geometry का इस्तेमाल करते समय, किसी इमारत से कॉन्टेंट अटैच करने के लिए, हिट-टेस्ट का इस्तेमाल करें.
- WGS84 ऐंकर के बजाय, टेरेन या रूफ़टॉप ऐंकर का इस्तेमाल करें. ऐसा इसलिए, क्योंकि ये Google Maps से तय की गई ऊंचाई की वैल्यू का इस्तेमाल करते हैं.
किसी जगह का अक्षांश और देशांतर पता करना
किसी जगह के अक्षांश और देशांतर का हिसाब लगाने के तीन तरीके हैं:
- Geospatial Creator का इस्तेमाल करके, किसी जगह पर जाने के बिना ही दुनिया को 3D कॉन्टेंट में देखें और उसमें बदलाव करें. इससे Unity Editor में Google Maps का इस्तेमाल करके, 3D इमर्सिव कॉन्टेंट को विज़ुअल तौर पर दिखाया जा सकता है. कॉन्टेंट के अक्षांश, देशांतर, रोटेशन, और ऊंचाई का हिसाब अपने-आप लगाया जाएगा.
- Google मैप का उपयोग करें
- Google Earth का इस्तेमाल करें. ध्यान दें कि Google Maps के बजाय Google Earth का इस्तेमाल करके, इन निर्देशांकों को पाने पर, आपको गड़बड़ी का मार्जिन कई मीटर तक मिल सकता है.
- कारोबार की जगह पर जाएं
Google मैप का उपयोग करें
Google Maps का इस्तेमाल करके किसी जगह का अक्षांश और देशांतर जानने के लिए:
अपने डेस्कटॉप कंप्यूटर पर Google Maps में जाएं.
लेयर > ज़्यादा पर जाएं.
मैप टाइप को सैटलाइट में बदलें. इसके बाद, स्क्रीन के सबसे नीचे बाएं कोने में मौजूद, ग्लोब व्यू चेकबॉक्स से सही का निशान हटाएं.
इससे 2D पर्सपेक्टिव लागू हो जाएगा और ऐंगल वाले 3D व्यू से होने वाली संभावित गड़बड़ियां खत्म हो जाएंगी.
मैप पर, जगह पर दायां क्लिक करें और अपने क्लिपबोर्ड पर कॉपी करने के लिए, देशांतर/अक्षांश चुनें.
Google Earth का इस्तेमाल करना
Google Earth में किसी जगह के अक्षांश और देशांतर का हिसाब लगाया जा सकता है. इसके लिए, यूज़र इंटरफ़ेस (यूआई) में किसी जगह पर क्लिक करें और प्लेसमार्क की जानकारी से डेटा पढ़ें.
Google Earth का इस्तेमाल करके, किसी जगह का अक्षांश और देशांतर जानने के लिए:
अपने डेस्कटॉप कंप्यूटर पर, Google Earth पर जाएं.
हैम्बर्गर मेन्यू पर जाएं और मैप का स्टाइल चुनें.
3D बिल्डिंग स्विच को टॉगल करके बंद करें.
3D बिल्डिंग स्विच को बंद करने के बाद, चुनी गई जगह पर प्लेसमार्क जोड़ने के लिए, पिन आइकॉन पर क्लिक करें.
अपने प्लेसमार्क को शामिल करने के लिए कोई प्रोजेक्ट चुनें और सेव करें पर क्लिक करें.
प्लेसमार्क के टाइटल फ़ील्ड में, प्लेसमार्क का नाम डालें.
प्रोजेक्ट पैनल में, बैक ऐरो पर क्लिक करें और ज़्यादा कार्रवाइयां मेन्यू चुनें.
मेन्यू से KML फ़ाइल के तौर पर एक्सपोर्ट करें को चुनें.
KLM फ़ाइल, <coordinates>
टैग में किसी प्लेसमार्क के अक्षांश, देशांतर, और ऊंचाई की जानकारी देती है. यह जानकारी कॉमा लगाकर अलग की जाती है. यह जानकारी इस तरह दिखती है:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
<LookAt>
टैग में मौजूद अक्षांश और देशांतर का इस्तेमाल न करें. इससे कैमरे की पोज़िशन का पता चलता है, न कि जगह की.
कारोबार की जगह पर जाएं
किसी जगह की ऊंचाई का हिसाब लगाने के लिए, वहां जाकर स्थानीय निगरानी की जा सकती है.
रोटेशन क्वार्टरनियन पाना
GeospatialPose.EunRotation
, जियोस्पेशियल पॉज़ से ओरिएंटेशन निकालता है और एक क्वार्टरनियन दिखाता है. यह क्वार्टरनियन, रोटेशन मैट्रिक को दिखाता है, जो किसी वेक्टर को टारगेट से पूर्व-ऊपर-उत्तर (ईयूएन) निर्देशांक सिस्टम में बदलता है. X+ पूर्व की ओर, Y+ ऊपर की ओर, और Z+ उत्तर की ओर पॉइंट करता है.
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
से ऊंचाई का पता लगाया जा सकता है.
एंकर बनाना
अक्षांश, देशांतर, ऊंचाई, और रोटेशन क्वार्टरनियन की जानकारी मिलने के बाद, कॉन्टेंट को अपने तय किए गए भौगोलिक निर्देशांकों पर ऐंकर करने के लिए, ARAnchorManagerExtensions.AddAnchor()
का इस्तेमाल करें.
if (earthTrackingState == TrackingState.Tracking)
{
var anchor =
AnchorManager.AddAnchor(
latitude,
longitude,
altitude,
quaternion);
var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
इलाके के ऐंकर
टेरेन ऐंकर एक तरह का ऐंकर है. इसकी मदद से, सिर्फ़ अक्षांश और देशांतर का इस्तेमाल करके एआर ऑब्जेक्ट डाले जा सकते हैं. साथ ही, ज़मीन से सटीक ऊंचाई का पता लगाने के लिए, VPS की जानकारी का इस्तेमाल किया जा सकता है.
इसमें, अपनी पसंद की ऊंचाई डालने के बजाय, आपको इलाके से ऊपर की ऊंचाई डालनी होती है. जब यह शून्य होगा, तो ऐंकर इलाके के लेवल पर होगा.
प्लेन ढूंढने वाला मोड सेट करना
प्लेन ढूंढने की सुविधा का इस्तेमाल करना ज़रूरी नहीं है. साथ ही, ऐंकर का इस्तेमाल करने के लिए भी इसकी ज़रूरत नहीं होती. ध्यान दें कि सिर्फ़ हॉरिज़ॉन्टल प्लेन का इस्तेमाल किया जाता है. हॉरिज़ॉन्टल प्लेन की मदद से, ज़मीन पर मौजूद टेरेन ऐंकर को डाइनैमिक तौर पर अलाइन किया जा सकेगा.
ध्यान दें कि टेरेन ऐंकर पर Horizontal
और Horizontal | Vertical
का असर पड़ता है
पहचान करने का मोड सेट करने के लिए, पहचान करने का मोड ड्रॉप-डाउन मेन्यू का इस्तेमाल करें:
नए एसिंक्रोनस एपीआई का इस्तेमाल करके, टेरेन ऐंकर बनाना
टेरेन ऐंकर बनाने और उसे प्लेस करने के लिए, ARAnchorManagerExtensions.resolveAnchorOnTerrainAsync()
को कॉल करें.
ऐंकर तुरंत तैयार नहीं होगा और उसे ठीक करना होगा. समस्या ठीक होने के बाद, यह ResolveAnchorOnTerrainPromise
में उपलब्ध हो जाएगा.
public GameObject TerrainAnchorPrefab;
public void Update()
{
ResolveAnchorOnTerrainPromise terrainPromise =
AnchorManager.ResolveAnchorOnTerrainAsync(
latitude, longitude, altitudeAboveTerrain, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckTerrainPromise(terrainPromise));
}
private IEnumerator CheckTerrainPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.TerrainAnchorState == TerrainAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(TerrainAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
वादे की स्थिति देखना
वादे से जुड़ा PromiseState
होगा.
स्थिति | ब्यौरा |
---|---|
Pending |
कार्रवाई अब भी पूरी नहीं हुई है. |
Done |
कार्रवाई पूरी हो गई है और नतीजा उपलब्ध है. |
Cancelled |
कार्रवाई रद्द कर दी गई है. |
Promise के नतीजे के लिए, टेरेन ऐंकर की स्थिति देखना
TerrainAnchorState
, असाइनिश्नल ऑपरेशन से जुड़ा है और यह Promise के फ़ाइनल नतीजे का हिस्सा है.
switch (result.TerrainAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case TerrainAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case TerrainAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case TerrainAnchorState.ErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
छत पर बने ऐंकर
रूफ़टॉप ऐंकर, एक तरह के ऐंकर होते हैं. ये ऊपर दिए गए टेरेन ऐंकर से काफ़ी मिलते-जुलते हैं. अंतर यह है कि आपको इलाके के ऊपर की ऊंचाई के बजाय, छत के ऊपर की ऊंचाई देनी होगी.
नए एसिंक्रोनस एपीआई का इस्तेमाल करके, रूफ़टॉप ऐंकर बनाना
ऐंकर तुरंत तैयार नहीं होगा और उसे ठीक करना होगा.
रूफ़टॉप ऐंकर बनाने और उसे प्लेस करने के लिए, ARAnchorManagerExtensions.resolveAnchorOnRooftopAsync()
बोलें. टेरेन ऐंकर की तरह ही, आपको Promise का PromiseState
भी ऐक्सेस मिलेगा. इसके बाद, RooftopAnchorState
को ऐक्सेस करने के लिए, वादे का नतीजा देखा जा सकता है.
public GameObject RooftopAnchorPrefab;
public void Update()
{
ResolveAnchorOnRooftopPromise rooftopPromise =
AnchorManager.ResolveAnchorOnRooftopAsync(
latitude, longitude, altitudeAboveRooftop, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckRooftopPromise(rooftopPromise));
}
private IEnumerator CheckRooftopPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.RooftopAnchorState == RooftopAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(RooftopAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
वादे की स्थिति देखना
वादे से जुड़ा PromiseState
होगा. ऊपर दी गई टेबल देखें.
Promise के नतीजे की रूफ़टॉप ऐंकर की स्थिति देखना
RooftopAnchorState
, असाइनिश्नल ऑपरेशन से जुड़ा है और यह Promise के फ़ाइनल नतीजे का हिस्सा है.
switch (result.RooftopAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case RooftopAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case RooftopAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case RooftopAnchorState.ErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
आगे क्या करना है
- पक्का करें कि आपको जियोस्पेशल एपीआई के इस्तेमाल के कोटे के बारे में पता हो.