名前文字列
XR_ANDROID_scene_meshing
拡張機能のタイプ インスタンス拡張機能
Registered Extension Number 464
リビジョン 3
拡張機能とバージョンの依存関係 OpenXR 1.0
最終更新日 2025-05-15
IP ステータス 既知の IP 申し立てはありません。
貢献者 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
概要
この拡張機能は、環境内の物理オブジェクトをほぼ表すメッシュのメッシュデータを提供することを目的としています。没入型アプリケーションでシーンを視覚化し、仮想オブジェクトが衝突などの物理オブジェクトとやり取りできるようにするために使用できます。
シーン メッシュ データは機密性の高い個人情報であり、個人のプライバシーと完全性に密接に関連しています。シーン メッシュデータを保存または転送するアプリケーションでは、常にユーザーに明示的な同意を求めることを強く推奨します。
権限
Android アプリケーションは、マニフェストに android.permission.SCENE_UNDERSTANDING_FINE 権限を記載しなければなりません。android.permission.SCENE_UNDERSTANDING_FINE 権限は、ランタイムがユーザー環境を調査することを許可するため、機密性の高い権限と見なされます。
これらの関数を使用するには、実行時に権限をリクエストする必要があります。
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
(保護レベル: 危険)
システムの機能を検証する
アプリケーションは、xrGetSystemProperties を呼び出すときに XrSystemSceneMeshingPropertiesANDROID 構造体を XrSystemProperties にチェーンすることで、システムがシーン メッシュに対応しているかどうかを検査できます。
XrSystemSceneMeshingPropertiesANDROID
typedef struct XrSystemSceneMeshingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsSceneMeshing;
} XrSystemSceneMeshingPropertiesANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。supportsSceneMeshingは XrBool32 で、システムがシーン メッシュをサポートしているかどうかを示します。
supportsSceneMeshing が XR_FALSE の場合、システムはシーン メッシュをサポートしていません。supportsSceneMeshing が XR_FALSE の場合、xrCreateSceneMeshingTrackerANDROID の呼び出しが失敗するため、アプリはシーン メッシュ機能の使用を避けるべきです。
supportsSceneMeshing が XR_TRUE の場合、システムはシーン メッシュをサポートします。
有効な使用量(暗黙的)
- XrSystemSceneMeshingPropertiesANDROID を使用する前に、
XR_ANDROID_scene_meshing拡張機能を有効にする必要があります typeはXR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROIDでなければなりません。nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタでなければなりません。
XrSceneMeshSemanticLabelSetANDROID
XrSceneMeshSemanticLabelSetANDROID 列挙型は、シーン メッシュのセマンティック ラベルセットを記述します。この列挙型の各値は、セマンティック ラベルを含む別の列挙型を表します。たとえば、XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID 値は 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
アプリケーションは、xrEnumerateSupportedSemanticLabelSetsANDROID 関数を使用して、システムでサポートされているセマンティック ラベルセットを取得できます。
XrResult xrEnumerateSupportedSemanticLabelSetsANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t supportedSemanticLabelSetsInputCapacity,
uint32_t* supportedSemanticLabelSetsOutputCount,
XrSceneMeshSemanticLabelSetANDROID* supportedSemanticLabelSets);
パラメータの説明
instanceは、アプリケーションによって作成された XrInstance です。systemIdは、xrGetSystem から再試行された XrSystemId です。supportedSemanticLabelSetsInputCapacityはsupportedSemanticLabelSetsの長さです。supportedSemanticLabelSetsOutputCountは、配列の先頭からランタイムによって変更されたsupportedSemanticLabelSets内の要素の数です。supportedSemanticLabelSetsは、サポートされているセマンティック ラベルセットがランタイムによって書き込まれる XrSceneMeshSemanticLabelSetANDROID の配列です。
この列挙型値はセマンティック ラベル セットがないことを表し、アプリケーションで頂点セマンティクスが必要ない場合に使用できるため、すべてのシステムが少なくとも XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID をサポートすることが想定されます。
シーン メッシュ トラッカー ハンドルを作成する
XrSceneMeshingTrackerANDROID
XR_DEFINE_HANDLE(XrSceneMeshingTrackerANDROID)
XrSceneMeshingTrackerANDROID ハンドルは、シーン メッシュ処理と関連リソースの管理のためのシーン メッシュ処理トラッカーを表します。
このハンドルは、この拡張機能の xrCreateSceneMeshSnapshotANDROID を使用してシーン メッシュ スナップショットを作成するために使用できます。
xrCreateSceneMeshingTrackerANDROID
アプリケーションは、xrCreateSceneMeshingTrackerANDROID 関数を使用して XrSceneMeshingTrackerANDROID ハンドルを作成できます。
XrResult xrCreateSceneMeshingTrackerANDROID(
XrSession session,
const XrSceneMeshingTrackerCreateInfoANDROID* createInfo,
XrSceneMeshingTrackerANDROID* tracker);
パラメータの説明
sessionは、シーン メッシュ トラッカーがアクティブになる XrSession です。createInfoは、作成するシーン メッシュ トラッカーを記述するために使用される XrSceneMeshingTrackerCreateInfoANDROID 構造体へのポインタです。trackerは、返された XrSceneMeshingTrackerANDROID ハンドルです。
システムがシーン メッシュをサポートしていない場合、xrCreateSceneMeshingTrackerANDROID は XR_ERROR_FEATURE_UNSUPPORTED を返します。アプリは、XrSystemSceneMeshingPropertiesANDROID 構造体で xrGetSystemProperties を呼び出すことで、システム サポートを確認できます。
シーン メッシュ トラッカーを作成するときに XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet で使用できるのは、システムでサポートされているセマンティック ラベルセットのみです。関数 xrEnumerateSupportedSemanticLabelSetsANDROID を使用して、サポートされているセマンティック ラベルセットのリストを取得できます。
アプリケーションがサポートされていない semanticLabelSet をリクエストした場合、xrCreateSceneMeshingTrackerANDROID は XR_ERROR_FEATURE_UNSUPPORTED を返します。
xrCreateSceneMeshingTrackerANDROID ハンドルは、シーン メッシュのすべてのリソースを所有します。シーン メッシュ エクスペリエンスが終了したら、アプリケーションは xrDestroySceneMeshingTrackerANDROID 関数を使用してハンドルを破棄しなければなりません。
XrSceneMeshingTrackerCreateInfoANDROID
XrSceneMeshingTrackerCreateInfoANDROID 構造体は、XrSceneMeshingTrackerANDROID ハンドルを作成するための情報を記述します。
typedef struct XrSceneMeshingTrackerCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSceneMeshSemanticLabelSetANDROID semanticLabelSet;
XrBool32 enableNormals;
} XrSceneMeshingTrackerCreateInfoANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。semanticLabelSetは、シーン メッシュに使用するセマンティック ラベルセットを指定するために使用される XrSceneMeshSemanticLabelSetANDROID です。これがXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROIDに設定されている場合、ランタイムは XrSceneSubmeshDataANDROID::vertexSemantics バッファ フィールドを無視します。enableNormalsは、シーン メッシュ データを取得するときに、シーン メッシュ バッファ内のメッシュ頂点の頂点法線を含めるかどうかを指定するために使用される XrBool32 です。
xrDestroySceneMeshingTrackerANDROID
xrDestroySceneMeshingTrackerANDROID 関数は、シーン メッシュ エクスペリエンスが終了したときに tracker と基盤となるリソースを解放します。
XrResult xrDestroySceneMeshingTrackerANDROID(
XrSceneMeshingTrackerANDROID tracker);
パラメータの説明
trackerは、xrCreateSceneMeshingTrackerANDROID によって以前に作成された XrSceneMeshingTrackerANDROID です。
シーン メッシュ スナップショット ハンドルを作成する
XrSceneMeshSnapshotANDROID
XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)
XrSceneMeshSnapshotANDROID ハンドルは、シーン メッシュ スナップショットを表します。これは xrCreateSceneMeshSnapshotANDROID を使用して作成されます。これは、関数呼び出し時のシーン メッシュ データのスナップショットを実質的に取得します。
このハンドルは、xrGetAllSubmeshStatesANDROID と xrGetSubmeshDataANDROID を使用して、サブメッシュの情報とデータを取得するために使用できます。
XrSceneMeshSnapshotCreateInfoANDROID
XrSceneMeshSnapshotCreateInfoANDROID 構造体は、XrSceneMeshSnapshotANDROID ハンドルを作成するための情報を記述します。
typedef struct XrSceneMeshSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
XrSpace baseSpace;
XrTime time;
XrBoxf boundingBox;
} XrSceneMeshSnapshotCreateInfoANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。baseSpaceは、シーン サブメッシュのポーズ情報が表される基準空間を記述するために使用される XrSpace です。timeは、シーンメッシュが処理または表示される時間を記述する XrTime です。boundingBoxは、シーンメッシュを取得する境界ボックスを記述する XrBoxf です。
XrSceneMeshTrackingStateANDROID
XrSceneMeshTrackingStateANDROID 列挙型は、シーン メッシュ トラッカーのトラッキング状態を表します。この列挙型の各値は、シーン メッシュ トラッカーの状態を表します。この列挙型は XrSceneMeshSnapshotCreationResultANDROID 構造体にラップされ、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
XrSceneMeshSnapshotCreationResultANDROID 構造体は、xrCreateSceneMeshSnapshotANDROID から返されたシーン メッシュ スナップショット作成の結果を保存します。結果には、スナップショット ハンドルと、スナップショット作成時のシーン メッシュ トラッカーのトラッキング状態が含まれます。
typedef struct XrSceneMeshSnapshotCreationResultANDROID {
XrStructureType type;
void* next;
XrSceneMeshSnapshotANDROID snapshot;
XrSceneMeshTrackingStateANDROID trackingState;
} XrSceneMeshSnapshotCreationResultANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。snapshotは、ランタイムによって作成された XrSceneMeshSnapshotANDROID ハンドルです。trackingStateは、スナップショットの作成時のシーン メッシュ トラッカーの状態を表す XrSceneMeshTrackingStateANDROID です。
xrCreateSceneMeshSnapshotANDROID
アプリは、xrCreateSceneMeshSnapshotANDROID 関数を使用して、シーン メッシュ トラッカーからシーン メッシュ スナップショットを作成できます。この関数は、XrSceneMeshSnapshotCreationResultANDROID 構造体にラップされた XrSceneMeshTrackingStateANDROID とともに XrSceneMeshSnapshotANDROID ハンドルを返します。ハンドルは、作成時のシーン メッシュ データのスナップショットです。このハンドルは、それぞれ xrGetAllSubmeshStatesANDROID と xrGetSubmeshDataANDROID を使用して、シーン メッシュの情報とデータのクエリに使用できます。
XrResult xrCreateSceneMeshSnapshotANDROID(
XrSceneMeshingTrackerANDROID tracker,
const XrSceneMeshSnapshotCreateInfoANDROID* createInfo,
XrSceneMeshSnapshotCreationResultANDROID* outSnapshotCreationResult);
パラメータの説明
trackerは、以前に xrCreateSceneMeshingTrackerANDROID で作成された XrSceneMeshingTrackerANDROID ハンドルです。createInfoは、シーンメッシュ スナップショットの作成に必要な情報を含む XrSceneMeshSnapshotCreateInfoANDROID 構造体へのポインタです。outSnapshotCreationResultは、ランタイムによってスナップショット作成結果が入力される XrSceneMeshSnapshotCreationResultANDROID オブジェクトへのポインタです。
シーンメッシュ スナップショットからシーンメッシュ データを取得する
XrSceneSubmeshStateANDROID
XrSceneSubmeshStateANDROID は、サブメッシュを記述します。サブメッシュの基本情報(ID、ポーズ、境界、最終更新時刻)が含まれます。
typedef struct XrSceneSubmeshStateANDROID {
XrStructureType type;
void* next;
XrUuid submeshId;
XrTime lastUpdatedTime;
XrPosef submeshPoseInBaseSpace;
XrExtent3Df bounds;
} XrSceneSubmeshStateANDROID;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。submeshIdは、サブメッシュを識別する XrUuid です。lastUpdatedTimeは、サブメッシュが最後に更新された時刻を表す XrTime です。submeshPoseInBaseSpaceは、シーン メッシュ スナップショットの作成に使用されるベース空間内のサブメッシュのポーズを表す XrPosef です。これは、サブメッシュの境界ボックスの中心のポーズでもあります。boundsは、サブメッシュを囲む境界ボックスの寸法を記述する XrExtent3Df です。この境界は、シーン メッシュ ハンドルの作成に使用されたベース空間内にあります。
xrGetAllSubmeshStatesANDROID
アプリケーションは xrGetAllSubmeshStatesANDROID 関数を使用して、シーン メッシュ内のすべてのサブメッシュの状態を取得できます。これには、アプリケーションがデータを必要とするサブメッシュを選択できるようにするための基本情報が含まれています。この関数は、2 回の呼び出しイディオムで使用できます。
XrResult xrGetAllSubmeshStatesANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshStateCapacityInput,
uint32_t* submeshStateCountOutput,
XrSceneSubmeshStateANDROID* submeshStates);
パラメータの説明
snapshotは、以前に xrCreateSceneMeshSnapshotANDROID で作成された XrSceneMeshSnapshotANDROID ハンドルです。submeshStateCapacityInputはsubmeshStatesの長さです。submeshStateCountOutputは、配列の先頭からランタイムによって変更されるsubmeshStates内の要素の数です。submeshStatesは XrSceneSubmeshStateANDROID 構造体の配列です。ランタイムは、シーンメッシュ内のすべてのサブメッシュの状態をこの配列に出力します。
XrSceneSubmeshDataANDROID
XrSceneSubmeshDataANDROID には、サブメッシュの三角形データとサブメッシュ ID が含まれます。この構造体は、xrGetSubmeshDataANDROID でサブメッシュのデータを取得するために使用されます。アプリケーションは、この構造体のサブメッシュ ID とバッファ ポインタを割り当てられたバッファに設定して、サブメッシュの返されたデータを割り当てられたバッファに格納できるようにする必要があります。アプリケーションは、xrGetSubmeshDataANDROID を 2 回呼び出すイディオムとして使用できます。最初の呼び出しでは、アプリケーションがサブメッシュ ID を設定し、サブメッシュ データに必要なバッファのサイズを取得する必要があります。その後、アプリケーションは 2 回目の呼び出しでバッファを割り当ててデータを取得できます。
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;
メンバーの説明
typeは、この構造の XrStructureType です。nextは、NULLまたは構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。submeshIdは、サブメッシュを識別する XrUuid です。vertexCapacityInputは、vertexPositions、vertexNormals、vertexSemanticsの長さです。vertexCountOutputは、配列の先頭からランタイムによって変更されたvertexPositions、vertexNormals、vertexSemanticsの要素の数です。vertexPositionsは、ランタイムがサブメッシュの頂点位置を出力する XrVector3f の配列です。vertexNormalsは XrVector3f の配列で、ランタイムがサブメッシュの頂点法線を出力します。アプリケーションが法線を無効にしてトラッカーを作成した場合、このフィールドはNULLのままにできます。vertexSemanticsは、ランタイムがサブメッシュの頂点セマンティクスを出力するuint8_tの配列です。アプリケーションがXR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROIDセマンティック ラベルを設定してトラッカーを作成した場合、このフィールドはNULLのままにできます。indexCapacityInputはindicesの長さです。indexCountOutputは、配列の先頭からランタイムによって変更されたindices内の要素の数です。indicesは、ランタイムがサブメッシュのインデックスを出力するuint32_tの配列です。
xrGetSubmeshDataANDROID
アプリは、xrGetSubmeshDataANDROID 関数を使用して、選択したサブメッシュのリストのデータを取得できます。この関数は、2 回の呼び出しイディオムで使用できます。最初の呼び出しでは、アプリケーションは、選択したサブメッシュのリストの各要素に対して、有効なサブメッシュ ID(同じシーンメッシュ スナップショットで xrGetAllSubmeshStatesANDROID から取得可能)と容量ゼロを設定して、サブメッシュ データに必要なバッファのサイズを取得しなければなりません。2 回目の呼び出しでは、アプリケーションは、選択したサブメッシュのリスト内の各要素の割り当て済みバッファへのバッファ ポインタと、サブメッシュのデータを取得するためのバッファの容量を設定しなければなりません。
XrResult xrGetSubmeshDataANDROID(
XrSceneMeshSnapshotANDROID snapshot,
uint32_t submeshDataCount,
XrSceneSubmeshDataANDROID* inoutSubmeshData);
パラメータの説明
snapshotは、以前に xrCreateSceneMeshSnapshotANDROID で作成された XrSceneMeshSnapshotANDROID ハンドルです。submeshDataCountはinoutSubmeshDataの長さです。inoutSubmeshDataは XrSceneSubmeshDataANDROID の配列です。各要素には、サブメッシュ ID に基づいてランタイムによってメッシュデータが入力されます。
XrSceneMeshSemanticLabelANDROID
XrSceneMeshSemanticLabelANDROID 列挙型は、メッシュの頂点にラベルを付けて、メッシュの頂点がどの物理環境のサーフェス上にあるかを記述するために使用できるセマンティック ラベルのデフォルト セットです。この列挙型セットは、XrSceneMeshSemanticLabelSetANDROID の XR_SCENE_MESH_SEMANTIC_LABEL_SET_DEFAULT_ANDROID 値で表されます。
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;
シーンメッシュ スナップショットを破棄する
xrDestroySceneMeshSnapshotANDROID
アプリケーションは、xrDestroySceneMeshSnapshotANDROID 関数を使用して、シーン メッシュ スナップショットを破棄できます。ハンドルが破棄されると、アプリケーションはそれを使用してサブメッシュ情報やデータを取得できなくなります。トラッカー ハンドルはシーン メッシュ スナップショット ハンドルの親であるため、トラッカーが破棄されるとハンドルは自動的に破棄されます。
XrResult xrDestroySceneMeshSnapshotANDROID(
XrSceneMeshSnapshotANDROID snapshot);
パラメータの説明
snapshotは、この関数によって破棄される xrCreateSceneMeshSnapshotANDROID で以前に作成された XrSceneMeshSnapshotANDROID ハンドルです。
シーン メッシュのサンプルコード
次のサンプルコードは、レンダリング用のシーン メッシュ データにアクセスする方法を示しています。
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));
新しいオブジェクト タイプ
新しい列挙型定数
XrObjectType 列挙型が拡張され、次の値が追加されました。
XR_OBJECT_TYPE_SCENE_MESHING_TRACKER_ANDROIDXR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID
XrStructureType 列挙型が拡張され、次の値が追加されました。
XR_TYPE_SYSTEM_SCENE_MESHING_PROPERTIES_ANDROIDXR_TYPE_SCENE_MESHING_TRACKER_CREATE_INFO_ANDROIDXR_TYPE_SCENE_MESH_SNAPSHOT_CREATE_INFO_ANDROIDXR_TYPE_SCENE_MESH_SNAPSHOT_CREATION_RESULT_ANDROIDXR_TYPE_SCENE_SUBMESH_STATE_ANDROIDXR_TYPE_SCENE_SUBMESH_DATA_ANDROID
新しい列挙型
新しい構造
- XrSystemSceneMeshingPropertiesANDROID
- XrSceneMeshingTrackerCreateInfoANDROID
- XrSceneMeshSnapshotCreateInfoANDROID
- XrSceneMeshSnapshotCreationResultANDROID
- XrSceneSubmeshStateANDROID
- XrSceneSubmeshDataANDROID
新機能
- xrCreateSceneMeshingTrackerANDROID
- xrDestroySceneMeshingTrackerANDROID
- xrEnumerateSupportedSemanticLabelSetsANDROID
- xrCreateSceneMeshSnapshotANDROID
- xrDestroySceneMeshSnapshotANDROID
- xrGetAllSubmeshStatesANDROID
- xrGetSubmeshDataANDROID
問題
変更履歴
- リビジョン 3、2025-05-15(Salar Khan) ** 拡張機能の最初の説明
OpenXR™ および OpenXR のロゴは、Khronos Group Inc. が所有する商標であり、中国、欧州連合、日本、英国で商標として登録されています。