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:
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(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
esNULL
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)
- La extensión
XR_ANDROID_scene_meshing
debe habilitarse antes de usar XrSystemSceneMeshingPropertiesANDROID. type
debe serXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
next
debe serNULL
o un puntero válido a la siguiente estructura en una cadena de estructuras
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 desupportedSemanticLabelSets
.supportedSemanticLabelSetsOutputCount
es la cantidad de elementos ensupportedSemanticLabelSets
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
session
es un XrSession en el que el objeto de seguimiento de la malla de la escena estará activo.createInfo
es un puntero a una estructura XrSceneMeshingTrackerCreateInfoANDROID que se usa para describir el rastreador de malla de la escena que se creará.tracker
es el identificador XrSceneMeshingTrackerANDROID que se devolvió.
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
esNULL
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 enXR_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
tracker
es un XrSceneMeshingTrackerANDROID creado anteriormente por xrCreateSceneMeshingTrackerANDROID.
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
esNULL
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
esNULL
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
tracker
es un controlador de XrSceneMeshingTrackerANDROID creado previamente con xrCreateSceneMeshingTrackerANDROID.createInfo
es un puntero a una estructura XrSceneMeshSnapshotCreateInfoANDROID que contiene la información necesaria para crear la instantánea de la malla de la escena.outSnapshotCreationResult
es un puntero a un objeto XrSceneMeshSnapshotCreationResultANDROID que el tiempo de ejecución completa con el resultado de la creación de la instantánea.
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
esNULL
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 desubmeshStates
.submeshStateCountOutput
es la cantidad de elementos desubmeshStates
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
esNULL
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 devertexPositions
,vertexNormals
yvertexSemantics
.vertexCountOutput
es la cantidad de elementos envertexPositions
,vertexNormals
yvertexSemantics
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 dejarNULL
si la aplicación creó un objeto de seguimiento con las normales inhabilitadas.vertexSemantics
es un array deuint8_t
en el que el tiempo de ejecución generará la semántica de los vértices de la submalla. Este campo se puede dejarNULL
si la aplicación creó un objeto de seguimiento con la etiqueta semánticaXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
establecida.indexCapacityInput
es la longitud deindices
.indexCountOutput
es la cantidad de elementos deindices
que se modificaron en el tiempo de ejecución a partir del comienzo del array.indices
es un array deuint32_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
snapshot
es un identificador de XrSceneMeshSnapshotANDROID creado anteriormente con xrCreateSceneMeshSnapshotANDROID.submeshDataCount
es la longitud deinoutSubmeshData
.inoutSubmeshData
es un array de XrSceneSubmeshDataANDROID en el que el tiempo de ejecución propagará cada elemento con los datos de la malla según el ID de la submalla.
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
snapshot
es un identificador de XrSceneMeshSnapshotANDROID creado anteriormente con xrCreateSceneMeshSnapshotANDROID que esta función destruirá.
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
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
Nuevas funciones
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
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.