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

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

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

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

תחילת העבודה

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

לפני שתוכל ליצור עוגנים, עליך לציין ARGeospatialCreatorOrigin, שמהווה נקודת התייחסות להמרה קווי רוחב, קווי אורך וגובה, אל קואורדינטות של עולם Unity וממנו. המקור יכיל גם רכיב משנה CesiumGeoreference ו- אובייקט צאצא מסוג Cesium3DTileset, שמאפשר לצסיום לעבד את הסביבה באזור בתצוגת 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' GameObject. בהנחה שיש לכם אפשר לראות קובץ עזר אחד בדיוק בסצנה שלכם, תוכלו לראות אותו, למשל הזה:

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;
}

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

לשני המאפיינים האלה אין השפעה מחוץ למצב ה-Editor, הועברו לאפליקציה שפועלת.

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

יצירת עוגן על הגג

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

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