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

במדריך הזה מוסבר איך להשתמש בכלי 'יוצר גיאו-מרחבי' כדי לכתוב סקריפטים של C# לבצע במהירות משימות נפוצות כמו יצירה והעברה ARGeospatialCreatorAnchor אובייקטים במצב עריכה של Unity. אפשר להשתמש באפשרות הזו כדי ליצור כמה עוגנים מרשימה מוגדרת מראש, כמו גיליון אלקטרוני או קובץ KML.

Geospatial Creator ב-Unity מאפשר לכם לראות תצוגה מקדימה של תוכן גיאו-מרחבי בכלי העריכה של Unity. המדריך למתחילים מציג את התכונה 'יוצר גיאו-מרחבי' ומנחה אתכם איך לבנות חוויית AR מותאמת גיאו-מרחבית עם תכנות מינימלי, באמצעות Unity ממשק המשתמש של Editor. בפרויקטים מתקדמים יותר, מומלץ ליצור ולשנות אובייקטים של Geospatial Creator באופן פרוגרמטי במקום להשתמש בממשק המשתמש של Unity Editor.

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

תחילת העבודה

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

לפני שיוצרים עוגנים, צריך לציין ARGeospatialCreatorOrigin, שהוא נקודת ייחוס להמרת קוי רוחב, קוי אורך וגבהים אל קואורדינטות העולם ב-Unity ומהן. המקור יכלול גם רכיב משנה מסוג CesiumGeoreference ואובייקט צאצא מסוג Cesium3DTileset, שמאפשרים ל-Cesium ליצור רינדור של האזור שמסביב בתצוגת Scene של עורך Unity. לשם כך, צריך מפה של Google מפתח ה-API של כרטיסי המידע כפי שמתואר המדריך למתחילים

יצירת מקור

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

ARGeospatialCreatorOrigin origin =
  GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
    37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");

כברירת מחדל, האובייקט הזה ממוקם ב-(0, 0, 0) בקואורדינטות בעולם של Unity, עובד טוב בדוגמה הזו.

הצגת ההפניה ARAnchorManager

ARAnchorManager נדרש כדי לפענח עוגנים גיאו-מרחביים בזמן ריצה, נדרשת גם הפניה אל ARAnchorManager בסצנה. אם התחלתם עם האפליקציה 'דגימה מרחבית' בחבילה עם תוספי ARCore, חשבון הניהול מצורף אל 'מקור – סשן AR' אובייקט משחק. בהנחה שיש לכם אפשר לראות קובץ עזר אחד בדיוק בסצנה שלכם, תוכלו לראות אותו, למשל הזה:

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. עם זאת, בתצוגת הסצנה של העורך לעבד בגובה 0 של WGS84 כברירת מחדל, לא ביחס לאריח התלת-ממדי גיאומטריה. לרוב זה לא המקום שבו רוצים לראות אותן, לכן אפשר לשנות ברירת המחדל של גובה העוגן בתצוגת הסצנה של העורך על ידי הגדרה של המאפיין 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;

בדומה לעוגנים של פני השטח, אפשר לכוונן את הגובה של גג רכב בתצוגת הסצנה של ה-Editor באמצעות 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 כדי לשנות את המיקום של הציר בתצוגת הסצנה.

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