במדריך הזה נסביר איך להשתמש ב-Geospatial Creator כדי לכתוב סקריפטים ב-C# ולבצע במהירות משימות נפוצות, כמו יצירה והזזה של אובייקטים מסוג ARGeospatialCreatorAnchor
במצב העריכה של Unity. אפשר להשתמש באפשרות הזו כדי ליצור כמה עוגנים מרשימה מוגדרת מראש, כמו גיליון אלקטרוני או קובץ KML.
Geospatial Creator ב-Unity מאפשר לכם לראות תצוגה מקדימה של תוכן גיאו-מרחבי בכלי העריכה של Unity. במדריך למתחילים אנחנו מציגים את Geospatial Creator ומסבירים איך ליצור את חוויית ה-AR הראשונה עם תמיכה במיקום גיאוגרפי באמצעות תכנות מינימלית, באמצעות ממשק המשתמש של Unity Editor. בפרויקטים מתקדמים יותר, מומלץ ליצור ולנהל אובייקטים של Geospatial Creator באופן פרוגרמטי במקום להשתמש בממשק המשתמש של Unity Editor.
במדריך הזה נניח שאתם מכירים את המושגים הבסיסיים של Geospatial Creator שהוצגו במדריך למתחילים, ואתם מוכנים להתחיל להוסיף עוגנים של Geospatial Creator לסצנה. תצטרכו להפעיל את Geospatial Creator ולהגדיר אותו עם מפתחות ה-API שלכם, וגם להוסיף לסצנה אובייקטים ראשוניים של סשן AR. אם אתם מתחילים מהתחלה, עליכם לפעול לפי המדריך למתחילים, כולל הקטע הפעלת Geospatial Creator, לפני שתמשיכו.
תחילת העבודה
בדוגמה הזו, נניח שיש לכם קבוצה של מיקומים ידועים סביב בית העירייה בסן פרנסיסקו, קליפורניה, ארה"ב, שבהם אתם רוצים להציב תוכן AR. תצטרכו ליצור אובייקטים של עוגנים בכל אחד מהמיקומים האלה, ולאחר מכן לצרף גיאומטריה בסיסית לעוגנים האלה.
לפני שיוצרים עוגנים, צריך לציין ARGeospatialCreatorOrigin
, שהוא נקודת ייחוס להמרת קוי רוחב, קוי אורך וגבהים אל קואורדינטות העולם של Unity ומהן.
המקור יכלול גם רכיב משנה מסוג CesiumGeoreference
ואובייקט צאצא מסוג Cesium3DTileset
, שמאפשרים ל-Cesium ליצור רינדור של האזור שמסביב בתצוגת Scene של עורך Unity. לשם כך, צריך מפתח API של Google Map Tiles כפי שמתואר במדריך למתחילים.
יצירת מקור
ה-API ל-Geospatial Creator כולל שיטה של מפעל ליצירת ARGeospatialCreatorOrigin
בסצנה ולהוספת הרכיבים הנדרשים של Cesium.
הקוד הבא יוצר את המקור בקו הרוחב, קו האורך והגובה הסמוכים, באמצעות מפתח ה-API של Map Tiles:
ARGeospatialCreatorOrigin origin =
GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");
כברירת מחדל, האובייקט הזה ממוקם ב-(0, 0, 0) בקואורדינטות העולם של Unity, וזה מתאים לדוגמה הזו.
הצגת ההפניה ARAnchorManager
ARAnchorManager
נדרש כדי לפתור עוגנים גיאו-מרחביים בזמן הריצה, לכן צריך גם הפניה ל-ARAnchorManager
בסצנה. אם התחלתם עם האפליקציה לדוגמה של Geospatial שצורפה לתוספים של ARCore, מנהל העוגנים מצורף ל-GameObject 'AR Session Origin'. בהנחה שיש לכם רק מנהל עוגן אחד בסצנה, תוכלו לקבל הפניה אליו כך:
ARAnchorManager anchorManager =
Resources.FindObjectsOfTypeAll<ARAnchorManager>()[0];
עכשיו, אחרי שיצרתם מקור ומנהל עוגן, תוכלו להתחיל ליצור את האובייקטים של ARGeospatialCreatorAnchor
.
יצירת עוגנים של פני השטח
נבחן את המערך הדו-מימדי הבא של ערכי double
, שמייצג את קו הרוחב ואת קו האורך המדויקים בשלושה נקודות בצד המזרחי של בית העירייה בסן פרנסיסקו, קליפורניה, ארה"ב:
double[,] _cityHallEastPoints = {
{ 37.77936, -122.418617 }, // in front of city hall
{ 37.77965, -122.418680 }, // right of city hall
{ 37.77917, -122.418577 }}; // left of city hall
נניח שרוצים להציב קוביה של מטר אחד בכל אחד מהמיקומים האלה, בגובה הקרקע, באפליקציית ה-AR שלנו. הקוד הבא יוצר אובייקטים מסוג ARGeospatialCreatorAnchor
ומקצה את המאפיינים שלהם לערכים המתאימים:
for (int i = 0; i < _cityHallEastPoints.GetLength(0); i++)
{
ARGeospatialCreatorAnchor anchor =
new GameObject("City Hall " + i).AddComponent<ARGeospatialCreatorAnchor>();
anchor.Origin = origin;
anchor.AnchorManager = anchorManager;
anchor.Latitude = _cityHallEastPoints[i, 0];
anchor.Longitude = _cityHallEastPoints[i, 1];
anchor.AltitudeType = AnchorAltitudeType.Terrain;
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.parent = anchor.transform;
}
כך נוצרים עוגנים של פני השטח בכל נקודה. הכלי Geospatial Creator ממפה את הווידג'טים באופן אוטומטי בקואורדינטות העולם המתאימות ב-Unity, על ידי חישוב המיקום שלהם ביחס לאובייקט ARGeospatialCreatorOrigin
. כדי לשנות את הגובה של עוגן פני השטח, מגדירים את המאפיין Altitude
במטרים מעל או מתחת לפני השטח.
במהלך זמן הריצה, נעגני השטח ימוקמו ברמת הקרקע של האפליקציה שפועלת, עם הזזה לפי המאפיין Altitude
. עם זאת, בתצוגת הסצנה של ה-Editor, ברירת המחדל היא שהן ייראו בגובה 0 ב-WGS84, ולא ביחס לגיאומטריה של המשבצת התלת-ממדית. לרוב, זה לא המיקום שבו רוצים לראות אותם, לכן אפשר לשנות את הגובה שמוגדר כברירת מחדל של הציר בתצוגת הסצנה של ה-Editor. לשם כך, מגדירים את המאפיין UseEditorAltitudeOverride
לערך true
ומציינים את הגובה במטרים לפי WGS84 באמצעות המאפיין EditorAltitudeOverride
:
anchor.UseEditorAltitudeOverride = true;
anchor.EditorAltitudeOverride = -13.5; // WGS84 altitude at ground level for City Hall plaza
לשני המאפיינים האלה אין השפעה מחוץ למצב העריכה, והם לא מקובצים באפליקציה שפועלת.
יצירת עוגן על גג
בהמשך, נניח שרוצים להציב צ'אנק בראש בית העירייה. אפשר ליצור את הצ'אנקר באותה דרך, חוץ מהעובדה שהמאפיין AltitudeType
מוגדר כ-AnchorAltitudeType.Rooftop
:
ARGeospatialCreatorAnchor cityHallRoofAnchor =
new GameObject("City Hall Roof").AddComponent<ARGeospatialCreatorAnchor>();
cityHallRoofAnchor.Origin = origin;
cityHallRoofAnchor.AnchorManager = anchorManager;
cityHallRoofAnchor.Latitude = 37.77959;
cityHallRoofAnchor.Longitude = -122.419006;
cityHallRoofAnchor.AltitudeType = AnchorAltitudeType.Rooftop;
GameObject roofCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
roofCube.transform.parent = cityHallRoofAnchor.transform;
בדומה לעוגנים של פני השטח, אפשר לשנות את הגובה של עוגן על גג בחלון התצוגה של העורכים באמצעות המאפיינים UseEditorAltitudeOverride
ו-EditorAltitudeOverride
. בדוגמה הזו, הגובה של הגג לפי WGS84 הוא כ-10.7 מטרים.
יצירת צ'אט צף בגובה ספציפי
נקודת העגינה האחרונה שלנו תהיה בחלק העליון של הכיפה של בית העירייה. לגבי עוגן כזה, חשוב להגדיר את הגובה המדויק, ולכן צריך להגדיר אותו באופן מפורש באמצעות עוגן WGS84, במקום עוגן פני שטח או עוגן גג:
ARGeospatialCreatorAnchor cityHallDomeAnchor =
new GameObject("City Hall Dome").AddComponent<ARGeospatialCreatorAnchor>();
cityHallDomeAnchor.Origin = origin;
cityHallDomeAnchor.AnchorManager = anchorManager;
cityHallDomeAnchor.Latitude = 37.77928;
cityHallDomeAnchor.Longitude = -122.419241;
cityHallDomeAnchor.AltitudeType = AnchorAltitudeType.WGS84;
cityHallDomeAnchor.Altitude = 73;
GameObject domeCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
domeCube.transform.parent = cityHallDomeAnchor.transform;
אין צורך להשתמש בעקיפה של הגובה לצורכי עריכה בלבד, כי הגובה כבר צוין בהתאם ל-WGS84. כמובן, אם הגובה של הגיאומטריה של המשבצות במפה ב-Editor לא תואם למציאות, עדיין תוכלו להשתמש בשינוי הידני ב-Editor כדי לשנות את המיקום של הציר בתצוגת הסצנה.