Extensión de OpenXR XR_ANDROID_scene_meshing

Cadena de nombre XR_ANDROID_scene_meshing

Tipo de extensión Extensión de instancia

Número de extensión registrado 464

Revisión 3

Dependencias de extensiones y versiones OpenXR 1.0

Fecha de última modificación 2025-05-15

Estado de IP No se conocen reclamos de IP.

Colaboradores Spencer Quin, Google Jared Finder, Google Antonio Fontan, Google Cairn Overturf, Google Nihav Jain, Google Salar Khan, Google Sebastian Klose, Google Jürgen Sturm, Google Vinny DaSilva, Google Ricardo Campbell, Google

Descripción general

Esta extensión tiene como objetivo proporcionar datos de malla para las mallas que representan aproximadamente los objetos físicos de tu entorno. Se puede usar para visualizar tu escena en una aplicación envolvente y permitir que los objetos virtuales interactúen con los objetos físicos, como las colisiones.

Los datos de la malla de la escena pueden ser información personal sensible y están estrechamente vinculados a la privacidad y la integridad personales. Se recomienda encarecidamente que las aplicaciones que almacenan o transfieren datos de mallado de escenas siempre soliciten al usuario que acepte de forma activa y específica hacerlo.

Permisos

Las aplicaciones para Android deben tener el permiso android.permission.SCENE_UNDERSTANDING_FINE incluido en su manifiesto. El permiso android.permission.SCENE_UNDERSTANDING_FINE se considera un permiso sensible, ya que permite que el tiempo de ejecución estudie el entorno del usuario.

La aplicación debe solicitar el permiso durante el tiempo de ejecución para usar estas funciones:

(nivel de protección: peligroso)

Inspecciona la capacidad del sistema

Una aplicación puede inspeccionar si el sistema es capaz de realizar el mallado de la escena encadenando una estructura XrSystemSceneMeshingPropertiesANDROID al XrSystemProperties cuando se llama a xrGetSystemProperties.

XrSystemSceneMeshingPropertiesANDROID

typedef struct XrSystemSceneMeshingPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;

Descripciones de miembros

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.
  • supportsSceneMeshing es un XrBool32 que indica si el sistema admite el mallado de escenas.

Si supportsSceneMeshing es XR_FALSE, el sistema no admite la generación de mallas de escenas. La aplicación debe evitar usar la funcionalidad de mallado de escena cuando supportsSceneMeshing es XR_FALSE, ya que las llamadas a xrCreateSceneMeshingTrackerANDROID fallarán.

Si supportsSceneMeshing es XR_TRUE, el sistema admite el mallado de escenas.

Uso válido (implícito)

XrSceneMeshSemanticLabelSetANDROID

La enumeración XrSceneMeshSemanticLabelSetANDROID describe los conjuntos de etiquetas semánticas para la generación de mallas de escenas. Cada valor de este enum representa otro enum que contiene las etiquetas semánticas. Por ejemplo, el valor XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID representa el conjunto XrSceneMeshSemanticLabelANDROID.

typedef enum XrSceneMeshSemanticLabelSetANDROID {
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID = 0,
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID = 1,
    XR_SCENE_MESH_SEMANTIC_LABEL_SET_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelSetANDROID;

xrEnumerateSupportedSemanticLabelSetsANDROID

La aplicación puede obtener conjuntos de etiquetas semánticas compatibles con el sistema a través de la función xrEnumerateSupportedSemanticLabelSetsANDROID.

XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    supportedSemanticLabelSetsInputCapacity,
    uint32_t*                                   supportedSemanticLabelSetsOutputCount,
    XrSceneMeshSemanticLabelSetANDROID*         supportedSemanticLabelSets);

Descripciones de parámetros

  • instance es un XrInstance creado por la aplicación.
  • systemId es un XrSystemId que se reintenta desde xrGetSystem.
  • supportedSemanticLabelSetsInputCapacity es la longitud de supportedSemanticLabelSets.
  • supportedSemanticLabelSetsOutputCount es la cantidad de elementos en supportedSemanticLabelSets modificados por el tiempo de ejecución a partir del comienzo del array.
  • supportedSemanticLabelSets es un array de XrSceneMeshSemanticLabelSetANDROID en el que el tiempo de ejecución escribe los conjuntos de etiquetas semánticas admitidos.

