開発
開発
プラットフォームを選択

OpenXRシーンAPIリファレンス

更新日時: 2025/06/03
OpenXRを初めて使う方は、このドキュメントの前に、Khronos Groupが提供しているOpenXR APIリファレンスをお読みください。

概要

1つのシーンモデルは、複数のアンカーで構成されます。各アンカーは1つのエンティティの固有識別情報を表し、すべてのデータ交換はアンカーで発生しています。
アプリ内からアンカーにアクセスするには、OpenXR XrSpaceハンドルを使います。つまり、アンカーが関与する操作は、XrSpaceハンドルを使って対象のアンカーを識別します。

エンティティコンポーネントシステム

当社では、ゲームエンジン内で広く使われているエンティティコンポーネントシステムのパターンにヒントを得て、さまざまなデータ型を表現する汎用アンカーを使用できるようにしました。このアーキテクチャの背後にある主要なアイデアは、継承ではなくコンポジションを通じて専門化を提供することです。この戦略では、複数のエンティティタイプで一部の特性が共有されているものの異なる特性もある場合に起きるタイプの爆発を回避できます。
このシステムでは、各アンカーは、アンカーがサポートするコンポーネントの特定のセットを持つ1つの空間エンティティとして表されます。各空間エンティティには、1つのユニバーサル固有識別情報(UUID)が関連付けられています。これは、アンカーのXrSpaceハンドルを使って取得できます。セッション中にのみアクティブになるXrSpaceハンドルとは異なり、アンカーのUUIDは、アンカーのライフサイクルを通じて変わらない定数です。クエリなど、セッションを越えてアンカーに対して実行する操作では、UUIDを使うようおすすめします。

非同期操作とイベント処理

コンポーネントの有効化やアンカーのクエリなど、実行に長時間かかる可能性のある操作は非同期です。下記のコードサンプルに示されているように、それらのメソッドには、操作の中でステータスの変更を通知するための対応するイベントがあります。リクエストIDの出力パラメーターを使うことにより、イベントをトリガーしたリクエストを特定することができます。
イベントは、以下のようにandroid_main関数でイベントループを使うことによって処理することができます。
while (androidApp->destroyRequested == 0) {
    // Read all pending events.
    for (;;) {
        int events;
        struct android_poll_source* source;
        // If the timeout is zero, returns immediately without blocking.
        // If the timeout is negative, waits indefinitely until an event appears.
        const int timeoutMilliseconds = (app.Resumed == false && app.SessionActive == false && androidApp->destroyRequested == 0) ? -1 : 0;

        if (ALooper_pollAll(timeoutMilliseconds, NULL, &events, (void**)&source) < 0) {
            break;
        }

        // Process this event.
        if (source != NULL) {
            source->process(androidApp, source);
        }
    }

    app.HandleXrEvents();
...
}
HandleXrEvents関数はかなり長くなる場合があります。詳細なサンプルについては、XrSceneModelサンプルアプリの中のovrApp::HandleXrEvents関数をご覧ください。

アンカーの位置特定

アンカーは、xrLocateSpace関数を使って位置を特定できます。この関数は、「基本空間」に対する相対値として空間のポーズを取得します。下記の例では、(ヘッドセットに位置合わせした)ビュー原点となる基本空間を取得しています。
XrReferenceSpaceCreateInfo spaceCreateInfo = {XR_TYPE_REFERENCE_SPACE_CREATE_INFO};
spaceCreateInfo.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_VIEW;
spaceCreateInfo.poseInReferenceSpace.orientation.w = 1.0f;
OXR(xrCreateReferenceSpace(app.Session, &spaceCreateInfo, &app.HeadSpace));
この例では、app.HeadSpaceが、基準空間を保存するのに使われるXrSpaceハンドルです。
ローカルの基準空間とステージの基準空間は、XR_REFERENCE_SPACE_TYPE_LOCALXR_REFERENCE_SPACE_TYPE_STAGEの基準空間タイプを使って取得できます。詳しくは、XrSpaceReferenceTypeをご覧ください。

空間エンティティ

