ממשקי ה-API של גיאומטריה של סביבת הרחוב מספקים את הגיאומטריה של פני השטח, הבניינים או מבנים אחרים בסצנה. אפשר להשתמש בגיאומטריה כדי לבצע חסימה, עיבוד או מיקום של תוכן AR באמצעות ממשקי API של בדיקת התאמה. נתוני הגיאומטריה של סביבת הרחוב מתקבלים באמצעות תמונות מ-Google Street View.
ניסיון של הדוגמה
באפליקציית הדוגמה לנתונים גיאו-מרחביים מוצג איך לקבל גיאומטריות של סביבת הרחובות ולייצר מהן רינדור.
הגדרת 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
מכיל מידע על מבנה:
-
ARStreetscapeGeometry.streetscapeGeometryType
המאפיין הזה מזהה את StreetscapeGeometry כשטח או כבניין. -
ARStreetscapeGeometry.mesh
מקבלים פוליגוןMesh
שתואם לשטח או לבניין הזה. -
ARStreetscapeGeometry.quality
הנתונים של הרשת באיכות גבוהה. רמות הפירוט מתוארות בתקן CityGML 2.0.
בניין ברמת פירוט 1
BuildingLOD1
מורכב משטחי בניין שנמתחים כלפי מעלה עד לחלק עליון שטוח. יכול להיות שהגובה של המבנים לא יהיה מדויק.
בניין ברמת פירוט 2
ל-BuildingLOD2
תהיה גיאומטריה באיכות גבוהה יותר. קירות וגגות רשת יהיו דומים יותר לצורתו של הבניין. תכונות קטנות יותר, כמו תנורים או פתחי אוורור בגג, עשויות עדיין להימצא מחוץ לרשת.
הסבר על Mesh
Mesh
הוא רשת פוליגונים שמייצגת שחזור של פני השטח של גיאומטריה של סביבת הרחוב.
מידע נוסף זמין במאמרים Mesh
ו-MeshRenderer
. חשוב לדעת שהנורמלים לא מחושבים כברירת מחדל. תוכלו לקרוא איך מחשבים אותם במאמר Mesh.RecalculateNormals()
.
צירוף תוכן AR ל-ARStreetscapeGeometry
משתמשים ב-ARAnchorManager.AddAnchor()
כדי ליצור עוגן בתנוחה מסוימת ליד קודקודים ב-ARStreetscapeGeometry.mesh
. עוגן זה יקבל בירושה את מצב המעקב מההורה ARStreetscapeGeometry
.
ביצוע בדיקת היטים (hit-test) נגד ARStreetscapeGeometry
אפשר להשתמש ב-ARRaycastManagerExtensions.RaycastStreetscapeGeometry
כדי לבצע בדיקת התאמה לגיאומטריה של סביבת הרחוב. אם נמצאות צמתים, השדה 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);
}
}
הפעלת עומק גיאו-מרחבי
התכונה עומק גיאו-מרחבי משלבת בין נתוני הגיאומטריה של הרחוב לבין קלט מהחיישנים המקומיים כדי לשפר את נתוני העומק. כשמפעילים את התכונה 'עומק גיאו-מרחבי', עומק הפלט ותמונות העומק הגולמיות משתנים כך שיכללו גיאומטריה של סביבת הרחוב בפורמט רסטר, בנוסף לעומק שנצפה באופן מקומי. כך ניתן לשפר את הדיוק של תנוחות באמצעות התכונה 'עומק'.