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

תמונה ראשית (Hero) בעומק גיאו-מרחבי

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

מה השלב הבא?