מגדילים את הטווח בעזרת 'עומק גיאו-מרחבי'

תמונה ראשית – עומק גיאו-מרחבי

ARCore Depth API תומך עכשיו בעומק גיאו-מרחבי, שמגביר באופן אוטומטי את הטווח והמהירות של Depth API כשמופעלת גם גיאומטריה של Streetscape. כשנמצאים במיקום עם כיסוי VPS וכשמופעלת בו גיאומטריה של Streetscape, תמונות הפלט מ-Depth API כוללות גיאומטריית פני שטח וגאומטריה של מבנה שאוחזרו באזור עד ל-65 מטרים מהמיקום הנוכחי. נתוני העומק שמאוחזרים מגיאומטריה ממוזגים עם תצפיות עומק מקומיות ומתעדכנים כשהמשתמש עובר למיקום חדש.

קריאות ל-ARCore Depth API מספקות עכשיו תצפיות מקומיות מהמצלמה וגם בניינים ופני שטח מגיאומטריה של Streetscape, שמוזגו לתמונה אחת של עומק.

אין לי מכשיר תואם

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

השפעה על הביצועים

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

טווח עומק

ללא עומק גיאוגרפי, טווחים אופייניים בעומק תמונות הם במרחק של כ-20-30 מטרים, כאשר הצפיפות והדיוק של תצפיות העומק צומצמו מעבר לטווח זה. כאשר 'עומק גיאו-מרחבי' מופעל, ערכי העומק שנדגמו בצפיפות מגיעים למקסימום של 65.535 מטרים, גם עם מעט תנועה ראשונית.

תרחישים לדוגמה

אפשר להשתמש ב-ARCore Depth API בכל תרחישי השימוש הקיימים שכבר נתמכים. עם נתוני עומק גיאוגרפי-מרחבי, תמונות עומק שיושגו במיקומים עם תמיכה ב-VPS יאוכלסו בעומק טווח ארוך מהר יותר מבעבר. כך ניתן יהיה להשתמש בתרחישי שימוש שמתמקדים בעומק טווח ארוך בסביבות חוץ. דוגמאות לתרחישים לדוגמה:

  • חסימות בקנה מידה גדול של תוכן וירטואלי ואפקטים חזותיים אחרים
  • ניווט בחוץ
  • מדידות מרחק

מגבלות

התכונה 'עומק גיאו-מרחבי' נתמכת רק באזורים שתומכים בלוקליזציה של VPS ובגיאומטריה של Streetscape. באזורים אחרים, ARCore Depth API יפעל כרגיל ללא ערכים גיאו-מרחביים.

דרישות מוקדמות

לפני שממשיכים, חשוב לוודא שאתם מבינים את המושגים הבסיסיים של AR ואת האופן שבו מגדירים סשן של ARCore.

הפעלת 'עומק גיאו-מרחבי'

בסשן חדש של ARCore, צריך לבדוק אם מכשיר של משתמש תומך ב'עומק' וב-Geospatial API. לא כל המכשירים שתואמים ל-ARCore תומכים ב-Depth API בגלל אילוצי כוח עיבוד.

כברירת מחדל, כדי לחסוך במשאבים, העומק מושבת ב-ARCore. כדי שהאפליקציה תשתמש ב-Depth API, צריך להפעיל את מצב העומק. בנוסף, כדאי להפעיל מצב גיאו-מרחבי וגיאומטריה ב-Streetscape כדי להשתמש בעומק גיאו-מרחבי.

Java

Config config = session.getConfig();

// Check whether the user's device supports the Depth API.
boolean isDepthSupported = session.isDepthModeSupported(Config.DepthMode.AUTOMATIC);
boolean isGeospatialSupported =
    session.isGeospatialModeSupported(Config.GeospatialMode.ENABLED);
if (isDepthSupported && isGeospatialSupported) {
  // These three settings are needed to use Geospatial Depth.
  config.setDepthMode(Config.DepthMode.AUTOMATIC);
  config.setGeospatialMode(Config.GeospatialMode.ENABLED);
  config.setStreetscapeGeometryMode(Config.StreetscapeGeometryMode.ENABLED);
}
session.configure(config);

Kotlin

val config = session.config

// Check whether the user's device supports the Depth API.
val isDepthSupported = session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)
val isGeospatialSupported = session.isGeospatialModeSupported(Config.GeospatialMode.ENABLED)
if (isDepthSupported && isGeospatialSupported) {
  // These three settings are needed to use Geospatial Depth.
  config.depthMode = Config.DepthMode.AUTOMATIC
  config.geospatialMode = Config.GeospatialMode.ENABLED
  config.streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED
}
session.configure(config)

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

Java

// Retrieve the depth image for the current frame, if available.
Image depthImage = null;
try {
  depthImage = frame.acquireDepthImage16Bits();
  // Use the depth image here.
} catch (NotYetAvailableException e) {
  // This means that depth data is not available yet.
  // Depth data will not be available if there are no tracked
  // feature points. This can happen when there is no motion, or when the
  // camera loses its ability to track objects in the surrounding
  // environment.
} finally {
  if (depthImage != null) {
    depthImage.close();
  }
}

Kotlin

// Retrieve the depth image for the current frame, if available.
try {
  frame.acquireDepthImage16Bits().use { depthImage ->
    // Use the depth image here.
  }
} catch (e: NotYetAvailableException) {
  // This means that depth data is not available yet.
  // Depth data will not be available if there are no tracked
  // feature points. This can happen when there is no motion, or when the
  // camera loses its ability to track objects in the surrounding
  // environment.
}

מה השלב הבא?