El SDK de Android XR ahora está disponible en la Versión preliminar para desarrolladores. Deseamos obtener tus comentarios. Visita nuestra
página de asistencia para comunicarte con nosotros.
Cómo detectar planos con ARCore para Jetpack XR
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
ARCore para Jetpack XR puede detectar superficies planas en el entorno del usuario y proporcionar información sobre ellas, como su posición, tamaño y orientación. Esto puede ayudar a tu app a encontrar superficies, como mesas, para colocar objetos.
Crea una sesión de ARCore para Jetpack XR
Accede a la información del plano a través de una sesión de ARCore para Jetpack XR. Consulta Comprende el ciclo de vida de una sesión para obtener un Session
.
La detección de planos no está habilitada de forma predeterminada en las sesiones de XR. Para habilitar el seguimiento de planos, configura la sesión y establece el modo PlaneTrackingMode.HORIZONTAL_AND_VERTICAL
:
val newConfig = session.config.copy(
planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL,
)
when (val result = session.configure(newConfig)) {
is SessionConfigureConfigurationNotSupported ->
TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)
is SessionConfigureSuccess -> TODO(/* Success! */)
else ->
TODO(/* A different unhandled exception was thrown. */)
}
Recupera el estado de los planos percibidos
ARCore para Jetpack XR proporciona el estado de los planos a través de un StateFlow
que emite el estado de los planos. Cuando te suscribes a los planos en una sesión, se notifica a tu app cuando se agregan, actualizan o quitan planos.
Plane.subscribe(session).collect { planes ->
// Planes have changed; update plane rendering
}
Un plano tiene las siguientes propiedades:
label
: Es una descripción semántica de un Plane
determinado. Puede ser WALL
, FLOOR
, CEILING
o TABLE
.
centerPose
: Es la posición del centro del plano detectado.
extents
: Son las dimensiones del plano detectado, en metros.
vertices
: Es una lista de vértices de un polígono convexo que se aproxima al plano.
Una prueba de posicionamiento es un método para calcular la intersección de un rayo con los objetos que se rastrean en la sesión. Una aplicación común de una prueba de posicionamiento es apuntar a una mesa y colocar un objeto en esa ubicación. La realización de una prueba de posicionamiento genera una lista de objetos alcanzados. En otras palabras, una prueba de impacto no se detiene en el primer objeto con el que se impacta. Sin embargo, a menudo, solo te interesará el primer objeto alcanzado de un tipo determinado.
Para realizar una prueba de posicionamiento, usa Interaction.hitTest()
con un Ray
:
val results = androidx.xr.arcore.hitTest(session, ray)
// When interested in the first Table hit:
val tableHit = results.firstOrNull {
val trackable = it.trackable
trackable is Plane && trackable.state.value.label == Plane.Label.TABLE
}
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-08-28 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-08-28 (UTC)"],[],[],null,["ARCore for Jetpack XR can detect flat surfaces in the user's environment and\nprovide information on them such as their pose, size, and orientation. This can\nhelp your app find surfaces like tables to place objects on.\n\nCreate an ARCore for Jetpack XR session\n\nAccess plane information through an ARCore for Jetpack XR session. See\n[Understand a Session's lifecycle](/develop/xr/jetpack-xr-sdk/work-with-arcore#session-lifecycle) to obtain a [`Session`](/reference/kotlin/androidx/xr/runtime/Session).\n\nConfigure the Session\n\nPlane detection is not enabled by default on XR sessions. To enable plane\ntracking, configure the session and set the\n[`PlaneTrackingMode.HORIZONTAL_AND_VERTICAL`](/reference/kotlin/androidx/xr/runtime/Config.PlaneTrackingMode#HORIZONTAL_AND_VERTICAL()) mode:\n\n\n```kotlin\nval newConfig = session.config.copy(\n planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL,\n)\nwhen (val result = session.configure(newConfig)) {\n is SessionConfigureConfigurationNotSupported -\u003e\n TODO(/* Some combinations of configurations are not valid. Handle this failure case. */)\n is SessionConfigureSuccess -\u003e TODO(/* Success! */)\n else -\u003e\n TODO(/* A different unhandled exception was thrown. */)\n}https://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/xr/src/main/java/com/example/xr/arcore/Planes.kt#L30-L39\n```\n\n\u003cbr /\u003e\n\n| **Note:** Plane tracking requires the `android.permission.SCENE_UNDERSTANDING_COARSE` [runtime permission](/training/permissions/requesting) to be granted to your app.\n\nRetrieve the state of perceived planes\n\nARCore for Jetpack XR provides the state of planes through a\n[`StateFlow`](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-state-flow/) that emits the state of planes. Subscribing to\nplanes in a session notifies your app when planes are added, updated, or\nremoved.\n\n\n```kotlin\nPlane.subscribe(session).collect { planes -\u003e\n // Planes have changed; update plane rendering\n}https://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/xr/src/main/java/com/example/xr/arcore/Planes.kt#L45-L47\n```\n\n\u003cbr /\u003e\n\nA plane has the following properties:\n\n- [`label`](/reference/kotlin/androidx/xr/arcore/Plane.State#label()): a semantic description of a given [`Plane`](/reference/kotlin/androidx/xr/arcore/Plane). Could be a [`WALL`](/reference/kotlin/androidx/xr/arcore/Plane.Label#WALL()), [`FLOOR`](/reference/kotlin/androidx/xr/arcore/Plane.Label#FLOOR()), [`CEILING`](/reference/kotlin/androidx/xr/arcore/Plane.Label#CEILING()), or [`TABLE`](/reference/kotlin/androidx/xr/arcore/Plane.Label#TABLE()).\n- [`centerPose`](/reference/kotlin/androidx/xr/arcore/Plane.State#centerPose()): The pose of the center of the detected plane.\n- [`extents`](/reference/kotlin/androidx/xr/arcore/Plane.State#extents()): The dimensions of the detected plane, in meters.\n- [`vertices`](/reference/kotlin/androidx/xr/arcore/Plane.State#vertices()): A list of vertices of a convex polygon that approximates the plane.\n\nPerform a hit-test against planes\n\nA hit-test is a method of calculating the intersection of a ray with objects\ntracked by the session. A common application of a hit-test is to point at a\ntable and place an object at that location. Conducting a hit-test results in a\nlist of hit objects. In other words, a hit-test doesn't stop at the first object\nhit. However, often you may only be interested in the first object hit of a\ngiven type.\n\nTo perform a hit-test, use [`Interaction.hitTest()`](/reference/kotlin/androidx/xr/arcore/package-summary#hittest) with a [`Ray`](/reference/kotlin/androidx/xr/runtime/math/Ray):\n\n\n```kotlin\nval results = androidx.xr.arcore.hitTest(session, ray)\n// When interested in the first Table hit:\nval tableHit = results.firstOrNull {\n val trackable = it.trackable\n trackable is Plane && trackable.state.value.label == Plane.Label.TABLE\n}https://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/xr/src/main/java/com/example/xr/arcore/Planes.kt#L55-L60\n```\n\n\u003cbr /\u003e"]]