拡張: XR_FB_spatial_entity
ヘッダーインクルード: fb_spatial_entity.h
アンカーには、それがサポートするコンポーネントの特定のセットがあります。それらのコンポーネントを有効にすることにより、それらのコンポーネントに関連付けられている操作にアクセスできます。コンポーネントのサポートと状態は、アンカーごとに固有です。
一般に、アンカーでは、XrSpaceComponentTypeFB列挙により提供される、以下のコンポーネントのサブセットをサポートします。
typedef enum XrSpaceComponentTypeFB {
   // Works with xrLocateSpace, etc.
   XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB = 0,
   // enables save, load, erase, etc.
   XR_SPACE_COMPONENT_TYPE_STORABLE_FB = 1,
   // Bounded 2D component, used in fb_scene extension.
   XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB = 3,
   // Bounded 3D component, used in fb_scene extension.
   XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB = 4,
   // Semantic labels component, used in fb_scene extension.
   XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB = 5,
   // Room layout component, used in fb_scene extension.
   XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB = 6,
   // Space container component, used in fb_spatial_entity_container extension.
   XR_SPACE_COMPONENT_TYPE_SPACE_CONTAINER_FB = 7,
   XR_SPACE_COMPONENT_TYPE_MAX_ENUM_FB = 0x7FFFFFFF
} XrSpaceComponentTypeFB;

  • Locatable: このコンポーネントを有効にすると、xrLocateSpaceメソッドにより、アンカーの6DoFポーズをトラッキングすることができます。
  • Storable: このコンポーネントを有効にすると、アンカーの永続(書き込み)操作が可能になります。それらは、“save”と“erase”です。シーンモデルはシステム管理なので、そのアンカーを保存したりアプリから消去したりすることはできません。アプリのStorableコンポーネントを有効にしようとすると、エラーコードが出ます。
  • Bounded_2D: このコンポーネントを持つアンカーは、2D平面を定義し、2D境界線と2Dバウンディングボックスをサポートします。
  • Bounded_3D: このコンポーネントを持つアンカーは、3D立体を定義し、3Dバウンディングボックスをサポートします。
  • Semantic_labels: このコンポーネントを持つアンカーには、セマンティックラベルがあります。
  • Room_layout: このコンポーネントを持つアンカーには、ルームのレイアウト情報が含まれています。
  • Space_container: このコンポーネントを持つアンカーには、空間のリストが含まれています。

操作

サポートされるコンポーネントの列挙
XrResult xrEnumerateSpaceSupportedComponentsFB(
    XrSpace space,
    uint32_t componentTypesCapacityInput,
    uint32_t* componentTypesCountOutput,
    XrSpaceComponentTypeFB* componentTypes);
xrEnumerateSpaceSupportedComponentsFB関数は、指定されたアンカーでサポートされているコンポーネントを列挙します。戻り値は、操作が成功したかどうかを示します。
パラメーター
  • space: このパラメーターには、サポートされるコンポーネントを列挙する対象となるアンカーのハンドルが入れられます。
  • componentTypesCapacityInput: 呼び出し側で予期されているコンポーネントタイプの最大数。この値は、componentTypes出力パラメーターを通じて返される配列が、呼び出し側が割り当てた配列の境界を越えないようにするため、呼び出し側によって使われます。
  • [out] componentTypesCountOutput: 実際に列挙されたコンポーネントタイプの数。
  • [out] componentTypes: 指定されたアンカーでサポートされるコンポーネントタイプを列挙する配列。
戻り値
  • 操作が成功したかどうかを示す値。
コンポーネントの有効化と無効化
XrResult xrSetSpaceComponentStatusFB(
    XrSpace space,
    const XrSpaceComponentStatusSetInfoFB* info,
    XrAsyncRequestIdFB* requestId);
この非同期関数は、指定されたアンカーの特定のコンポーネントを有効または無効にします。戻り値は、操作が成功したかどうかを示します。
パラメーター
  • space: コンポーネントステータスを設定したいアンカーのハンドル。
  • info: 有効にしたいコンポーネントステータスの構造体(下記に定義)。
  • [out] requestId: この非同期リクエストのID。
戻り値
  • 操作が成功したかどうかを示す値。
コンポーネントステータスは、次の構造体に入れられます。
  • componentType: ステータスを設定する対象のコンポーネント。
  • enable: 設定するステータスの値。
  • timeout: 操作のタイムアウト値(ナノ秒単位)。値0.0を指定すると、タイムアウトになりません。
struct XrSpaceComponentStatusSetInfoFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;
   XrSpaceComponentTypeFB componentType;
   XrBool32 enabled;
   XrDuration timeout;
} XrSpaceComponentStatusSetInfoFB;
注: このAPIでは、シーンモデルアンカーのLocateableを有効にすることができます。ただし、Room_layoutコンポーネントを持つアンカーを除きます。StorableBounded_2Dなどのその他のコンポーネントを有効にすることは、アプリのシーンモデルアンカーではサポートされていません。それらのアンカーは、システムによって生成され所有されているからです。
コンポーネントのステータスの取得
XrResult xrGetSpaceComponentStatusFB(
    XrSpace space,
    XrSpaceComponentTypeFB componentType,
    XrSpaceComponentStatusFB* status);
この関数は、指定されたアンカーの特定のコンポーネントの現在のステータスを取得します。ステータス情報は、[out] statusパラメーターにあります。
パラメーター
  • space: ステータスについてクエリするコンポーネントのアンカーのハンドル。
  • componentType: ステータスをクエリするコンポーネントのコンポーネントタイプ。
  • [out] status: クエリしたコンポーネントのステータスについての情報が入れられた構造体。
戻り値
  • 操作が成功したかどうかを示す値。
アンカーのUUIDの取得
XrResult xrGetSpaceUuidFB(
    XrSpace space,
    XrUuidEXT* uuid);
指定したアンカーのUUIDを取得するには、そのXrSpaceハンドルを使ってxrGetSpaceUuidFB関数を使います。
パラメーター
  • space: アンカーのXrSpaceハンドル。
  • [out] uuid: アンカーのUUID。
戻り値
  • 操作が成功したかどうかを示す値。
UUIDは、以下の構造体にあります。
typedef struct XrUuidEXT {
   uint8_t value[XR_UUID_SIZE_EXT];
} XrUuidEXT;

シーンモデル

拡張: XR_FB_scene ヘッダーインクルード: openxr/openxr.h

2Dバウンディングボックスの取得

XrResult xrGetSpaceBoundingBox2DFB(
    XrSession session,
    XrSpace space,
    XrRect2Df* boundingBox2DOutput);
境界のある2Dコンポーネントが有効になっている、アンカーに関連付けられている2Dバウンディングボックスを取得するには、xrGetSpaceBoundingBox2DFB関数を使います。
パラメーター
  • session: 現在のXrSession。
  • space: シーンモデルアンカーのXrSpaceハンドル。
  • [out] boundingBox2DOutput: システムが2Dバウンディングボックス(XrRect2Df)を保管するバッファー。
戻り値
  • 操作が成功したかどうかを示す値。

3Dバウンディングボックスの取得

XrResult xrGetSpaceBoundingBox3DFB(
    XrSession session,
    XrSpace space,
    XrRect3DfFB* boundingBox3DOutput);
境界のある3Dコンポーネントが有効になっている、アンカーに関連付けられている3Dバウンディングボックスを取得するには、xrGetSpaceBoundingBox3DFB関数を使います。
パラメーター
  • session: 現在のXrSession。
  • space: シーンモデルアンカーのXrSpaceハンドル。
  • [out] boundingBox3DOutput: システムが3Dバウンディングボックスを保管するバッファー。
戻り値
  • 操作が成功したかどうかを示す値。
3Dバウンディングボックスの構造体
typedef struct XrExtent3DfFB {
   float width;
   float height;
   float depth;
} XrExtent3DfFB;

typedef struct XrOffset3DfFB {
   float x;
   float y;
   float z;
} XrOffset3DfFB;

typedef struct XrRect3DfFB {
   XrOffset3DfFB offset;
   XrExtent3DfFB extent;
} XrRect3DfFB;

セマンティックラベルコンポーネントの取得

XrResult xrGetSpaceSemanticLabelsFB(
   XrSession session,
   XrSpace space,
   XrSemanticLabelsFB* semanticLabelsOutput);
セマンティックラベルコンポーネントを有効にした、アンカーに関連付けられている1つ以上のセマンティックラベルを取得するには、xrGetSpaceSemanticLabelsFB関数を使います。
パラメーター
  • session: 現在のXrSession。
  • space: シーンモデルアンカーのXrSpaceハンドル。
  • [out] semanticLabelsOutput: システムがセマンティックラベルを保管するバッファー。
戻り値
  • 操作が成功したかどうかを示す値。
