Chaîne de nom
XR_ANDROID_scene_meshing
Type d'extension Extension d'instance
Numéro d'extension enregistré 464
Révision 3
Dépendances d'extension et de version OpenXR 1.0
Date de dernière modification 15/05/2025
État de la propriété intellectuelle Aucune réclamation connue concernant la propriété intellectuelle.
Contributeurs 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
Présentation
Cette extension est destinée à fournir des données de maillage pour les maillages qui représentent approximativement les objets physiques de votre environnement. Il peut être utilisé pour visualiser votre scène dans une application immersive et permettre aux objets virtuels d'interagir avec les objets physiques, par exemple en cas de collision.
Les données de maillage de scènes peuvent être des informations personnelles sensibles et sont étroitement liées à la confidentialité et à l'intégrité personnelles. Il est fortement recommandé aux applications qui stockent ou transfèrent des données de maillage de scène de toujours demander à l'utilisateur d'accepter activement et spécifiquement cette opération.
Autorisations
Les applications Android doivent disposer de l'autorisation android.permission.SCENE_UNDERSTANDING_FINE
dans leur fichier manifeste.
L'autorisation android.permission.SCENE_UNDERSTANDING_FINE
est considérée comme sensible, car elle permet au runtime d'étudier l'environnement utilisateur.
L'application doit demander l'autorisation au moment de l'exécution pour utiliser ces fonctions :
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(niveau de protection : dangereux)
Inspecter les capacités du système
Une application peut inspecter si le système est capable de maillage de scène en chaînant une structure XrSystemSceneMeshingPropertiesANDROID à XrSystemProperties lors de l'appel de xrGetSystemProperties.
XrSystemSceneMeshingPropertiesANDROID
typedef struct XrSystemSceneMeshingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.supportsSceneMeshing
est un XrBool32, qui indique si le système prend en charge le maillage de scène.
Si supportsSceneMeshing
est défini sur XR_FALSE
, le système n'est pas compatible avec le maillage de scène.
L'application doit éviter d'utiliser la fonctionnalité de maillage de scène lorsque supportsSceneMeshing
est défini sur XR_FALSE
, car les appels à xrCreateSceneMeshingTrackerANDROID échoueront.
Si supportsSceneMeshing
est défini sur XR_TRUE
, le système est compatible avec le maillage de scène.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_scene_meshing
doit être activée avant d'utiliser XrSystemSceneMeshingPropertiesANDROID. type
doit êtreXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROID
next
doit êtreNULL
ou un pointeur valide vers la structure suivante dans une chaîne de structures.
XrSceneMeshSemanticLabelSetANDROID
L'énumération XrSceneMeshSemanticLabelSetANDROID décrit les ensembles de libellés sémantiques pour le maillage de scène.
Chaque valeur de cette énumération représente une autre énumération contenant les libellés sémantiques.
Par exemple, la valeur XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
représente l'ensemble 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
L'application peut obtenir les ensembles de libellés sémantiques compatibles avec le système à l'aide de la fonction xrEnumerateSupportedSemanticLabelSetsANDROID.
XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t supportedSemanticLabelSetsInputCapacity,
uint32_t* supportedSemanticLabelSetsOutputCount,
XrSceneMeshSemanticLabelSetANDROID* supportedSemanticLabelSets);
Descriptions des paramètres
instance
est une XrInstance créée par l'application.systemId
est un XrSystemId récupéré à partir de xrGetSystem.supportedSemanticLabelSetsInputCapacity
correspond à la longueur desupportedSemanticLabelSets
.supportedSemanticLabelSetsOutputCount
correspond au nombre d'éléments danssupportedSemanticLabelSets
modifiés par l'environnement d'exécution à partir du début du tableau.supportedSemanticLabelSets
est un tableau de XrSceneMeshSemanticLabelSetANDROID dans lequel les ensembles de libellés sémantiques compatibles sont écrits par le moteur d'exécution.
Chaque système doit au moins prendre en charge XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
, car cette valeur d'énumération représente un ensemble de libellés sémantiques et peut être utilisée si l'application n'a pas besoin de sémantique de vertex.
Créer un handle de suivi de maillage de scène
XrSceneMeshingTrackerANDROID
XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)
Le handle XrSceneMeshingTrackerANDROID représente un tracker de maillage de scène pour le maillage de scène et la gestion des ressources associées.
Ce handle peut être utilisé pour créer un instantané de maillage de scène à l'aide de xrCreateSceneMeshSnapshotANDROID dans cette extension.
xrCreateSceneMeshingTrackerANDROID
Une application peut créer un handle XrSceneMeshingTrackerANDROID à l'aide de la fonction xrCreateSceneMeshingTrackerANDROID.
XrResult xrCreateSceneMeshingTrackerANDROID(
XrSession session,
const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
XrSceneMeshingTrackerANDROID* tracker);
Descriptions des paramètres
session
est une XrSession dans laquelle le suivi de maillage de la scène sera actif.createInfo
est un pointeur vers une structure XrSceneMeshingTrackerCreateInfoANDROID utilisée pour décrire le tracker de maillage de scène à créer.tracker
est le handle XrSceneMeshingTrackerANDROID renvoyé.
Si le système n'est pas compatible avec le maillage de scène, xrCreateSceneMeshingTrackerANDROID renvoie XR_ERROR_FEATURE_UNSUPPORTED
.
L'application peut vérifier la compatibilité du système en appelant xrGetSystemProperties avec la structure XrSystemSceneMeshingPropertiesANDROID.
Seuls les ensembles de libellés sémantiques compatibles avec le système peuvent être utilisés dans XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet lors de la création d'un outil de suivi de maillage de scène. La fonction xrEnumerateSupportedSemanticLabelSetsANDROID peut être utilisée pour obtenir la liste des ensembles de libellés sémantiques compatibles.
Si l'application demande un semanticLabelSet
non compatible, xrCreateSceneMeshingTrackerANDROID renvoie XR_ERROR_FEATURE_UNSUPPORTED
.
Le handle xrCreateSceneMeshingTrackerANDROID possède toutes les ressources pour la création de maillages de scènes. Une fois l'expérience de maillage de scène terminée, l'application doit détruire le handle via la fonction xrDestroySceneMeshingTrackerANDROID.
XrSceneMeshingTrackerCreateInfoANDROID
La structure XrSceneMeshingTrackerCreateInfoANDROID décrit les informations nécessaires pour créer un handle XrSceneMeshingTrackerANDROID.
typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSceneMeshSemanticLabelSetANDROID semanticLabelSet;
XrBool32 enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.semanticLabelSet
est un XrSceneMeshSemanticLabelSetANDROID utilisé pour spécifier l'ensemble de libellés sémantiques à utiliser pour le maillage de la scène. Si cette valeur est définie surXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
, le runtime ignore le champ de mémoire tampon XrSceneSubmeshDataANDROID::vertexSemantics.enableNormals
est un XrBool32 utilisé pour spécifier s'il faut inclure les normales des sommets pour les sommets du maillage dans le tampon de maillage de la scène lors de l'obtention des données du maillage de la scène.
xrDestroySceneMeshingTrackerANDROID
La fonction xrDestroySceneMeshingTrackerANDROID libère tracker
et les ressources sous-jacentes une fois les expériences de maillage de scène terminées.
XrResult xrDestroySceneMeshingTrackerANDROID(
XrSceneMeshingTrackerANDROID tracker);
Descriptions des paramètres
tracker
est un XrSceneMeshingTrackerANDROID créé précédemment par xrCreateSceneMeshingTrackerANDROID.
Créer un handle d'instantané de maillage de scène
XrSceneMeshSnapshotANDROID
XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)
Le handle XrSceneMeshSnapshotANDROID représente un instantané du maillage de la scène. Il est créé à l'aide de xrCreateSceneMeshSnapshotANDROID, qui capture essentiellement un instantané des données du maillage de la scène au moment de l'appel de la fonction.
Ce handle peut être utilisé pour récupérer des informations et des données sur les sous-mailles à l'aide de xrGetAllSubmeshStatesANDROID et xrGetSubmeshDataANDROID.
XrSceneMeshSnapshotCreateInfoANDROID
La structure XrSceneMeshSnapshotCreateInfoANDROID décrit les informations permettant de créer un handle XrSceneMeshSnapshotANDROID.
typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
XrBoxf boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.baseSpace
est un XrSpace utilisé pour décrire l'espace de référence dans lequel les informations de pose des sous-maillages de scène doivent être représentées.time
est le XrTime qui décrit le moment où le maillage de la scène sera traité ou affiché.boundingBox
est un XrBoxf décrivant le cadre de délimitation dans lequel acquérir le maillage de la scène.
XrSceneMeshTrackingStateANDROID
L'énumération XrSceneMeshTrackingStateANDROID décrit l'état du suivi pour le suivi du maillage de la scène. Chaque valeur de cette énumération représente un état du suivi de maillage de la scène. Cet énumération est encapsulée dans la structure XrSceneMeshSnapshotCreationResultANDROID, qui est renvoyée par 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 structure XrSceneMeshSnapshotCreationResultANDROID stocke le résultat de la création d'un instantané du maillage de scène renvoyé par xrCreateSceneMeshSnapshotANDROID. Le résultat inclut le handle de l'instantané et l'état de suivi du suivi du maillage de la scène au moment de la création de l'instantané.
typedef struct XrSceneMeshSnapshotCreationResultANDROID {
XrStructureType type;
void* next;
XrSceneMeshSnapshotANDROID snapshot;
XrSceneMeshTrackingStateANDROID trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.snapshot
est un handle XrSceneMeshSnapshotANDROID créé par le runtime.trackingState
est un XrSceneMeshTrackingStateANDROID qui décrit l'état du suivi de maillage de scène au moment de la création de l'instantané.
xrCreateSceneMeshSnapshotANDROID
L'application peut utiliser la fonction xrCreateSceneMeshSnapshotANDROID pour créer un instantané du maillage de la scène à partir du suivi du maillage de la scène. Cette fonction renvoie un handle XrSceneMeshSnapshotANDROID ainsi que XrSceneMeshTrackingStateANDROID encapsulé dans une structure XrSceneMeshSnapshotCreationResultANDROID. Techniquement, le handle est un instantané des données du maillage de la scène au moment de la création. Ce handle peut être utilisé pour interroger les informations et les données du maillage de la scène à l'aide de xrGetAllSubmeshStatesANDROID et xrGetSubmeshDataANDROID, respectivement.
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
Descriptions des paramètres
tracker
est un handle XrSceneMeshingTrackerANDROID créé précédemment avec xrCreateSceneMeshingTrackerANDROID.createInfo
est un pointeur vers une structure XrSceneMeshSnapshotCreateInfoANDROID qui contient les informations nécessaires à la création de l'instantané du maillage de la scène.outSnapshotCreationResult
est un pointeur vers un objet XrSceneMeshSnapshotCreationResultANDROID qui est renseigné par le moteur d'exécution avec le résultat de la création de l'instantané.
Acquérir des données de maillage de scène à partir de l'instantané de maillage de scène
XrSceneSubmeshStateANDROID
XrSceneSubmeshStateANDROID décrit un sous-maillage. Il contient les informations de base sur le sous-maillage (ID, pose, limites, heure de la dernière mise à jour).
typedef struct XrSceneSubmeshStateANDROID {
XrStructureType type;
void* next;
XrUuid submeshId;
XrTime lastUpdatedTime;
XrPosef submeshPoseInBaseSpace;
XrExtent3Df bounds;
} XrSceneSubmeshStateANDROID;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.submeshId
est un XrUuid identifiant le sous-maillage.lastUpdatedTime
est un XrTime représentant le moment où le sous-maillage a été mis à jour pour la dernière fois.submeshPoseInBaseSpace
est un XrPosef représentant la pose du sous-maillage dans l'espace de base utilisé pour créer l'instantané du maillage de la scène. Il s'agit également de la pose du centre du cadre de délimitation du sous-maillage.bounds
est un XrExtent3Df décrivant les dimensions de la boîte englobante qui contient le sous-maillage. Ces limites se trouvent dans l'espace de base qui a été utilisé pour créer le handle du maillage de la scène.
xrGetAllSubmeshStatesANDROID
L'application peut utiliser la fonction xrGetAllSubmeshStatesANDROID pour obtenir l'état de tous les sous-maillages du maillage de la scène. Il contient des informations de base permettant à l'application de sélectionner les sous-maillages pour lesquels elle souhaite obtenir des données. Cette fonction peut être utilisée dans une expression à deux appels.
XrResult xrGetAllSubmeshStatesANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshStateCapacityInput,
uint32_t* submeshStateCountOutput,
XrSceneSubmeshStateANDROID* submeshStates);
Descriptions des paramètres
snapshot
est un handle XrSceneMeshSnapshotANDROID précédemment créé avec xrCreateSceneMeshSnapshotANDROID.submeshStateCapacityInput
correspond à la longueur desubmeshStates
.submeshStateCountOutput
correspond au nombre d'éléments desubmeshStates
qui sont modifiés par l'environnement d'exécution à partir du début du tableau.submeshStates
est un tableau de structures XrSceneSubmeshStateANDROID dans lequel le runtime génère l'état de tous les sous-maillages du maillage de la scène.
XrSceneSubmeshDataANDROID
XrSceneSubmeshDataANDROID contient les données de triangle pour un sous-maillage ainsi que l'ID du sous-maillage. Cette structure est utilisée dans xrGetSubmeshDataANDROID pour obtenir les données du sous-maillage. L'application doit définir l'ID de sous-maillage de cette structure et les pointeurs de tampon sur les tampons alloués afin que les données renvoyées pour le sous-maillage puissent être renseignées dans les tampons alloués. L'application peut utiliser xrGetSubmeshDataANDROID comme idiome à deux appels. Le premier appel obligera l'application à définir l'ID du sous-maillage et à obtenir la taille des tampons requis pour les données du sous-maillage. L'application peut ensuite allouer les tampons et obtenir les données lors du deuxième appel.
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;
Descriptions des membres
type
est le XrStructureType de cette structure.next
estNULL
ou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans l'extension ni dans le cœur d'OpenXR.submeshId
est un XrUuid identifiant le sous-maillage.vertexCapacityInput
correspond à la longueur devertexPositions
,vertexNormals
etvertexSemantics
.vertexCountOutput
correspond au nombre d'éléments dansvertexPositions
,vertexNormals
etvertexSemantics
qui ont été modifiés par l'environnement d'exécution depuis le début du tableau.vertexPositions
est un tableau XrVector3f dans lequel le runtime génère les positions des sommets du sous-maillage.vertexNormals
est un tableau XrVector3f dans lequel le runtime génère les normales des sommets du sous-maillage. Ce champ peut être laisséNULL
si l'application a créé un tracker avec les normales désactivées.vertexSemantics
est un tableau deuint8_t
dans lequel le runtime génère la sémantique des sommets du sous-maillage. Ce champ peut être laisséNULL
si l'application a créé un traceur avec un libellé sémantiqueXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID
défini.indexCapacityInput
correspond à la longueur deindices
.indexCountOutput
correspond au nombre d'éléments deindices
qui ont été modifiés par l'environnement d'exécution depuis le début du tableau.indices
est un tableau deuint32_t
dans lequel l'environnement d'exécution génère les index du sous-maillage.
xrGetSubmeshDataANDROID
L'application peut utiliser la fonction xrGetSubmeshDataANDROID pour obtenir les données d'une liste de sous-maillages sélectionnée. Cette fonction peut être utilisée dans une expression à deux appels. Lors du premier appel, l'application doit définir un ID de sous-maillage valide (c'est-à-dire récupérable à partir de xrGetAllSubmeshStatesANDROID avec le même instantané de maillage de scène) et une capacité nulle pour chaque élément de la liste de sous-maillages sélectionnée afin d'obtenir la taille des tampons requis pour les données de sous-maillage. Lors du deuxième appel, l'application doit définir les pointeurs de tampon sur un tampon alloué pour chaque élément de la liste de sous-maillages sélectionnée, ainsi que sur la capacité des tampons pour obtenir les données des sous-maillages.
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
Descriptions des paramètres
snapshot
est un handle XrSceneMeshSnapshotANDROID précédemment créé avec xrCreateSceneMeshSnapshotANDROID.submeshDataCount
correspond à la longueur deinoutSubmeshData
.inoutSubmeshData
est un tableau de XrSceneSubmeshDataANDROID dans lequel chaque élément sera renseigné avec les données du maillage par le runtime en fonction de l'ID du sous-maillage.
XrSceneMeshSemanticLabelANDROID
L'énumération XrSceneMeshSemanticLabelANDROID est l'ensemble par défaut de libellés sémantiques qui peuvent être utilisés pour libeller les sommets du maillage afin de décrire la surface de l'environnement physique sur laquelle se trouve le sommet du maillage.
Cet ensemble d'énumérations est représenté par la valeur XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID
dans 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;
Détruire un instantané de maillage de scène
xrDestroySceneMeshSnapshotANDROID
L'application peut utiliser la fonction xrDestroySceneMeshSnapshotANDROID pour détruire un instantané de maillage de scène. Une fois le handle détruit, l'application ne peut plus l'utiliser pour obtenir les informations ou les données du sous-maillage. Le handle est automatiquement détruit lorsque le tracker est détruit, car le handle du tracker est le parent du handle du snapshot du maillage de la scène.
XrResult xrDestroySceneMeshSnapshotANDROID(
XrSceneMeshSnapshotANDROID snapshot);
Descriptions des paramètres
snapshot
est un handle XrSceneMeshSnapshotANDROID précédemment créé avec xrCreateSceneMeshSnapshotANDROID qui sera détruit par cette fonction.
Exemple de code pour le maillage de scène
L'exemple de code suivant montre comment accéder aux données de maillage de scène pour le rendu.
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));
Nouveaux types d'objets
Nouvelles constantes d'énumération
L'énumération XrObjectType est étendue avec les éléments suivants :
XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROID
XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID
L'énumération XrStructureType est étendue avec les éléments suivants :
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
Nouvelles énumérations
Nouvelles structures
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
Nouvelles fonctions
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
Problèmes
Historique des versions
- Révision 3, 15/05/2025 (Salar Khan) ** Description initiale de l'extension
OpenXR™ et le logo OpenXR sont des marques déposées appartenant à The Khronos Group Inc. et sont enregistrées en Chine, dans l'Union européenne, au Japon et au Royaume-Uni.