Se espera que todos los sistemas admitan al menos XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID, ya que este valor de enumeración representa que no se estableció ninguna etiqueta semántica y se puede usar en el caso de que la aplicación no necesite semántica de vértices.

Crea un identificador de seguimiento de unión de mallas

XrSceneMeshingTrackerANDROID

XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)

El controlador XrSceneMeshingTrackerANDROID representa un objeto de seguimiento de la malla de la escena para la malla de la escena y la administración de los recursos relacionados.

Este identificador se puede usar para crear una instantánea de la malla de la escena con xrCreateSceneMeshSnapshotANDROID en esta extensión.

xrCreateSceneMeshingTrackerANDROID

Una aplicación puede crear un controlador XrSceneMeshingTrackerANDROID con la función xrCreateSceneMeshingTrackerANDROID.

XrResult xrCreateSceneMeshingTrackerANDROID(
    XrSession                                   session,
    const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
    XrSceneMeshingTrackerANDROID*               tracker);

Descripciones de parámetros

Si el sistema no admite el mallado de escenas, xrCreateSceneMeshingTrackerANDROID devolverá XR_ERROR_FEATURE_UNSUPPORTED. La aplicación puede verificar la compatibilidad del sistema llamando a xrGetSystemProperties con la estructura XrSystemSceneMeshingPropertiesANDROID.

Solo se pueden usar los conjuntos de etiquetas semánticas compatibles con el sistema en XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet cuando se crea un objeto de seguimiento de malla de escena. La función xrEnumerateSupportedSemanticLabelSetsANDROID se puede usar para obtener la lista de conjuntos de etiquetas semánticas admitidos.

Si la aplicación solicita un semanticLabelSet no admitido, xrCreateSceneMeshingTrackerANDROID devolverá XR_ERROR_FEATURE_UNSUPPORTED.

El identificador de xrCreateSceneMeshingTrackerANDROID posee todos los recursos para el mallado de la escena. Una vez que finalice la experiencia de mallado de la escena, la aplicación debe destruir el identificador a través de la función xrDestroySceneMeshingTrackerANDROID.

XrSceneMeshingTrackerCreateInfoANDROID

La estructura XrSceneMeshingTrackerCreateInfoANDROID describe la información para crear un identificador XrSceneMeshingTrackerANDROID.

typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
    XrStructureType                       type;
    const void*                           next;
    XrSceneMeshSemanticLabelSetANDROID    semanticLabelSet;
    XrBool32                              enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;

Descripciones de miembros

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.
  • semanticLabelSet es un XrSceneMeshSemanticLabelSetANDROID que se usa para especificar el conjunto de etiquetas semánticas que se utilizará para el mallado de la escena. Si se establece en XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID, el tiempo de ejecución ignorará el campo de búfer XrSceneSubmeshDataANDROID::vertexSemantics.
  • enableNormals es un XrBool32 que se usa para especificar si se deben incluir las normales de los vértices de la malla en el búfer de malla de la escena cuando se obtienen los datos de la malla de la escena.

xrDestroySceneMeshingTrackerANDROID

La función xrDestroySceneMeshingTrackerANDROID libera el tracker y los recursos subyacentes cuando se termina con las experiencias de mallado de la escena.

XrResult xrDestroySceneMeshingTrackerANDROID(
    XrSceneMeshingTrackerANDROID          tracker);

Descripciones de parámetros

Crea un identificador de instantánea de malla de escena

XrSceneMeshSnapshotANDROID

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

El identificador XrSceneMeshSnapshotANDROID representa una instantánea de la malla de la escena. Se crea con xrCreateSceneMeshSnapshotANDROID, que básicamente toma una instantánea de los datos de la malla de la escena en el momento de la llamada a la función.

Este identificador se puede usar para recuperar información y datos de la submalla con xrGetAllSubmeshStatesANDROID y xrGetSubmeshDataANDROID.

