יצירה ועריכה של עוגנים באופן פרוגרמטי ב-Geospatial Creator ב-Unity

במדריך הזה מוסבר איך להשתמש ב-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. לשם כך, צריך מפתח ל-Google Maps Tiles API כפי שמתואר במדריך למתחילים.

יצירת מקור

ה-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 כדי לשנות את המיקום של הציר בתצוגת הסצנה.

עוגן גיאו-מרחבי בכיפה