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

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

ניסיון של הדוגמה

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

הגדרת Geospatial API

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

הפעלת גיאומטריה של סביבת הרחוב

Geospatial API מקבל נתונים של גיאומטריה של סביבת הרחוב כאשר השדה GeospatialMode מוגדר לערך GeospatialMode.Enabled והשדה StreetscapeGeometryMode מוגדר לערך StreetscapeGeometryMode.Enabled.

אחזור נתוני גיאומטריה של סביבת הרחוב בסשן ARCore

מוסיפים רכיב ARStreetscapeGeometryManager ל-GameObject. האירוע 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 היא רשת פוליגונים שמייצגת שחזור של פני השטח של גיאומטריה של סביבת הרחוב. מידע נוסף זמין במאמרים Mesh ו-MeshRenderer. חשוב לדעת שהנורמלים לא מחושבים כברירת מחדל. תוכלו לקרוא איך מחושבים הנורמליים במאמר Mesh.RecalculateNormals().

צירוף תוכן AR ל-ARStreetscapeGeometry

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

ביצוע בדיקת היתקלות (hit-test) מול ARStreetscapeGeometry

אפשר להשתמש ב-ARRaycastManagerExtensions.RaycastStreetscapeGeometry כדי לבצע בדיקת היתכנות (hit-test) לגיאומטריה של סביבת הרחוב. אם נמצאות צמתים, השדה 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);
  }
}

הפעלת עומק גיאו-מרחבי

התכונה עומק גיאו-מרחבי משלבת בין גיאומטריה של סביבת הרחוב לבין קלט של חיישנים מקומיים כדי לשפר את נתוני העומק. כשהתכונה 'עומק גיאו-מרחבי' מופעלת, עומק הפלט ותמונות העומק הגולמיות משתנים כך שיכללו גיאומטריה של סביבת הרחוב בפורמט רסטר, בנוסף לעומק שנצפה באופן מקומי. כך ניתן לשפר את הדיוק של תנוחות באמצעות התכונה 'עומק'.