XrSceneMeshSnapshotCreateInfoANDROID

La estructura XrSceneMeshSnapshotCreateInfoANDROID describe la información para crear un identificador XrSceneMeshSnapshotANDROID.

typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            baseSpace;
    XrTime             time;
    XrBoxf             boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;

Descripciones de miembros

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.
  • baseSpace es un XrSpace que se usa para describir el espacio de referencia en el que se debe representar la información de posición de las submallas de la escena.
  • time es el XrTime que describe el momento en que se procesará o mostrará la malla de la escena.
  • boundingBox es un XrBoxf que describe el cuadro de límite dentro del cual se debe adquirir la malla de la escena.

XrSceneMeshTrackingStateANDROID

La enumeración XrSceneMeshTrackingStateANDROID describe el estado del seguimiento para el rastreador de mallado de la escena. Cada valor de esta enumeración representa un estado del objeto de seguimiento de la malla de la escena. Es un enum que se incluye en la estructura XrSceneMeshSnapshotCreationResultANDROID, que se devuelve desde xrCreateSceneMeshSnapshotANDROID.

typedef enum XrSceneMeshTrackingStateANDROID {
    XR_SCENE_MESH_TRACKING_STATE_INITIALIZING_ANDROID = 0,
    XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID = 1,
    XR_SCENE_MESH_TRACKING_STATE_WAITING_ANDROID = 2,
    XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID = 3,
    XR_SCENE_MESH_TRACKING_STATE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshTrackingStateANDROID;

XrSceneMeshSnapshotCreationResultANDROID

La estructura XrSceneMeshSnapshotCreationResultANDROID almacena el resultado de la creación de una instantánea de malla de escena que se devolvió desde xrCreateSceneMeshSnapshotANDROID. El resultado incluye el identificador de la instantánea y el estado de seguimiento del objeto de seguimiento de la malla de la escena en el momento de la creación de la instantánea.

typedef struct XrSceneMeshSnapshotCreationResultANDROID {
    XrStructureType                  type;
    void*                            next;
    XrSceneMeshSnapshotANDROID       snapshot;
    XrSceneMeshTrackingStateANDROID    trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;

Descripciones de miembros

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.
  • snapshot es un identificador de XrSceneMeshSnapshotANDROID creado por el tiempo de ejecución.
  • trackingState es un XrSceneMeshTrackingStateANDROID que describe el estado del objeto de seguimiento de la malla de la escena en el momento de la creación de la instantánea.

xrCreateSceneMeshSnapshotANDROID

La aplicación puede usar la función xrCreateSceneMeshSnapshotANDROID para crear una instantánea de la malla de la escena a partir del objeto de seguimiento de la malla de la escena. Esta función devuelve un identificador de XrSceneMeshSnapshotANDROID junto con XrSceneMeshTrackingStateANDROID encapsulado en una estructura de XrSceneMeshSnapshotCreationResultANDROID. Técnicamente, el identificador es una instantánea de los datos de la malla de la escena en el momento de la creación. Este identificador se puede usar para consultar la información y los datos de la malla de la escena con xrGetAllSubmeshStatesANDROID y xrGetSubmeshDataANDROID, respectivamente.

XrResult xrCreateSceneMeshSnapshotANDROID(
    XrSceneMeshingTrackerANDROID                tracker,
    const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
    XrSceneMeshSnapshotCreationResultANDROID*   outSnapshotCreationResult);

Descripciones de parámetros

Cómo adquirir datos de la malla de la escena a partir de la instantánea de la malla de la escena

XrSceneSubmeshStateANDROID

XrSceneSubmeshStateANDROID describe una malla secundaria. Contiene la información básica sobre la submalla (ID, posición, límites, hora de la última actualización).

typedef struct XrSceneSubmeshStateANDROID {
    XrStructureType    type;
    void*              next;
    XrUuid             submeshId;
    XrTime             lastUpdatedTime;
    XrPosef            submeshPoseInBaseSpace;
    XrExtent3Df        bounds;
} XrSceneSubmeshStateANDROID;

Descripciones de miembros

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.
  • submeshId es un XrUuid que identifica la submalla.
  • lastUpdatedTime es un XrTime que representa el momento en que se actualizó la submalla por última vez.
  • submeshPoseInBaseSpace es un XrPosef que representa la pose de la submalla en el espacio base que se usó para crear la instantánea de la malla de la escena. Esta también es la posición del centro del cuadro delimitador de la submalla.
  • bounds es un XrExtent3Df que describe las dimensiones del cuadro de límite que encierra la submalla. Estos límites se encuentran en el espacio base que se usó para crear el identificador de la malla de la escena.

xrGetAllSubmeshStatesANDROID

La aplicación puede usar la función xrGetAllSubmeshStatesANDROID para obtener el estado de todas las submallas en la malla de la escena. Contiene información básica para permitir que la aplicación seleccione las submallas para las que desea datos. Esta función se puede usar en una expresión idiomática de 2 llamadas.

XrResult xrGetAllSubmeshStatesANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshStateCapacityInput,
    uint32_t*                             submeshStateCountOutput,
    XrSceneSubmeshStateANDROID*           submeshStates);

Descripciones de parámetros

  • snapshot es un identificador de XrSceneMeshSnapshotANDROID creado anteriormente con xrCreateSceneMeshSnapshotANDROID.
  • submeshStateCapacityInput es la longitud de submeshStates.
  • submeshStateCountOutput es la cantidad de elementos de submeshStates que se modifican en el tiempo de ejecución a partir del comienzo del array.
  • submeshStates es un array de estructuras XrSceneSubmeshStateANDROID en el que el tiempo de ejecución generará el estado de todas las submallas de la malla de la escena.

XrSceneSubmeshDataANDROID

XrSceneSubmeshDataANDROID contiene los datos de triángulos de una submalla junto con el ID de la submalla. Esta estructura se usa en xrGetSubmeshDataANDROID para obtener los datos de la submalla. La aplicación debe establecer el ID de la submalla de esta estructura y los punteros del búfer en los búferes asignados para que los datos devueltos de la submalla se puedan propagar en los búferes asignados. La aplicación puede usar xrGetSubmeshDataANDROID como un modismo de 2 llamadas en el que la primera llamada requerirá que la aplicación establezca el ID de la submalla y obtenga los tamaños de los búferes necesarios para los datos de la submalla, y luego la aplicación puede asignar los búferes y obtener los datos en la segunda llamada.

typedef struct XrSceneSubmeshDataANDROID {
    XrStructureType    type;
    const void*        next;
    XrUuid             submeshId;
    uint32_t           vertexCapacityInput;
    uint32_t           vertexCountOutput;
    XrVector3f*        vertexPositions;
    XrVector3f*        vertexNormals;
    uint8_t*           vertexSemantics;
    uint32_t           indexCapacityInput;
    uint32_t           indexCountOutput;
    uint32_t*          indices;
} XrSceneSubmeshDataANDROID;

Descripciones de miembros

  • type es el XrStructureType de esta estructura.
  • next es NULL o un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.
  • submeshId es un XrUuid que identifica la submalla.
  • vertexCapacityInput es la longitud de vertexPositions, vertexNormals y vertexSemantics.
  • vertexCountOutput es la cantidad de elementos en vertexPositions, vertexNormals y vertexSemantics que se modificaron en el tiempo de ejecución a partir del comienzo del array.
  • vertexPositions es un array de XrVector3f en el que el tiempo de ejecución generará las posiciones de los vértices de la submalla.
  • vertexNormals es un array de XrVector3f en el que el tiempo de ejecución generará las normales de los vértices de la submalla. Este campo se puede dejar NULL si la aplicación creó un objeto de seguimiento con las normales inhabilitadas.
  • vertexSemantics es un array de uint8_t en el que el tiempo de ejecución generará la semántica de los vértices de la submalla. Este campo se puede dejar NULL si la aplicación creó un objeto de seguimiento con la etiqueta semántica XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID establecida.
  • indexCapacityInput es la longitud de indices.
  • indexCountOutput es la cantidad de elementos de indices que se modificaron en el tiempo de ejecución a partir del comienzo del array.
  • indices es un array de uint32_t en el que el tiempo de ejecución generará los índices de la submalla.

xrGetSubmeshDataANDROID

La aplicación puede usar la función xrGetSubmeshDataANDROID para obtener los datos de una lista seleccionada de submallas. Esta función se puede usar en una expresión idiomática de 2 llamadas. En la primera llamada, la aplicación debe establecer un ID de submalla válido (es decir, recuperable desde xrGetAllSubmeshStatesANDROID con la misma instantánea de malla de la escena) y capacidad cero para cada elemento de la lista seleccionada de submallas para obtener los tamaños de los búferes necesarios para los datos de la submalla. En la segunda llamada, la aplicación debe establecer los punteros del búfer en un búfer asignado para cada elemento de la lista seleccionada de submeshes junto con la capacidad de los búferes para obtener los datos de los submeshes.

XrResult xrGetSubmeshDataANDROID(
    XrSceneMeshSnapshotANDROID            snapshot,
    uint32_t                              submeshDataCount,
    XrSceneSubmeshDataANDROID*            inoutSubmeshData);

Descripciones de parámetros

XrSceneMeshSemanticLabelANDROID

La enumeración XrSceneMeshSemanticLabelANDROID es el conjunto predeterminado de etiquetas semánticas que se pueden usar para etiquetar los vértices de la malla y describir en qué superficie del entorno físico se encuentra el vértice de la malla. Este conjunto de enumeración se representa con el valor XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID en XrSceneMeshSemanticLabelSetANDROID.

typedef enum XrSceneMeshSemanticLabelANDROID {
    XR_SCENE_MESH_SEMANTIC_LABEL_OTHER_ANDROID = 0,
    XR_SCENE_MESH_SEMANTIC_LABEL_FLOOR_ANDROID = 1,
    XR_SCENE_MESH_SEMANTIC_LABEL_CEILING_ANDROID = 2,
    XR_SCENE_MESH_SEMANTIC_LABEL_WALL_ANDROID = 3,
    XR_SCENE_MESH_SEMANTIC_LABEL_TABLE_ANDROID = 4,
    XR_SCENE_MESH_SEMANTIC_LABEL_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrSceneMeshSemanticLabelANDROID;

Destruye una instantánea de malla de escena

xrDestroySceneMeshSnapshotANDROID

La aplicación puede usar la función xrDestroySceneMeshSnapshotANDROID para destruir una instantánea de malla de escena. Una vez que se destruye el identificador, la aplicación ya no puede usarlo para obtener información o datos de la submalla. El identificador se destruye automáticamente cuando se destruye el objeto de seguimiento, ya que el identificador del objeto de seguimiento es el elemento superior del identificador de la instantánea de la malla de la escena.

XrResult xrDestroySceneMeshSnapshotANDROID(
    XrSceneMeshSnapshotANDROID            snapshot);

Descripciones de parámetros

Ejemplo de código para la generación de mallas de escenas

En el siguiente ejemplo de código, se muestra cómo acceder a los datos de la malla de la escena para la renderización.

XrInstance instance;  // Created at app startup
XrSystemId systemId;  // Received from xrGetSystem() at app startup
XrSession session;    // Created at app startup
XrSpace appPlaySpace; // Created at app startup

// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateSceneMeshingTrackerANDROID xrCreateSceneMeshingTrackerANDROID;
PFN_xrDestroySceneMeshingTrackerANDROID xrDestroySceneMeshingTrackerANDROID;
PFN_xrEnumerateSupportedSemanticLabelSetsANDROID xrEnumerateSupportedSemanticLabelSetsANDROID;
PFN_xrCreateSceneMeshSnapshotANDROID xrCreateSceneMeshSnapshotANDROID;
PFN_xrDestroySceneMeshSnapshotANDROID xrDestroySceneMeshSnapshotANDROID;
PFN_xrGetAllSubmeshStatesANDROID xrGetAllSubmeshStatesANDROID;
PFN_xrGetSubmeshDataANDROID xrGetSubmeshDataANDROID;

// Inspect system capability
XrSystemSceneMeshingPropertiesANDROID sceneMeshingProps = {
  .type = XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID,
};
XrSystemProperties sysProps = {
  .type = XR_TYPE_SYSTEM_PROPERTIES,
  .next = &sceneMeshingProps
};
CHK_XR(xrGetSystemProperties(instance, systemId, &sysProps));
if (!sceneMeshingProps.supportsSceneMeshing) {
    // scene meshing is not supported.
    return;
}

uint32_t supportedsemanticLabelSetsCount = 0;
xrEnumerateSupportedSemanticLabelSetsANDROID(
  instance, systemId, 0, &supportedsemanticLabelSetsCount, nullptr);
std::vector<XrSceneMeshSemanticLabelSetANDROID> supportedSemanticLabelSets(
  supportedsemanticLabelSetsCount);
xrEnumerateSupportedSemanticLabelSetsANDROID(
  instance, systemId, supportedsemanticLabelSetsCount,
  &supportedsemanticLabelSetsCount, supportedSemanticLabelSets.data());

XrSceneMeshSemanticLabelSetANDROID semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID;
// Check if system supports XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
if (std::find(supportedSemanticLabelSets.begin(), supportedSemanticLabelSets.end(),
              XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID) !=
    supportedSemanticLabelSets.end()) {
  semanticLabelSet = XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID;
}

XrSceneMeshingTrackerCreateInfoANDROID trackerCreateInfo = {
  .type = XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID,
  .semanticLabelSet = semanticLabelSet,
  .enableNormals = XR_TRUE
};

XrSceneMeshingTrackerANDROID tracker = XR_NULL_HANDLE;
CHK_XR(xrCreateSceneMeshingTrackerANDROID(session, &trackerCreateInfo, &tracker));

XrSceneMeshSnapshotCreationResultANDROID snapshotResult = {
  .type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID,
  .snapshot = XR_NULL_HANDLE
};
XrSceneMeshSnapshotANDROID& snapshot = snapshotResult.snapshot;
XrSceneMeshSnapshotCreateInfoANDROID createInfo = {
  .type = XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
};

// app update loop
while (true) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState; // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;
  XrBoxf box; // populated with the bounding box of the camera frustum

  // ...

  createInfo.baseSpace = appPlaySpace;
  createInfo.time = time;
  createInfo.boundingBox = box;

  // Grab the scene mesh snapshot. This way the app can: know all of the submesh infos,
  // choose the appropriate submeshes for which to get data, allocate the necessary
  // buffer for those submeshes, and then get the data.
  CHK_XR(xrCreateSceneMeshSnapshotANDROID(tracker, &createInfo, &snapshotResult));

  // check the tracking state
  if (snapshotResult.trackingState == XR_SCENE_MESH_TRACKING_STATE_ERROR_ANDROID) {
    // unrecoverable error. Exit the app.
    if (snapshot != XR_NULL_HANDLE) {
      CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
      snapshot = XR_NULL_HANDLE;
    }
    break;
  } else if (snapshotResult.trackingState != XR_SCENE_MESH_TRACKING_STATE_TRACKING_ANDROID) {
    // The tracker is not tracking. Try again later.
    if (snapshot != XR_NULL_HANDLE) {
      CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
      snapshot = XR_NULL_HANDLE;
    }
    continue;
  }

  // 2-call idiom for getting submesh states
  std::vector<XrSceneSubmeshStateANDROID> states;
  uint32_t submeshCount = 0;
  CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, 0, &submeshCount, nullptr));
  states.resize(submeshCount);
  for (XrSceneSubmeshStateANDROID& state : states) {
    state = {.type = XR_TYPE_SCENE_SUBMESH_STATE_ANDROID};
  }
  CHK_XR(xrGetAllSubmeshStatesANDROID(snapshot, submeshCount, &submeshCount, states.data()));

  // To store the poses for the selected submeshes
  std::vector<XrPosef> submeshesPoses;
  submeshesPoses.reserve(submeshCount);

  std::vector<XrSceneSubmeshDataANDROID> submeshes;
  submeshes.reserve(submeshCount);
  // Iterate the states and determine which submeshes the app wants data for
  for (XrSceneSubmeshStateANDROID& state : states) {
    // Modify this bool as necessary by looking at states. Maybe state.lastUpdatedTime
    // is below a threshold or maybe the bounding box does not intersect with camera view
    // frustum (The submesh will be culled).
    bool needed;
    if (needed) {
      // Add the selected submesh to the submeshes list. Set the capacity
      // zero for now since the size of the buffer will be determined later.
      XrSceneSubmeshDataANDROID submesh = {
        .type = XR_TYPE_SCENE_SUBMESH_DATA_ANDROID,
        .submeshId = state.submeshId,
        .vertexCapacityInput = 0,
        .vertexCountOutput = 0,
        .vertexPositions = nullptr,
        .vertexNormals = nullptr,
        .vertexSemantics = nullptr,
        .indexCapacityInput = 0,
        .indexCountOutput = 0,
        .indices = nullptr,
      };
      submeshes.push_back(submesh);
      submeshesPoses.push_back(state.submeshPoseInBaseSpace);
    }
  }

  // Grab the data for the selected submeshes using the 2-call idiom.
  CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));
  for (XrSceneSubmeshDataANDROID& submesh : submeshes) {
    submesh.vertexCapacityInput = submesh.vertexCountOutput;
    submesh.vertexCountOutput = 0;
    submesh.vertexPositions = new XrVector3f[submesh.vertexCountOutput];
    submesh.vertexNormals = new XrVector3f[submesh.vertexCountOutput];
    submesh.vertexSemantics = new uint8_t[submesh.vertexCountOutput];
    submesh.indexCapacityInput = submesh.indexCountOutput;
    submesh.indexCountOutput = 0;
    submesh.indices = new uint32_t[submesh.indexCountOutput];
  }
  CHK_XR(xrGetSubmeshDataANDROID(snapshot, submeshes.size(), submeshes.data()));

  // Destroy the scene mesh snapshot since we have finally grabbed the submeshes data. In
  // next iteration app can: create a new one to get latest mesh data
  CHK_XR(xrDestroySceneMeshSnapshotANDROID(snapshot));
  snapshot = XR_NULL_HANDLE;

  // Iterate the submeshes and get the vertex positions, vertex normals and
  // vertex semantics data for the selected submeshes
  for (uint32_t i = 0; i < submeshes.size(); i++) {
    XrSceneSubmeshDataANDROID& data = submeshes[i];
    XrVector3f* vertexPositions = data.vertexPositions;
    XrVector3f* vertexNormals = data.vertexNormals;
    XrSceneMeshSemanticLabelANDROID* vertexSemantics =
      reinterpret_cast<XrSceneMeshSemanticLabelANDROID*>(data.vertexSemantics);
    XrPosef pose = submeshesPoses[i];

    // *** Use the data as per needs ***

    // Release the allocated memory for the data buffers when done using
    delete [] data.vertexPositions;
    delete [] data.vertexNormals;
    delete [] data.vertexSemantics;
    delete [] data.indices;
  }

  // ...
  // Finish frame loop
  // ...
}

CHK_XR(xrDestroySceneMeshingTrackerANDROID(tracker));

Nuevos tipos de objetos

Nuevas constantes de enumeración

La enumeración XrObjectType se extiende con lo siguiente:

  • XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
  • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID

Se extiende la enumeración XrStructureType con lo siguiente:

  • XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
  • XR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROID
  • XR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROID
  • XR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROID
  • XR_TYPE_SCENE_SUBMESH_STATE_ANDROID
  • XR_TYPE_SCENE_SUBMESH_DATA_ANDROID

Nuevas enumeraciones

Nuevas estructuras

Nuevas funciones

Problemas

Historial de versiones

  • Revisión 3, 2025-05-15 (Salar Khan) ** Descripción inicial de la extensión

OpenXR™ y el logotipo de OpenXR son marcas comerciales propiedad de The Khronos Group Inc. y están registradas como marcas comerciales en China, la Unión Europea, Japón y el Reino Unido.