Utiliser les bâtiments et le relief qui vous entourent dans le SDK Android (Kotlin/Java)

Les API Streetscape Geometry fournissent la géométrie du terrain, des bâtiments ou d'autres structures d'une scène. La géométrie peut être utilisée pour l'occlusion, le rendu ou le placement de contenu RA via des API de test de collision. Les données de géométrie du paysage urbain sont obtenues à partir des images Google Street View.

Essayer l'exemple

L'application exemple geospatial_java montre comment obtenir et afficher des géométries de paysage urbain.

Configurer l'API Geospatial

Pour utiliser Streetscape Geometry, vous devez configurer l'API Geospatial dans votre projet. Pour configurer l'API Geospatial, suivez les instructions de la section Activer l'API Geospatial.

Activer la géométrie de paysage urbain

L'API Geospatial obtient les données Streetscape Geometry lorsque GeospatialMode est défini sur GeospatialMode.ENABLED et StreetscapeGeometryMode sur StreetscapeGeometryMode.ENABLED.

Java

Config config = session.getConfig();
// Streetscape Geometry requires the Geospatial API to be enabled.
config.setGeospatialMode(Config.GeospatialMode.ENABLED);
// Enable Streetscape Geometry.
config.setStreetscapeGeometryMode(Config.StreetscapeGeometryMode.ENABLED);
session.configure(config);

Kotlin

session.configure(
  session.config.apply {
    // Streetscape Geometry requires the Geospatial API to be enabled.
    geospatialMode = Config.GeospatialMode.ENABLED
    // Enable Streetscape Geometry.
    streetscapeGeometryMode = Config.StreetscapeGeometryMode.ENABLED
  }
)

Obtenir une géométrie de paysage urbain dans une session ARCore

Utilisez Session.getAllTrackables() et StreetscapeGeometry.class pour filtrer les résultats.

Java

session.getAllTrackables(StreetscapeGeometry.class);

Kotlin

session.getAllTrackables(StreetscapeGeometry::class.java)

Comprendre StreetscapeGeometry

StreetscapeGeometry contient des informations sur un bâtiment:

Niveau de détail 1 du bâtiment

StreetscapeGeometry.Quality.BUILDING_LOD_1 correspond à l'empreinte de bâtiment extrudée vers le haut sur une surface plane. Les hauteurs des bâtiments peuvent être inexactes.

Niveau de détail 2 du bâtiment

StreetscapeGeometry.Quality.BUILDING_LOD_2 aura une géométrie plus fidèle. Les murs et les toits en réseau maillé correspondent plus précisément à la forme du bâtiment. Les éléments plus petits, comme les cheminées ou les ouvertures de toit, peuvent quand même percer à l'extérieur du maillage.

Comprendre Mesh

Mesh est un maillage polygonal représentant une reconstruction de surface de la géométrie du paysage urbain. Chaque Mesh inclut un tampon de sommets et un tampon d'indices:

Joindre du contenu RA à un StreetscapeGeometry

Il existe deux façons d'associer du contenu RA à Streetscape Geometry:

Effectuer un test de positionnement sur StreetscapeGeometry

Frame.hitTest() peut être utilisé pour effectuer un test de positionnement sur la géométrie du paysage urbain. Si des intersections sont détectées, HitResult contient des informations sur la pose concernant l'emplacement de l'impact, ainsi qu'une référence à l'élément StreetscapeGeometry qui a été touché. Cette géométrie de paysage Streetscape peut être transmise à Trackable.createAnchor() pour créer une ancre associée.

Java

for (HitResult hit : frame.hitTest(singleTapEvent)) {
  if (hit.getTrackable() instanceof StreetscapeGeometry) {
    Pose hitPose = hit.getHitPose();
    hit.getTrackable().createAnchor(hitPose);
  }
}

Kotlin

for (hit in frame.hitTest(singleTapEvent)) {
  if (hit.trackable is StreetscapeGeometry) {
    val hitPose = hit.hitPose
    hit.trackable.createAnchor(hitPose)
  }
}

Activer Geospatial Depth

Geospatial Depth combine Streetscape Geometry avec l'entrée des capteurs locaux pour améliorer les données de profondeur. Lorsque Geospatial Depth est activé, la profondeur de sortie et les images de profondeur brutes sont modifiées pour inclure la géométrie du paysage urbain échantillonnée en plus de la profondeur observée localement. Cela peut améliorer la précision des poses avec la profondeur.