עוגנים גיאו-מרחביים הם סוג של עוגן שמאפשרים למקם תוכן תלת-ממדי בעולם האמיתי.
סוגי עוגנים גיאו-מרחביים
יש שלושה סוגים של עוגנים גיאו-מרחביים, שכל אחד מהם מטפל בגובה באופן שונה:
עוגנים מסוג WGS84:
עוגנים מסוג WGS84 מאפשרים להציב תוכן תלת-ממדי בכל קו רוחב, קו אורך וגובה נתונים.עוגנים את פני השטח:
עוגנים לשטח מאפשרים להציב תוכן רק באמצעות קווי רוחב ואורך, עם גובה יחסי לפני השטח במיקום הזה. הגובה נקבע ביחס לקרקע או לרצפה כפי שהם ידועים ל-VPS.נקודות עיגון על גג:
נקודות עיגון על גג מאפשרות לכם למקם תוכן באמצעות קו רוחב וקו אורך בלבד, עם גובה יחסי לגג של בניין במיקום הזה. הגובה נקבע ביחס לחלק העליון של המבנה, כפי שמצוין בגיאומטריה של סביבת הרחוב. ברירת המחדל של ההגדרה הזו היא גובה פני השטח אם לא מגדירים אותה על מבנה.
WGS84 | פני השטח | גג | |
---|---|---|---|
מיקום אופקי | קו רוחב, קו אורך | קו רוחב, קו אורך | קו רוחב, קו אורך |
מיקום אנכי | ביחס לגובה WGS84 | יחסית לגובה פני השטח שנקבע על ידי מפות Google | יחסית לגובה הגג, כפי שנקבע על ידי מפות Google |
האם צריך לפתור את הבעיה ברמת השרת? | לא | כן | כן |
דרישות מוקדמות
לפני שתמשיכו, חשוב להפעיל את Geospatial API.
מיקום עוגנים גיאו-מרחביים
לכל סוג של עוגן יש ממשקי API ייעודיים ליצירתו. מידע נוסף זמין במאמר סוגי עוגנים גיאו-מרחביים.
יצירת עוגן מבדיקת היטים
אפשר גם ליצור עוגן גיאו-מרחבי מתוצאת בדיקת היעד.
משתמשים ב-Transform מהבדיקה להיט וממירים אותו ל-GARGeospatialTransform
. אפשר להשתמש בו כדי להציב כל אחד מ-3 סוגי הווידג'טים של עוגנים שמפורטים למעלה.
אחזור טרנספורמציה גיאוגרפית מטרנספורמציית AR
GARSession.geospatialTransformFromTransform:error:
מספק דרך נוספת לקבוע את קו הרוחב וקו האורך על ידי המרת טרנספורמציה של AR לטרנספורמציה גיאו-מרחבית.
אחזור טרנספורמציה של AR מטרנספורמציה גיאו-מרחבית
הפונקציה GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error:
ממירה מיקום אופקי, גובה וסיבוב קווטרניון שצוינו בכדור הארץ ביחס למסגרת קואורדינטות מזרח-מעלה-דרום לטרנספורמציה AR ביחס לקואורדינטה בעולם של GL.
בחירת השיטה שמתאימה לתרחיש לדוגמה
לכל שיטה ליצירת עוגן יש יתרונות וחסרונות שחשוב לזכור:
- כשמשתמשים בגיאומטריה של סביבת הרחוב, צריך להשתמש בבדיקת היטים כדי לצרף תוכן לבניין.
- עדיף להשתמש בעוגנים של פני השטח או של גגות במקום בעוגנים של WGS84, כי הם מבוססים על ערכי גובה שנקבעו על ידי מפות Google.
איך מוצאים את קו הרוחב וקו האורך של מיקום מסוים
יש שלוש דרכים לחשב את קו הרוחב ואת קו האורך של מיקום:
- אפשר להשתמש בתכונה יוצר גיאו-מרחבי כדי להציג את העולם ולהרחיב אותו באמצעות תוכן תלת-ממדי בלי להגיע למיקום פיזי. כך תוכלו למקם ב-Unity Editor תוכן תלת-ממדי חזותי באמצעות מפות Google. קווי הרוחב והאורך, הזווית והגובה של התוכן יחושבו באופן אוטומטי.
- שימוש במפות Google
- להשתמש ב-Google Earth. שימו לב שהשגת הקואורדינטות האלה באמצעות Google Earth, בניגוד למפות Google, תעניק לכם מרווח שגיאה של עד כמה מטרים.
- מעבר למיקום הפיזי
שימוש במפות Google
כדי לקבל את קווי הרוחב והאורך של מיקום מסוים באמצעות מפות Google:
נכנסים למפות Google במחשב.
עוברים אל שכבות > אפשרויות נוספות.
משנים את סוג המפה ללוויין ומבטלים את הסימון בתיבה תצוגת כדור הארץ בפינה הימנית התחתונה של המסך.
כך תאלצו להשתמש בתצוגה דו-ממדית, ותמנעו שגיאות שעלולות לנבוע מתצוגה תלת-ממדית בזווית.
במפה, לוחצים לחיצה ימנית על המיקום ובוחרים את קו הרוחב/האורך כדי להעתיק אותו ללוח.
שימוש ב-Google Earth
אפשר לחשב את קו הרוחב וקו האורך של מיקום ב-Google Earth על ידי לחיצה על מיקום בממשק המשתמש וקריאת הנתונים מהפרטים של הסמן.
כדי לקבל את קו הרוחב ואת קו האורך של מיקום מסוים באמצעות Google Earth:
נכנסים אל Google Earth במחשב.
עוברים לתפריט ההמבורגר ובוחרים באפשרות סגנון המפה.
מעבירים את המתג בניינים תלת-ממדיים למצב כבוי.
אחרי שמעבירים את המתג בניינים בתלת-ממד למצב מושבת, לוחצים על סמל הסיכה כדי להוסיף סמן במיקום שנבחר.
מציינים פרויקט שיכלול את הסמן ולוחצים על שמירה.
בשדה Title של סמן המקום, מזינים שם לסמן המקום.
לוחצים על החץ לאחור בחלונית הפרויקט ובוחרים בתפריט More Actions (פעולות נוספות).
בתפריט, בוחרים באפשרות ייצוא כקובץ KML.
קובץ KLM מדווח על קווי הרוחב והאורך והגובה של סמנים במיקומים שונים בתג <coordinates>
, מופרדים בפסיקים, באופן הבא:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
אין להשתמש בקווי הרוחב והאורך מהתגים <LookAt>
, שמציינים את מיקום המצלמה ולא את המיקום.
מעבר למיקום הפיזי
כדי לחשב את הגובה של מיקום מסוים, צריך להגיע אליו פיזית ולבצע תצפית מקומית.
אחזור של קוואטרניון הרוטציה
הפונקציה GARGeospatialTransform.eastUpSouthQTarget
מחלצת את הכיוון מטרנספורמציה גיאו-מרחית ומפיקה קוואטרניון שמייצג את מטריצת הסיבוב שממירה וקטור מהיעד למערכת הקואורדינטות מזרח-מעלה-דרום (EUS). X+ מצביע למזרח, Y+ מצביע למעלה ו-Z+ מצביע לדרום. הערכים נכתבים בסדר {x, y, z, w}
.
עוגנים של WGS84
עוגן WGS84 הוא סוג של עוגן שמאפשר להציב תוכן תלת-ממדי בכל קו רוחב, קו אורך וגובה נתונים. המערכת מסתמכת על טרנספורמציה וכיוון הצילום כדי להופיע בעולם האמיתי. המיקום מורכב מקווי רוחב, קו אורך וגובה, שמצוינים במערכת הקואורדינטות WGS84. הכיוון מורכב מסיבוב של קווטרניון.
הגובה מדווח במטרים מעל אליפסואיד העזר WGS84, כך שגובה הקרקע לא אפס. האפליקציה שלכם אחראית לספק את הקואורדינטות האלה לכל עוגן שנוצר.
הצבת עוגן WGS84 בעולם האמיתי
חישוב הגובה של מיקום
יש כמה דרכים לקבוע את הגובה של מיקום מסוים לצורך הצבת עוגנים:
- אם המיקום של הציון הפיזי קרוב פיזית למשתמש, אפשר להשתמש בגובה שדומה לגובה של המכשיר של המשתמש.
- אחרי שמציינים את קו הרוחב וקו האורך, משתמשים ב-Heightion API כדי להציג גובה על סמך המפרט של EGM96. צריך להמיר את גובה EGM96 של Maps API ל-WGS84 לצורך השוואה מול הגובה
GARGeospatialTransform
. אפשר להיעזר ב-GeoidEval, שיש לו גם שורת פקודה וגם ממשק HTML. הממשק API של מפות Google מדווח על קווי אורך ורוחב בהתאם למפרט WGS84. - אפשר לקבל את קו הרוחב, קו האורך והגובה של מיקום מסוים מ-Google Earth. הפעולה הזו תיצור מרווח שגיאה של עד כמה מטרים. משתמשים בקו הרוחב, קו האורך והגובה מהתגים
<coordinates>
, לא מהתגים<LookAt>
, בקובץ ה-KML. - אם יש עוגן קיים בקרבת מקום וגם אם אתם לא נמצאים במורד תלול, יכול להיות שתוכלו להשתמש בגובה מ-
GARGeospatialTransform
של המצלמה בלי להשתמש במקור אחר, כמו Maps API.
יצירת העוגן
אחרי שקיבלתם את קווי האורך, הרוחב והסיבוב, השתמשו ב-createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error:
כדי לעגן תוכן לקואורדינטות גיאוגרפיות שציינתם.
NSError *error = nil;
GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
altitude:altitude
eastUpSouthQAnchor:eastUpSouthQAnchor
error:&error];
עוגנים של שטח
עוגן הוא סוג של עוגן שמאפשר להציב אובייקטים ב-AR רק באמצעות קווי רוחב ואורך, תוך שימוש במידע מ-VPS כדי למצוא את הגובה המדויק מעל פני הקרקע.
במקום להזין את הגובה הרצוי, צריך לציין את הגובה מעל פני השטח. כשהערך הוא אפס, הציר יהיה בגובה הקרקע.
הגדרת מצב איתור מטוס
איתור המטוס הוא אופציונלי ולא נדרש כדי להשתמש בעוגנים. שימו לב: המערכת משתמשת רק בתוכניות אופקיות. מישורים אופקיים יעזרו ליישר באופן דינמי את עוגני השטח על הקרקע.
אפשר לבחור איך האפליקציה תזהה מטוסים באמצעות ARWorldTrackingConfiguration.PlaneDetection
.
יצירת עוגן של Terrain באמצעות ה-API האסינכרוני החדש
כדי ליצור ולהציב עוגן שטח, קוראים לפונקציה GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error:
.
העוגן לא יהיה מוכן מיד ויהיה צריך לפתור את הבעיה. לאחר הטיפול, הוא יהיה זמין בGARCreateAnchorOnTerrainFuture
.
GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
altitudeAboveTerrain:altitude
eastUpSouthQAnchor:eastUpSouthQTarget
completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
// handle completion
}
error:&error];
מה יהיה העתיד?
ל-Future יהיה GARFutureState
משויך.
מדינה | תיאור |
---|---|
GARFutureStatePending |
הפעולה עדיין בהמתנה. |
GARFutureStateDone |
הפעולה הושלמה והתוצאה זמינה. |
GARFutureStateCancelled |
הפעולה בוטלה. |
בודקים את מצב הצמדת התצוגה של התוצאה 'עתיד'.
הערך GARTerrainAnchorState
שייך לפעולה האסינכרונית והוא חלק מהתוצאה הסופית של Future.
switch (future.resultTerrainAnchorState) {
case GARTerrainAnchorStateSuccess:
// Terrain anchor finished resolving.
break;
case GARTerrainAnchorStateErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case GARTerrainAnchorStateErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
// for troubleshooting steps.
break;
case GARTerrainAnchorStateErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
עוגנים לגג
מודעות עוגן על גגות הן סוג של עוגן, והן דומות מאוד למודעות עוגן על פני השטח שמתוארות למעלה. ההבדל הוא שתצטרכו לספק את הגובה מעל הגג ולא את הגובה מעל פני השטח.
יצירת עוגן על הגג באמצעות ה-API האסינכרוני החדש
ה-anchor לא יהיה מוכן באופן מיידי, וצריך להמתין עד שהוא יתעדכן.
כדי ליצור ולמקם ציון 'גג', קוראים לפונקציה GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error:
. בדומה לעוגנים של פני השטח, תהיה לך גם גישה ל-GARFutureState
של העתיד. לאחר מכן תוכלו לבדוק את התוצאה 'עתיד' כדי לגשת ל-GARRooftopAnchorState
.
GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
altitudeAboveRooftop:altitude
eastUpSouthQAnchor:eastUpSouthQTarget
completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
// handle completion
}
error:&error];
בדיקת סטטוס העתיד
לעתיד יהיה GARFutureState
משויך, ראו בטבלה שלמעלה.
בדיקת מצב העוגן בגג של התוצאה העתידית
GARRooftopAnchorState
שייך לפעולה האסינכרונית והוא חלק מהתוצאה העתידית הסופית.
switch (future.resultRooftopAnchorState) {
case GARRooftopAnchorStateSuccess:
// Rooftop anchor finished resolving.
break;
case GARRooftopAnchorStateErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case GARRooftopAnchorStateErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
// for troubleshooting steps.
break;
case GARRooftopAnchorStateErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
המאמרים הבאים
- חשוב לוודא שאתם מבינים את מכסת השימוש ב-API של Geospatial.