ממשקי ה-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
מכיל מידע על מבנה:
-
ARStreetscapeGeometry.streetscapeGeometryType
מזהה את StreetscapeGeometry כפני שטח או כבניין. -
ARStreetscapeGeometry.mesh
יוצרים פוליגוןMesh
שתואם לפני השטח או לבניין. -
ARStreetscapeGeometry.quality
מספק את האיכות של נתוני הרשת. רמות הפירוט מתוארות בתקן של CityGML 2.0.
מבנה 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 שעברה רסטרציה, בנוסף לעמוקה המקומית שנמדדת. כך אפשר לשפר את הדיוק של תנוחות בעזרת עומק.