セマンティックラベルの構造体
typedef struct XrSemanticLabelsFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;

   // Input of the label buffer capacity in byte.
   uint32_t byteCapacityInput;

   // Output of the label buffer size in byte.
   uint32_t byteCountOutput;

   // Multiple labels represented by raw string, separated by comma (,).
   char* labels;
} XrSemanticLabelsFB
xrGetSpaceSemanticLabelsFB関数では、可変長のセマンティックラベルを取得するために、2段階呼び出しイディオムを採用しています。最初の呼び出しでは、byteCapacityInputに0を渡すことにより、必要なバッファーサイズを取得します。それは、byteCountOutputに入れられて返されます。byteCountOutput以上のサイズのバッファーを割り当てた後、2回目の呼び出しでは、割り当てられたバッファーへのポインターを渡すことにより、セマンティックラベルを取得します。アンカーのラベルは、システムによりCSV形式の文字配列として保管されます。
サポートされるセマンティックラベルシステム
セマンティックラベル
説明
幾何学表現
ルームの構造
 
 
CEILING
天井
2D
DOOR_FRAME
ドアの枠。壁面内に存在していなければならない
2D
FLOOR
2D
INVISIBLE_WALL_FACE
オープンルームを囲むためにスペースの設定によって追加された壁面
2D
WALL_ART
壁面アート。壁面内に存在していなければならない
2D
WALL_FACE
壁面
2D
WINDOW_FRAME
窓枠 - 壁面内に存在していなければならない
2D
ルームの内容
 
 
COUCH
ソファー
2D (シート)と3D (立体)
TABLE
テーブル
2D (テーブル上面)と3D (立体)
BED
ベッド
2D (サーフェス)と3D (立体)
LAMP
ランプ
3D
PLANT
植物
3D
SCREEN
スクリーン
3D
STORAGE
保存容器
2D (単一の棚)と3D (立体)
メッシュのオブジェクト
 
 
GLOBAL_MESH
スペースの設定中にキャプチャされたユーザーのスペースの三角メッシュ
 
未分類のオブジェクト
 
 
OTHER
一般的な立体
3D
このラベルリストは進化しており、サポートされる2Dオブジェクトと3Dオブジェクトは定期的に追加されています。そのため、OTHERタイプはフォールバックと考えてください。今後、OTHERがタイプではなくなる可能性があり、このラベルを付けているオブジェクトは、変更が必要になるかもしれません。

2D境界線の取得

XrResult xrGetSpaceBoundary2DFB(
    XrSession session,
    XrSpace space,
    XrBoundary2DFB* boundary2DOutput);
境界のある2Dコンポーネントが有効になっている、アンカーに関連付けられている2Dポリゴンの境界線を取得するには、xrGetSpaceBoundary2DFB関数を使います。
パラメーター
  • session: 現在のXrSession。
  • space: シーンモデルアンカーのXrSpaceハンドル。
  • [out] boundary2DOutput: システムが2D境界線(XrBoundary2DFB)を保管するバッファー。
戻り値
  • 操作が成功したかどうかを示す値。
xrGetSpaceBoundary2DFB関数では、可変頂点数の境界線を取得するため、セマンティックラベルの場合に使うものと同様の2段階呼び出しイディオムが採用されています。
// 2D boundary for two-call idiom with xrGetSpaceBoundary2DFB.
struct XrBoundary2DFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;

   // Input, capacity of the vertex buffer.
   uint32_t vertexCapacityInput;

   // Output, size of the vertex buffer.
   uint32_t vertexCountOutput;
   // Vertices of the polygonal boundary in the coordinate frame of the associated space.
   // Currently only support outer bounds.
   XrVector2f* vertices;
} XrBoundary2DFB;

ルームレイアウトコンポーネントの取得

XrResult xrGetSpaceRoomLayoutFB(
    XrSession session,
    XrSpace space,
    XrRoomLayoutFB* roomLayoutOutput);
アンカーのルームレイアウトコンポーネントが有効な場合にそれを取得するには、xrGetSpaceRoomLayoutFB関数を使います。
パラメーター
  • session: 現在のXrSession。
  • space: シーンモデルアンカーのXrSpaceハンドル。
  • [out] XrRoomLayoutFB: システムがルームレイアウトを保管するバッファー。
