שימוש במבנים ובפני השטח מסביב ב-Unity

ממשקי ה-API של Streetscape Geometry מספקים את הגיאומטריה של פני השטח, של בניינים או של מבנים אחרים בסצנה. אפשר להשתמש בגיאומטריה לצורך חסימה, רינדור או מיקום של תוכן AR באמצעות ממשקי API לבדיקת היט. הנתונים הגיאומטריים של Streetscape מתקבלים דרך תמונות Google Street View.

רוצה לנסות את הדוגמה?

האפליקציה לדוגמה גיאו-מרחבית מדגימה איך לקבל ולעבד תמונות גיאומטריות של Streetscape.

הגדרת ה-API הגיאו-מרחבי

כדי להשתמש ב-Streetscape Geometry, צריך להגדיר את ה-Geospatial API בפרויקט. כדי להגדיר את Geospatial API, פועלים לפי ההוראות להפעלת ה-Geospatial API.

הפעלת גיאומטריה של Streetscape

ה-Geospatial API מקבל נתוני Streetscape Geometry כאשר GeospatialMode מוגדר לערך GeospatialMode.Enabled ו-StreetscapeGeometryMode מוגדר לערך StreetscapeGeometryMode.Enabled.

קבלת גיאומטריה של Streetscape בסשן ARCore

מוסיפים רכיב ARStreetscapeGeometryManager ל-GameObject. מתי המאפיינים גיאומטריים של Streetscape נוספו, עודכנו או הוסרו, האירוע 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 מכיל מידע על מבנה:

מבנה LOD 1

BuildingLOD1 מורכב מטביעות רגליים של מבנים מובלטות למעלה עד לראש שטוח. יכול להיות שגובה המבנים לא יהיה מדויק.

מבנה LOD 2

למכשיר BuildingLOD2 תהיה גיאומטריה ברמת דיוק גבוהה יותר. קירות וגגות הרשת יתאימו בצורה מדויקת יותר לצורת הבניין. ישויות קטנות יותר, כמו ארובות או פתחי אוורור בגגות, עדיין עשויות לדגוש מחוץ לרשת.

הסבר על Mesh

Mesh היא רשת פוליגונים שמייצגת שחזור של פני השטח של הגיאומטריה של Streetscape. פרטים נוספים זמינים בMesh ובMeshRenderer. שימו לב שהנורמליות לא מחושבים כברירת מחדל כדי לחשב אותן, ראו Mesh.RecalculateNormals().

לצרף תוכן AR אל ARStreetscapeGeometry

אפשר להשתמש ב-ARAnchorManager.AddAnchor() כדי ליצור עוגן בתנוחה נתונה ליד קודקודים ב-ARStreetscapeGeometry.mesh. קובץ העוגן הזה יקבל בירושה את מצב המעקב שלו מתבנית ההורה ARStreetscapeGeometry.

ביצוע בדיקת היט מול ARStreetscapeGeometry

אפשר להשתמש בפרמטר ARRaycastManagerExtensions.RaycastStreetscapeGeometry כדי לבצע בדיקה בבדיקה של Streetscape גיאומטריה. אם נמצאו צמתים, XRRaycastHit מכיל מידע על מיקום ההיט וגם הפניה אל ARStreetscapeGeometry שנפגע. ניתן להעביר את הגיאומטריה של Streetscape אל 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 עם קלט חיישן מקומי כדי לשפר את נתוני העומק. כשהתכונה 'עומק גיאו-מרחבי' מופעלת, תמונות עומק הפלט ותמונות העומק הגולמיות משתנות כך שיכללו גיאומטריה של Streetscape שעברה רסטרציה, בנוסף לעמוקה המקומית שנמדדת. כך אפשר לשפר את הדיוק של תנוחות בעזרת עומק.