עוגנים גיאו-מרחביים הם סוג של עוגן שמאפשר למקם תוכן בתלת-ממד בעולם האמיתי.
סוגים של עוגנים גיאו-מרחביים
יש שלושה סוגים של עוגנים גיאו-מרחביים, שכל אחד מהם מטפל בגובה באופן שונה:
עוגנים של WGS84:
עוגנים של WGS84 מאפשרים לך למקם תוכן תלת-ממדי בכל קו רוחב נתון, קו אורך וגובה.עוגנים בפני השטח:
עוגנים של פני השטח מאפשרים לך להציב תוכן רק באמצעות קווי רוחב ו קו אורך עם גובה ביחס לפני השטח במיקום הזה. הגובה נקבע ביחס לקרקע או לקומה, כפי שהיא ידועה מאת VPS.עוגנים על הגג:
מודעות עוגן לחלק העליון של הגג מאפשרות לך למקם תוכן רק לפי קווי רוחב קו אורך ביחס לגג של בניין באותו מיקום. הגובה נקבע ביחס לחלק העליון של המבנה, כפי שהוא ידוע מאת Streetscape Geometry. ברירת המחדל של ההגדרה הזו היא גובה פני השטח כשהיא לא מוצבת על מבנה.
WGS84 | פני השטח | גג רכב | |
---|---|---|---|
מיקום אופקי | קו רוחב, קו אורך | קו רוחב, קו אורך | קו רוחב, קו אורך |
מיקום אנכי | ביחס לגובה של WGS84 | ביחס לגובה פני השטח, שנקבע על ידי מפות Google | ביחס לרמת הגג, שנקבעת על ידי מפות Google |
האם נדרש פתרון לשרת? | לא | כן | כן |
דרישות מוקדמות
לפני שממשיכים, חשוב לוודא שאתם מפעילים את Geospatial API.
מיקום עוגנים גיאו-מרחביים
לכל סוג עוגן יש ממשקי API ייעודיים שמאפשרים ליצור אותם. למידע נוסף, ראו סוגים של עוגנים גיאו-מרחביים.
יצירת עוגן מבדיקת היט
אפשר גם ליצור עוגן גיאו-מרחבי מתוצאת בדיקת התאמה.
משתמשים ב-Pose מההיט-בדיקה וממירים אותו ל-GeospatialPose
. משתמשים בו כדי למקם כל אחד מ-3 סוגי העוגנים שמתוארים.
איך מקבלים מיקום גיאו-מרחבי מ-AR Pose
התכונה AREarthManager.Convert(Pose)
מספקת דרך נוספת לקבוע את קו הרוחב וקו האורך על ידי המרה של מיקום AR למיקום גיאו-מרחבי.
קבלת AR Pose ממיקום גיאו-מרחבי
הפונקציה AREarthManager.Convert(GeospatialPose)
ממירה מיקום אופקי, גובה וסיבוב קווטרניון שצוינו בכדור הארץ ביחס למסגרת קואורדינטות מזרח-מעלה-דרום לתנוחת AR לתנוחת AR ביחס לקואורדינטה בעולם של GL.
בחירת השיטה שמתאימה לתרחיש לדוגמה שלכם
לכל שיטה ליצירת עוגן יש יתרונות וחסרונות שחשוב לזכור:
- כשמשתמשים בגיאומטריה של Streetscape, להשתמש במבחן היט כדי לצרף תוכן לבניין.
- יש עדיפות לעוגנים של פני שטח או גג על פני עוגנים WGS84 כי הם משתמשים בערכי גובה שנקבעים על ידי מפות Google.
קביעת קו הרוחב וקו האורך של מיקום
יש שלוש דרכים לחישוב קו הרוחב וקו האורך של מיקום:
- אפשר להשתמש בתכונה יוצר גיאו-מרחבי כדי להציג את העולם ולהרחיב אותו באמצעות תוכן תלת-ממדי בלי להגיע למיקום פיזי. כך תוכלו למקם ב-Unity Editor תוכן תלת-ממדי חזותי באמצעות מפות Google. המערכת תחשב באופן אוטומטי את קו הרוחב, קו האורך, הסיבוב והגובה של התוכן.
- שימוש במפות Google
- משתמשים ב-Google Earth. שימו לב שהשגת הקואורדינטות האלה באמצעות Google Earth, בניגוד למפות Google, תעניק לכם מרווח שגיאה של עד כמה מטרים.
- מעבר למיקום הפיזי
שימוש במפות Google
כדי לקבל את קו הרוחב וקו האורך של מיקום באמצעות מפות Google:
נכנסים למפות Google במחשב.
עוברים אל שכבות > עוד.
משנים את ההגדרה סוג המפה ללוויין ומבטלים את הסימון של התיבה תצוגת כדור הארץ בפינה הימנית התחתונה של המסך.
פעולה זו תאלץ נקודת מבט דו-ממדית ויבטלו שגיאות אפשריות שעלולות להגיע מתצוגה תלת-ממדית זוויתית.
במפה, לוחצים לחיצה ימנית על המיקום ובוחרים את קו האורך/קו הרוחב כדי להעתיק אותו ללוח.
שימוש ב-Google Earth
אפשר לחשב את קו הרוחב וקו האורך של מיקום ב-Google Earth על ידי לחיצה על מיקום בממשק המשתמש וקריאת הנתונים מהפרטים של הסמן.
כדי לקבל את קו הרוחב וקו האורך של מיקום באמצעות Google Earth:
נכנסים ל-Google Earth במחשב.
עוברים לתפריט ההמבורגר
ובוחרים באפשרות סגנון מפה.
מעבירים את המתג בניינים בתלת-ממד למצב מושבת.
אחרי שמעבירים את המתג בניינים בתלת-ממד למצב מושבת, לוחצים על סמל הסיכה
כדי להוסיף סמן במיקום שנבחר.
מציינים פרויקט שיכלול את הסמן ולוחצים על שמירה.
בשדה כותרת של הסמן, מזינים שם לסמן.
לוחצים על החץ חזרה
בחלונית הפרויקט ובוחרים בתפריט
פעולות נוספות.
בתפריט, בוחרים באפשרות ייצוא כקובץ KML.
קובץ ה-KLM מדווח על קו הרוחב, קו האורך והגובה של הסמן בתג <coordinates>
, והוא מופרד בפסיקים, באופן הבא:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
אין להשתמש בקווי אורך ורוחב מתגי <LookAt>
, שמציינים את מיקום המצלמה ולא את המיקום.
מעבר למיקום הפיזי
אפשר לחשב את הגובה של מיקום מסוים על ידי הגעה אליו פיזית וביצוע תצפית מקומית.
מקבלים את הקוואטרניון של הסיבוב
GeospatialPose.EunRotation
מחלצת את הכיוון ממיקום גיאו-מרחבי ומפיקה פלט של קווטרניון שמייצג את מטריצת הסיבוב שהופכת וקטור מהיעד למערכת הקואורדינטות מזרח-למעלה-צפון (EUN). X+ מצביע מזרחה, Y+ מצביע על הרחקה מכוח הכבידה ו-Z+ מצביע על צפון.
עוגנים של WGS84
עוגן WGS84 הוא סוג של עוגן שמאפשר למקם תוכן תלת-ממדי בכל גובה, קו אורך ורוחב. לצורך ההצבה של המשחק בעולם האמיתי, הוא מסתמך על תנוחה וכיוון. המיקום מורכב מקווי רוחב, קו אורך וגובה, המוגדרים במערכת הקואורדינטות WGS84. הכיוון מורכב מסיבוב של קווטרניון.
הגובה מדווח במטרים מעל האליפסואיד WGS84, כך שגובה הקרקע לא מאפס. האפליקציה שלך אחראית לספק את הקואורדינטות האלה בכל עוגן שנוצר.
מיקום עוגן של WGS84 בעולם האמיתי
קביעת הגובה של מיקום
יש כמה דרכים לקבוע את הגובה של מיקום להצבת עוגנים:
- אם מיקום העוגן נמצא פיזית ליד המשתמש, ניתן להשתמש בגובה שדומה לגובה המכשיר של המשתמש.
- אחרי שמציינים את קו הרוחב וקו האורך, משתמשים ב-Heightion API כדי להציג גובה על סמך המפרט של EGM96. צריך להמיר את גובה EGM96 של Maps API ל-WGS84 לצורך השוואה מול הגובה
GeospatialPose
. ראו GeoidEval שכולל גם שורת פקודה וגם ממשק HTML. הממשק API של מפות Google מדווח על קווי אורך ורוחב בהתאם למפרט WGS84. - אפשר לקבל את קו הרוחב, קו האורך והגובה של מיקום מ-Google Earth. כך מקבלים מרווח שגיאה של עד כמה מטרים. שימוש בקווי רוחב, קו אורך וגובה מתוך התגים
<coordinates>
, ולא באמצעות התגים<LookAt>
בקובץ ה-KML. - אם עוגן קיים נמצא בקרבת מקום וגם אם אתם לא בשיפוע תלול, אפשר להשתמש בגובה מה-
GeospatialPose
של המצלמה בלי להשתמש במקור אחר, כמו ה-API של מפות Google.
יצירת העוגן
אחרי שרואים את קו הרוחב, קו האורך, הגובה וקווטרניון הסיבוב, משתמשים ב-ARAnchorManagerExtensions.AddAnchor()
כדי לעגן תוכן לקואורדינטות גיאוגרפיות שציינתם.
if (earthTrackingState == TrackingState.Tracking)
{
var anchor =
AnchorManager.AddAnchor(
latitude,
longitude,
altitude,
quaternion);
var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
מודעות עוגן לפני השטח
עוגן הוא סוג של עוגן שמאפשר להציב אובייקטים ב-AR רק באמצעות קווי רוחב ואורך, תוך שימוש במידע מ-VPS כדי למצוא את הגובה המדויק מעל פני הקרקע.
במקום להזין את הגובה הרצוי, אתם מציינים את הגובה מעל פני השטח. כאשר הערך הוא אפס, העוגן יהיה מיושר עם פני השטח.
הגדרת מצב איתור מטוס
חיפוש המטוס הוא אופציונלי ולא נדרש כדי להשתמש בעוגנים. הערה: נעשה שימוש רק במישורים אופקיים. מישורים אופקיים יעזרו ליישור דינמי של עוגנים על פני השטח.
חשוב לדעת שעוגנים של פני שטח מושפעים מHorizontal
ומHorizontal | Vertical
משתמשים בתפריט הנפתח מצב זיהוי כדי להגדיר את מצב הזיהוי:
יצירת עוגן באמצעות פני השטח באמצעות ה-API האסינכרוני החדש
כדי ליצור ולהציב עוגן שטח, קוראים לפונקציה ARAnchorManagerExtensions.resolveAnchorOnTerrainAsync()
.
העוגן לא יהיה מוכן מיד ויהיה צריך לפתור אותו. לאחר פתרון הבעיה, הבעיה תהיה זמינה בResolveAnchorOnTerrainPromise
.
public GameObject TerrainAnchorPrefab;
public void Update()
{
ResolveAnchorOnTerrainPromise terrainPromise =
AnchorManager.ResolveAnchorOnTerrainAsync(
latitude, longitude, altitudeAboveTerrain, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckTerrainPromise(terrainPromise));
}
private IEnumerator CheckTerrainPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.TerrainAnchorState == TerrainAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(TerrainAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
בודקים את מצב ההבטחה
להבטחה יהיה PromiseState
משויך.
מדינה | תיאור |
---|---|
Pending |
הפעולה עדיין בהמתנה. |
Done |
הפעולה הושלמה והתוצאה זמינה. |
Cancelled |
הפעולה בוטלה. |
בדיקת מצב העוגן של פני השטח של תוצאת ההבטחה
ה-TerrainAnchorState
שייך לפעולה האסינכרונית והוא חלק מהתוצאה הסופית של ההבטחה.
switch (result.TerrainAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case TerrainAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case TerrainAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case TerrainAnchorState.ErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
דיבלים לגגות
עוגנים לגגות הם סוג של עוגנים ודומים מאוד לעוגנים בפני השטח שלמעלה. ההבדל הוא שאתם תספקו את הגובה מעל הגג ולא את הגובה מעל פני השטח.
יצירת עוגן על הגג באמצעות ה-API האסינכרוני החדש
העוגן לא יהיה מוכן מיד ויהיה צריך לפתור אותו.
כדי ליצור ולהציב עוגן על הגג, קוראים לפונקציה ARAnchorManagerExtensions.resolveAnchorOnRooftopAsync()
. בדומה לעוגנים של פני השטח, תהיה גישה גם ל-PromiseState
של ההבטחה. לאחר מכן תוכלו לבדוק את תוצאת ההבטחה כדי לגשת אל RooftopAnchorState
.
public GameObject RooftopAnchorPrefab;
public void Update()
{
ResolveAnchorOnRooftopPromise rooftopPromise =
AnchorManager.ResolveAnchorOnRooftopAsync(
latitude, longitude, altitudeAboveRooftop, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckRooftopPromise(rooftopPromise));
}
private IEnumerator CheckRooftopPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.RooftopAnchorState == RooftopAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(RooftopAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
בודקים את מצב ההבטחה
להבטחה יהיה PromiseState
משויך. תוכלו לעיין בטבלה שלמעלה.
בדיקת מצב העוגן בגג של תוצאת ההבטחה
ה-RooftopAnchorState
שייך לפעולה האסינכרונית והוא חלק מהתוצאה הסופית של ההבטחה.
switch (result.RooftopAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case RooftopAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case RooftopAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case RooftopAnchorState.ErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
המאמרים הבאים
- חשוב לוודא שאתם מבינים את מכסת השימוש ב-API גיאו-מרחבית.