戻り値
  • 操作が成功したかどうかを示す値。
ルームレイアウトの構造体
typedef struct XrRoomLayoutFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;

   // Floor of the room layout.
   XrUuidEXT floorUuid;

   // Ceiling of the room layout.
   XrUuidEXT ceilingUuid;

   // Input, capacity of wall list buffer.
   uint32_t wallUuidCapacityInput;

   // Output, number of walls included in the list.
   uint32_t wallUuidCountOutput;

   // Ordered list of walls of the room layout.
   XrUuidEXT* wallUuids;
} XrRoomLayoutFB;
xrGetSpaceRoomLayoutFB関数では、ルームレイアウトコンポーネントに含まれる可変数の壁を取得するため、2段階呼び出しイディオムを使います。レイアウトに壁が存在しない場合、最初の呼び出しでは、uuidWallsCountOutputパラメーターで0が返されます。この関数の最初の呼び出しでは、床と天井のUUIDが返されます(ある場合)。

空間コンテナ

拡張: XR_FB_spatial_entity_container ヘッダーインクルード: openxr/openxr.h

空間コンテナコンポーネントの取得

XrResult xrGetSpaceContainerFB(
   XrSession session,
   XrSpace space,
   XrSpaceContainerFB* spaceContainerOutput);
空間コンテナが有効になっている場合、アンカーに関連付けられているxrGetSpaceContainerFB関数を使って取得します。空間コンテナには、UUIDにより識別される一連のシーンモデルアンカーが含まれています。
パラメーター
  • session: 現在のXrSession。
  • space: シーンモデルアンカーのXrSpaceハンドル。
  • [out] spaceContainerOutput: システムが空間コンテナを保管するバッファー。
戻り値
  • 操作が成功したかどうかを示す値。
空間コンテナの構造体
typedef struct XrSpaceContainerFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;

   // Input, capacity of UUID list.
   uint32_t uuidCapacityInput;

   // Output, number of spatial entities included in the list.
   uint32_t uuidCountOutput;

   // List of spatial entities contained in the entity to which this component is attached.
   XrUuidEXT* uuids;
} XrSpaceContainerFB;
xrGetSpaceContainerFB関数では、コンテナに含まれる空間の可変数を取得するため、2段階呼び出しイディオムを使います。

シーンキャプチャ

拡張: XR_FB_scene_capture ヘッダーインクルード: fb_scene_capture.h

シーンキャプチャのリクエスト

XrResult xrRequestSceneCaptureFB(
   XrSession session,
   const XrSceneCaptureRequestFB* request,
   XrAsyncRequestIdFB* requestId);
ルームなど、物理的環境のキャプチャフローを開始するリクエストをシステムに送信するには、xrRequestSceneCaptureFB関数を使います。キャプチャが開始されると、システムUXフローを通じてキャプチャを完了する手順に沿って、システムがユーザーをガイドします。
パラメーター
  • session: 現在のXrSession。
  • request: キャプチャリクエストのデータを指定します。
  • [out] requestId: 非同期リクエストのID。
戻り値
  • 操作が成功したかどうかを示す値。
シーンキャプチャリクエストの構造体
typedef struct XrSceneCaptureRequestFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;

   // Length of request buffer.
   uint32_t requestByteCount;

   // Request buffer.
   char* request;
} XrSceneCaptureRequestFB;
フィールド
  • type: この構造体のXrStructureType
  • next: 未使用。
  • requestByteCount: 未使用。 0に設定してください。
  • request: 未使用。nullptrに設定してください。
イベント
  • XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB: シーンキャプチャ完了のシグナルを出します。
注:XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FBイベントのイベントデータには、XrEventDataSceneCaptureCompleteFB構造体が含まれています。そこに、シーンキャプチャ操作の結果が入れられます。
typedef struct XrEventDataSceneCaptureCompleteFB {
   XrStructureType type; // XR_TYPE_EVENT_SCENE_CAPTURE_COMPLETE_FB
   const void* XR_MAY_ALIAS next;
   XrResult result;
   XrAsyncRequestIdFB requestId;
} XrEventDataSceneCaptureCompleteFB;
フィールド
  • type: この構造体のXrStructureType
  • next: 未使用。
  • result: シーンキャプチャ操作の結果。
  • requestId: このイベントをトリガーしたリクエストのID。

