XR_ANDROID_scene_meshing OpenXR 拡張機能

名前文字列 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 権限は、ランタイムがユーザー環境を調査することを許可するため、機密性の高い権限と見なされます。

これらの関数を使用するには、実行時に権限をリクエストする必要があります

(保護レベル: 危険)

システムの機能を検証する

アプリケーションは、xrGetSystemProperties を呼び出すときに XrSystemSceneMeshingPropertiesANDROID 構造体を XrSystemProperties にチェーンすることで、システムがシーン メッシュに対応しているかどうかを検査できます

XrSystemSceneMeshingPropertiesANDROID

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

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。このような構造は、コア OpenXR またはこの拡張機能では定義されていません。
  • supportsSceneMeshingXrBool32 で、システムがシーン メッシュをサポートしているかどうかを示します。

supportsSceneMeshingXR_FALSE の場合、システムはシーン メッシュをサポートしていません。supportsSceneMeshingXR_FALSE の場合、xrCreateSceneMeshingTrackerANDROID の呼び出しが失敗するため、アプリはシーン メッシュ機能の使用を避けるべきです。

supportsSceneMeshingXR_TRUE の場合、システムはシーン メッシュをサポートします。

有効な使用量(暗黙的)

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 です。
  • supportedSemanticLabelSetsInputCapacitysupportedSemanticLabelSets の長さです。
  • 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);

パラメータの説明

システムがシーン メッシュをサポートしていない場合、xrCreateSceneMeshingTrackerANDROIDXR_ERROR_FEATURE_UNSUPPORTED を返します。アプリは、XrSystemSceneMeshingPropertiesANDROID 構造体で xrGetSystemProperties を呼び出すことで、システム サポートを確認できます。

シーン メッシュ トラッカーを作成するときに XrSceneMeshingTrackerCreateInfoANDROID::semanticLabelSet で使用できるのは、システムでサポートされているセマンティック ラベルセットのみです。関数 xrEnumerateSupportedSemanticLabelSetsANDROID を使用して、サポートされているセマンティック ラベルセットのリストを取得できます。

アプリがサポートされていない semanticLabelSet をリクエストした場合、xrCreateSceneMeshingTrackerANDROIDXR_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);

パラメータの説明

シーン メッシュ スナップショット ハンドルを作成する

XrSceneMeshSnapshotANDROID

XR_DEFINE_HANDLE(XrSceneMeshSnapshotANDROID)

XrSceneMeshSnapshotANDROID ハンドルは、シーン メッシュ スナップショットを表します。これは xrCreateSceneMeshSnapshotANDROID を使用して作成されます。これは、関数呼び出し時のシーン メッシュ データのスナップショットを実質的に取得します。

このハンドルは、xrGetAllSubmeshStatesANDROIDxrGetSubmeshDataANDROID を使用して、サブメッシュの情報とデータを取得するために使用できます。

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 ハンドルを返します。ハンドルは、作成時のシーン メッシュデータのスナップショットです。このハンドルは、それぞれ xrGetAllSubmeshStatesANDROIDxrGetSubmeshDataANDROID を使用して、シーン メッシュの情報とデータのクエリに使用できます。

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

パラメータの説明

シーンメッシュ スナップショットからシーンメッシュ データを取得する

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 ハンドルです。
  • submeshStateCapacityInputsubmeshStates の長さです。
  • submeshStateCountOutput は、配列の先頭からランタイムによって変更される submeshStates 内の要素の数です。
  • submeshStatesXrSceneSubmeshStateANDROID 構造体の配列です。ランタイムは、シーンメッシュ内のすべてのサブメッシュの状態をこの配列に出力します。

XrSceneSubmeshDataANDROID

XrSceneSubmeshDataANDROID には、サブメッシュの三角形データとサブメッシュ ID が含まれます。この構造体は、xrGetSubmeshDataANDROID でサブメッシュのデータを取得するために使用されます。アプリケーションは、この構造体のサブメッシュ ID とバッファ ポインタを割り当てられたバッファに設定して、サブメッシュの返されたデータを割り当てられたバッファに格納できるようにする必要があります。アプリケーションは、2 回の呼び出しイディオムとして xrGetSubmeshDataANDROID を使用できます。最初の呼び出しでは、アプリケーションがサブメッシュ 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 は、vertexPositionsvertexNormalsvertexSemantics の長さです。
  • vertexCountOutput は、配列の先頭からランタイムによって変更された vertexPositionsvertexNormalsvertexSemantics の要素の数です。
  • vertexPositions は、ランタイムがサブメッシュの頂点位置を出力する XrVector3f の配列です。
  • vertexNormalsXrVector3f の配列で、ランタイムがサブメッシュの頂点法線を出力します。アプリケーションが法線を無効にしてトラッカーを作成した場合、このフィールドは NULL のままにできます
  • vertexSemantics は、ランタイムがサブメッシュの頂点セマンティクスを出力する uint8_t の配列です。アプリケーションが XR_SCENE_MESH_SEMANTIC_LABEL_SET_NONE_ANDROID セマンティック ラベルを設定してトラッカーを作成した場合、このフィールドは NULL のままにできます
  • indexCapacityInputindices の長さです。
  • indexCountOutput は、配列の先頭からランタイムによって変更された indices 内の要素の数です。
  • indices は、ランタイムがサブメッシュのインデックスを出力する uint32_t の配列です。

xrGetSubmeshDataANDROID

アプリは、xrGetSubmeshDataANDROID 関数を使用して、選択したサブメッシュのリストのデータを取得できます。この関数は、2 回の呼び出しイディオムで使用できます。最初の呼び出しでは、アプリケーションは、選択したサブメッシュのリストの各要素に対して、有効なサブメッシュ ID(同じシーンメッシュ スナップショットで xrGetAllSubmeshStatesANDROID から取得可能)と容量ゼロを設定して、サブメッシュ データに必要なバッファのサイズを取得しなければなりません。2 回目の呼び出しでは、アプリケーションは、選択したサブメッシュのリスト内の各要素の割り当て済みバッファへのバッファ ポインタと、サブメッシュのデータを取得するためのバッファの容量を設定しなければなりません

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

パラメータの説明

XrSceneMeshSemanticLabelANDROID

XrSceneMeshSemanticLabelANDROID 列挙型は、メッシュの頂点にラベルを付けて、メッシュの頂点がどの物理環境のサーフェス上にあるかを記述するために使用できるセマンティック ラベルのデフォルト セットです。この列挙型セットは、XrSceneMeshSemanticLabelSetANDROIDXR_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);

パラメータの説明

シーン メッシュのサンプルコード

次のサンプルコードは、レンダリング用のシーン メッシュ データにアクセスする方法を示しています。

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_ANDROID
  • XR_OBJECT_TYPE_SCENE_MESH_SNAPSHOT_ANDROID

XrStructureType 列挙型が拡張され、次の値が追加されました。

  • 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

新しい列挙型

新しい構造

新機能

問題

変更履歴

  • リビジョン 3、2025-05-15(Salar Khan) ** 拡張機能の最初の説明

OpenXR™ および OpenXR のロゴは、Khronos Group Inc. が所有する商標であり、中国、欧州連合、日本、英国で商標として登録されています。