Unity पर अपने आस-पास की इमारतों और इलाकों का इस्तेमाल करें

Streetscape Geometry API, किसी सीन में मौजूद इलाके, इमारतों या अन्य स्ट्रक्चर की ज्यामिति की जानकारी देते हैं. हिट-टेस्ट एपीआई की मदद से, ज्यामिति का इस्तेमाल ऑब्स्क्यूरेशन, रेंडरिंग या एआर कॉन्टेंट को प्लेस करने के लिए किया जा सकता है. Streetscape Geometry का डेटा, Google Street View की इमेज से मिलता है.

सैंपल आज़माएं

जियोस्पेशल सैंपल ऐप्लिकेशन में, Streetscape की ज्यामिति पाने और उसे रेंडर करने का तरीका बताया गया है.

Geospatial API सेट अप करना

Streetscape Geometry का इस्तेमाल करने के लिए, आपको अपने प्रोजेक्ट में Geospatial API सेट अप करना होगा. जियोस्पेशियल एपीआई सेट अप करने के लिए, जियोस्पेशियल एपीआई चालू करने के निर्देशों का पालन करें.

स्ट्रीटस्केप ज्यामिति की सुविधा चालू करना

जब GeospatialMode को GeospatialMode.Enabled और StreetscapeGeometryMode को StreetscapeGeometryMode.Enabled पर सेट किया जाता है, तब Geospatial API, Streetscape Geometry का डेटा हासिल करता है.

किसी ArCore सेशन में Streetscape की जियोमेट्री पाना

GameObject में ARStreetscapeGeometryManager कॉम्पोनेंट जोड़ें. जब सड़क की ज्यामिति जोड़ी जाती है, अपडेट की जाती है या हटाई जाती है, तो ARStreetscapeGeometryManager.StreetscapeGeometriesChanged इवेंट ट्रिगर होता है.

public Material streetscapeGeometryMaterial;

List<ARStreetscapeGeometry> _addedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _updatedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _removedStreetscapeGeometries = new List<ARStreetscapeGeometry>();

public void OnEnable()
{
    StreetscapeGeometryManager.StreetscapeGeometriesChanged +=
        GetStreetscapeGeometry;
}

public void Update() {
  foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)
  {
    GameObject renderObject = new GameObject(
       "StreetscapeGeometryMesh", typeof(MeshFilter), typeof(MeshRenderer));

    if (renderObject)
    {
        renderObject.transform.position = streetscapegeometry.pose.position;
        renderObject.transform.rotation = streetscapegeometry.pose.rotation;
        renderObject.GetComponent<MeshFilter>().mesh = streetscapegeometry.mesh;
        renderObject.GetComponent<MeshRenderer>().material = streetscapeGeometryMaterial;
    }
  }
}

public void OnDisable()
{
    StreetscapeGeometryManager.StreetscapeGeometriesChanged -=
        GetStreetscapeGeometry;
}

private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)
{
    _addedStreetscapeGeometries = eventArgs.Added;
    _updatedStreetscapeGeometries = eventArgs.Updated;
    _removedStreetscapeGeometries = eventArgs.Removed;
}

ARStreetscapeGeometry के बारे में जानकारी

ARStreetscapeGeometry में किसी बिल्डिंग के बारे में जानकारी होती है:

बिल्डिंग का एलओडी 1

BuildingLOD1 में, इमारत के फ़ुटप्रिंट को ऊपर की ओर एक सपाट टॉप तक एक्सट्रूज़न किया जाता है. हो सकता है कि इमारतों की ऊंचाई की जानकारी गलत हो.

बिल्डिंग का एलओडी 2

BuildingLOD2 में बेहतर क्वालिटी की ज्यामिति होगी. मेश की दीवारें और छतें, इमारत के आकार से ज़्यादा मेल खाएंगी. चिमनी या छत के वेंट जैसी छोटी चीज़ें, अब भी मेश के बाहर दिख सकती हैं.

Mesh के बारे में जानकारी

Mesh एक पॉलीगॉन मेश है, जो Streetscape Geometry की सतह को फिर से बनाने का तरीका दिखाता है. Mesh और MeshRenderer देखें. ध्यान दें कि सामान्य वैल्यू का हिसाब डिफ़ॉल्ट रूप से नहीं लगाया जाता. उनका हिसाब लगाने के लिए, Mesh.RecalculateNormals() देखें.

ARStreetscapeGeometry से एआर कॉन्टेंट अटैच करना

ARStreetscapeGeometry.mesh में किसी पोज़ में, वर्टिसेस के पास ऐंकर बनाने के लिए, ARAnchorManager.AddAnchor() का इस्तेमाल करें. यह ऐंकर, पैरंट ARStreetscapeGeometry से ट्रैकिंग की स्थिति इनहेरिट करेगा.

ARStreetscapeGeometry के लिए हिट-टेस्ट करना

ARRaycastManagerExtensions.RaycastStreetscapeGeometry का इस्तेमाल, Streetscape Geometry के हिसाब से हिट-टेस्ट करने के लिए किया जा सकता है. अगर इंटरसेक्शन मिलते हैं, तो XRRaycastHit में हिट की गई जगह के बारे में पोज़ की जानकारी होती है. साथ ही, उस ARStreetscapeGeometry का रेफ़रंस भी होता है जिसे हिट किया गया था. इस स्ट्रीटस्केप ज्यामिति को ARAnchorManager.AddAnchor() को पास किया जा सकता है, ताकि उससे जुड़ा ऐंकर बनाया जा सके.

Vector2 screenTapPosition = Input.GetTouch(0).position;
List<XRRaycastHit> hitResults = new List<XRRaycastHit>();
if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){
  ARStreetscapeGeometry streetscapegeometry =
      StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);
  if (streetscapegeometry != null)
  {
      ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);
  }
}

भौगोलिक डेटा की गहराई की सुविधा चालू करना

जियोस्पेशल डेप्थ, डेप्थ डेटा को बेहतर बनाने के लिए, Streetscape Geometry को लोकल सेंसर इनपुट के साथ जोड़ता है. भौगोलिक डेटा के आधार पर गहराई का पता लगाने की सुविधा चालू होने पर, आउटपुट की गहराई और रॉ डेप्थ इमेज में बदलाव किया जाता है. ऐसा इसलिए किया जाता है, ताकि स्थानीय तौर पर गहराई का पता लगाने के साथ-साथ, रेस्टर की गई Streetscape ज्यामिति को भी शामिल किया जा सके. इससे, डेप्थ का इस्तेमाल करके पोज़ की सटीक जानकारी मिल सकती है.