シーンモデル/空間エンティティのクエリ

拡張: XR_FB_spatial_entity_query ヘッダーインクルード: openxr/openxr.h
このアンカークエリ関数で、ストレージからシーンモデルの発見とストレージからの読み込みを実行します。この関数を構成するフィルターで、検索クエリ、および検索結果に対して実行する操作を定義します。

クエリの開始

XrResult xrQuerySpacesFB(
    XrSession session,
    const XrSpaceQueryInfoBaseHeaderFB* info,
    XrAsyncRequestIdFB* requestId);
xrQuerySpacesFB関数の主な用途は、ストレージからアンカーを見つけて取り出すことです。実際のところ、構造体XrSpaceQueryInfoFBのインスタンスへの参照は、データをクエリ関数に渡してクエリフィルターを構成する際に、XrSpaceQueryInfoBaseHeaderFBにキャストされます。
filterフィールドとexcludeFilterフィールドを使うことにより、クエリフィルターを連結することができます。
typedef struct XrSpaceQueryInfoFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;
   XrSpaceQueryActionFB queryAction;
   uint32_t maxResultCount;
   XrDuration timeout;
   const XrSpaceFilterInfoBaseHeaderFB* filter;
   const XrSpaceFilterInfoBaseHeaderFB* excludeFilter;
} XrSpaceQueryInfoFB;
クエリシステムによってサポートされているアクションは、以下の列挙の中で定義されています。
typedef enum XrSpaceQueryActionFB {
   // returns XrSpaces
   XR_SPACE_QUERY_ACTION_LOAD_FB = 0,
   XR_SPACE_QUERY_ACTION_MAX_ENUM_FB = 0x7FFFFFFF
} XrSpaceQueryActionFB;
XR_SPACE_QUERY_ACTION_LOAD_FBは、クエリによって返されるアンカーに対して読み込み操作を実行するよう、クエリに指示します。
特定のコンポーネントを持つアンカーを見つけるには、次のフィルターを使います。
typedef struct XrSpaceComponentFilterInfoFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;
   XrSpaceComponentTypeFB componentType;
} XrSpaceComponentFilterInfoFB;
指定したUUIDに一致するアンカーを見つけるには、次のフィルターを使います。
typedef struct XrSpaceUuidFilterInfoFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;
   uint32_t uuidCount;
   const XrUuidEXT* uuids;
} XrSpaceUuidFilterInfoFB;
イベント
  • XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB: クエリから返される各空間でトリガーされます。
  • XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB: システムがクエリ操作を完了するとトリガーされます。
注: トリガーされるXR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FBイベントごとに、2段階呼び出しイディオムのxrRetrieveSpaceQueryResultsFBを使うことにより、XrSpaceQueryResultsFBを取得してください。これにクエリ結果のリストが含まれています。
typedef struct XrSpaceQueryResultsFB {
   XrStructureType type;
   const void* XR_MAY_ALIAS next;
   uint32_t resultCapacityInput;
   uint32_t resultCountOutput;
   XrSpaceQueryResultFB* results;
} XrSpaceQueryResultsFB;
各クエリ結果には、返されるアンカーのXrSpaceハンドルとUUIDが含まれます。
typedef struct XrSpaceQueryResultFB {
   XrSpace space;
   XrUuidEXT uuid;
} XrSpaceQueryResultFB;
フィールド
  • space: クエリにより見つかったXrSpace
  • uuid: 空間のUUID。
例1: 特定のルームでキャプチャされたアンカーのクエリ
特定のルームでキャプチャされたアンカーをクエリする手順は、次のとおりです。
ステップ1: ルームレイアウトコンポーネントを持つアンカーをクエリする。
XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
    XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
    nullptr,
    XR_SPACE_STORAGE_LOCATION_LOCAL_FB};

XrSpaceComponentFilterInfoFB componentFilterInfo = {
    XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB,
    &storageLocationFilterInfo,
    XR_SPACE_COMPONENT_TYPE_ROOM_LAYOUT_FB};

XrSpaceQueryInfoFB queryInfo = {
    XR_TYPE_SPACE_QUERY_INFO_FB,
    nullptr,
    XR_SPACE_QUERY_ACTION_LOAD_FB,
    MAX_PERSISTENT_SPACES,
    0,
    (XrSpaceFilterInfoBaseHeaderFB*)&componentFilterInfo,
    nullptr};

XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
    app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
ステップ2: ルームレイアウトコンポーネントを持つアンカーには、空間エンティティコンテナコンポーネントもあります。壁、天井、床に加えて、空間エンティティコンテナには、ルームでキャプチャされたデスクやカウチなどの他のオブジェクトも含まれます。
返されたアンカーのルームレイアウトに関連するアンカーを取得するには、次のようにします。
XrRoomLayoutFB roomLayout = {};
// First call
OXR(FunPtrs.xrGetSpaceRoomLayoutFB(Session, space, &roomLayout));
// Second call
std::vector<XrUuidEXT> wallUuids(roomLayout.wallUuidCountOutput
);
roomLayout.wallUuidCapacityInput = wallUuids.size();
roomLayout.wallUuids = wallUuids.data();
OXR(FunPtrs.xrGetSpaceRoomLayoutFB(Session, space, &roomLayout));

if (isValid(roomLayout.floorUuid)) {
    uuidSet.insert(uuidToHexString(roomLayout.floorUuid));
}
if (isValid(roomLayout.ceilingUuid)) {
    uuidSet.insert(uuidToHexString(roomLayout.ceilingUuid));
}
for (uint32_t i = 0; i < roomLayout.wallUuidCountOutput; i++) {
    uuidSet.insert(uuidToHexString(roomLayout.wallUuids[i]));
}
返されたアンカーの空間エンティティコンテナに含まれるすべてのアンカーのリストを取得するには、次のようにします。
XrSpaceContainerFB spaceContainer = {};
// First call
OXR(FunPtrs.xrGetSpaceContainerFB(Session, space, &spaceContainer));
// Second call
std::vector<XrUuidEXT> uuids(spaceContainer.uuidCountOutput);
spaceContainer.uuidCapacityInput = uuids.size();
spaceContainer.uuids = uuids.data();
OXR(FunPtrs.xrGetSpaceContainerFB(Session, space, &spaceContainer));

for (uint32_t i = 0; i < spaceContainer.uuidCountOutput; i++) {
    uuidSet.insert(uuidToHexString(spaceContainer.uuids[i]));
}
ステップ3: 収集されたUUIDのリストを使ってアンカーをクエリする。
XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
    XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
    nullptr,
    XR_SPACE_STORAGE_LOCATION_LOCAL_FB};

XrSpaceUuidFilterInfoFB uuidFilterInfo = {
    XR_TYPE_SPACE_UUID_FILTER_INFO_FB,
    &storageLocationFilterInfo,
    (uint32_t)uuidsToQuery.size(),
    uuidsToQuery.data()};

XrSpaceQueryInfoFB queryInfo = {
    XR_TYPE_SPACE_QUERY_INFO_FB,
    nullptr,
    XR_SPACE_QUERY_ACTION_LOAD_FB,
    MAX_PERSISTENT_SPACES,
    0,
    (XrSpaceFilterInfoBaseHeaderFB*)&uuidFilterInfo,
    nullptr};

XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
    app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
例2: 境界のある2Dコンポーネントを持つアンカーのクエリ
XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
    XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
    nullptr,
    XR_SPACE_STORAGE_LOCATION_LOCAL_FB};

XrSpaceComponentFilterInfoFB componentFilterInfo = {
    XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB,
    &storageLocationFilterInfo,
    XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB};

XrSpaceQueryInfoFB queryInfo = {
    XR_TYPE_SPACE_QUERY_INFO_FB,
    nullptr,
    XR_SPACE_QUERY_ACTION_LOAD_FB,
    MAX_PERSISTENT_SPACES,
    0,
    (XrSpaceFilterInfoBaseHeaderFB*)&componentFilterInfo,
    nullptr};

XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
    app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
例3: 存在するすべてのアンカーのクエリ
XrSpaceQueryInfoFB queryInfo = {
    XR_TYPE_SPACE_QUERY_INFO_FB,
    nullptr,
    XR_SPACE_QUERY_ACTION_LOAD_FB,
    MAX_PERSISTENT_SPACES,
    0,
    nullptr,
    nullptr};

XrAsyncRequestIdFB requestId;
OXR(app.FunPtrs.xrQuerySpacesFB(
    app.Session, (XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
ナビゲーションロゴ
日本語
© 2026 Meta