XR_EXT_spatial_object_tracking

Name String

XR_EXT_spatial_object_tracking

拡張機能の種類

インスタンス拡張

登録済みの内線番号

745

リビジョン

1

承認ステータス

未批准

拡張機能とバージョンの依存関係

XR_EXT_spatial_entity

IP ステータス

既知の IP 申し立てはありません。

寄与者

Nihav Jain、Google
Natalie Fleury、Meta
Yuichi Taguchi、Meta
Ron Bessems、Meta
Yin Li、Microsoft
Jimmy Alamparambil、ByteDance
Zhipeng Liu、ByteDance
Jun Yan、ByteDance
Andy Biar、Unity Technologies
Rebecca Nordhauser、Unity Technologies

概要

この拡張機能は XR_EXT_spatial_entity をベースにしており、アプリケーションからの入力データセットを必要とせずに、事前定義されたオブジェクトのセットを追跡するための空間機能を定義します。

ランタイム サポート

ランタイムがオブジェクト トラッキングをサポートしている場合、xrEnumerateSpatialCapabilitiesEXT で XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT を列挙することで、そのことを示さなければなりません。

構成

XrSpatialCapabilityConfigurationObjectTrackingEXT 構造体は次のように定義されます。

typedef struct XrSpatialCapabilityConfigurationObjectTrackingEXT {
    XrStructureType                     type;
    const void*                         next;
    XrSpatialCapabilityEXT              capability;
    uint32_t                            enabledComponentCount;
    const XrSpatialComponentTypeEXT*    enabledComponents;
} XrSpatialCapabilityConfigurationObjectTrackingEXT;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • capability は XrSpatialCapabilityEXT であり、XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT でなければなりません。
  • enabledComponentCount は、enabledComponents 配列内の要素の数を表す uint32_t です。
  • enabledComponents は XrSpatialComponentTypeEXT の配列へのポインタです。

アプリは、XrSpatialContextCreateInfoEXT :: capabilityConfigs の XrSpatialCapabilityConfigurationObjectTrackingEXT 構造体にポインタを追加することで、XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT 空間機能を有効にできます。

capability が XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT でない場合、ランタイムは XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

有効な使用方法(暗黙的)

保証対象の部品

XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT をサポートするランタイムは、この機能によって検出されたエンティティの保証されたコンポーネントとして、次の空間コンポーネントをサポートしなければならず、xrEnumerateSpatialCapabilityComponentTypesEXT で列挙しなければなりません。

  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT
  • 追跡対象オブジェクトに一連のセマンティック ラベルを提供するコンポーネント タイプが少なくとも 1 つ。オブジェクト トラッキング機能は、セマンティック ラベル コンポーネントがなければ意味がありません。この拡張機能では、ランタイムがサポートする可能性のあるセマンティック ラベル コンポーネントとして XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT と XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT を定義していますが、他の拡張機能では、追跡対象オブジェクトを記述するさまざまなクラスのセマンティック ラベルを提供するために、新しいコンポーネント タイプを定義する場合があります。セマンティック ラベルセットとコンポーネント タイプの設計の詳細については、[ext_spatial_semantic_labels_guidelines] をご覧ください。ランタイムは、オブジェクト トラッキング機能の XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT または XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT のいずれかをサポートしない場合がありますが、セマンティック ラベルを提供するコンポーネント タイプを少なくとも 1 つサポートしなければなりません。

境界付き 3D コンポーネント

境界付き 3D コンポーネントは、それが配置されているエンティティによって表されるオブジェクトの中心と範囲を提供します。詳しくは、境界付き 3D をご覧ください。

オプション コンポーネント

XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT をサポートするランタイムは、保証コンポーネントセクションに記載されているコンポーネントに加えて、空間コンポーネントをサポートする場合があります。アプリは、xrEnumerateSpatialCapabilityComponentTypesEXT を使用して、ランタイムがサポートするコンポーネントの完全なリストを取得できます。その後、空間コンテキストの作成時に、関心のあるコンポーネントを構成できます。

オブジェクトのセマンティック ラベル

コンポーネント データ

typedef enum XrSpatialObjectSemanticLabelEXT {
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT = 2,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT = 3,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT = 4,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT = 5,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT = 6,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT = 7,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT = 8,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT = 9,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT = 10,
    XR_SPATIAL_OBJECT_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialObjectSemanticLabelEXT;

XrSpatialObjectSemanticLabelEXT 列挙型は、オブジェクトの一連のセマンティック ラベルを記述します。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT ラベルを持つエンティティの場合、境界付き 3D コンポーネントの +Z 軸は、画面の表面法線とほぼ一致している必要があります。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT ラベルが付いたエンティティの場合、Bounded 3D コンポーネントの +Z 軸は、アートが検出された壁の表面法線と一致している必要があります。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT ラベルが付いたエンティティの場合、Bounded 3D コンポーネントの +Z 軸は、テーブルの表面法線と一致している必要があります。

XrSpatialObjectSemanticLabelEXT の他のすべてのラベルについて、アプリは、エンティティの Bounded 3D コンポーネントによって提供される XrBoxf :: center :: orientation が、そのオブジェクトの物理属性とどのように一致するかについて、いかなる想定もしてはなりません。

列挙値の意味は次のとおりです。

列挙型の説明

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT

ランタイムがこのエンティティを分類できませんでした。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT

エンティティはソファです。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_BED_EXT

エンティティはベッドです。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CHAIR_EXT

エンティティは椅子です。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT

エンティティはテーブルです。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_LAMP_EXT

エンティティはランプです。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_PLANT_EXT

エンティティは植物です。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_DISPLAY_SCREEN_EXT

エンティティは、モニターやテレビなどのディスプレイ画面です。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_WALL_ART_EXT

エンティティはウォールアートです。

XR_SPATIAL_OBJECT_SEMANTIC_LABEL_CABINET_EXT

エンティティはキャビネットです。

データをクエリするためのコンポーネント リスト構造

XrSpatialComponentObjectSemanticLabelListEXT 構造体は次のように定義されます。

typedef struct XrSpatialComponentObjectSemanticLabelListEXT {
    XrStructureType                     type;
    void*                               next;
    uint32_t                            semanticLabelCount;
    XrSpatialObjectSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentObjectSemanticLabelListEXT;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。このような構造体は、コア OpenXR またはこの拡張機能では定義されていません。
  • semanticLabelCount は、semanticLabels 配列内の要素の数を表す uint32_t です。
  • semanticLabels は XrSpatialObjectSemanticLabelEXT の配列です。

XrSpatialSnapshotEXT 内の空間エンティティのオブジェクト セマンティック ラベル コンポーネントをクエリするには、XrSpatialComponentDataQueryConditionEXT :: componentTypes に XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT を含め、XrSpatialComponentDataQueryResultEXT :: next チェーンに XrSpatialComponentObjectSemanticLabelListEXT を追加します。

XrSpatialComponentObjectSemanticLabelListEXT が XrSpatialComponentDataQueryResultEXT :: next チェーンに含まれているが、XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT が XrSpatialComponentDataQueryConditionEXT :: componentTypes に含まれていない場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_VALIDATION_FAILURE を返す必要があります。

semanticLabelCount が XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput より小さい場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_SIZE_INSUFFICIENT を返さなければなりません。

有効な使用方法(暗黙的)

  • XrSpatialComponentObjectSemanticLabelListEXT を使用する前に、XR_EXT_spatial_object_tracking 拡張機能を有効にする必要があります。
  • type は XR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • semanticLabels は、semanticLabelCount XrSpatialObjectSemanticLabelEXT 値の配列へのポインタでなければなりません
  • semanticLabelCount パラメータは 0 より大きい値にする必要があります。
構成

XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT が XrSpatialCapabilityComponentTypesEXT :: componentTypes で列挙されている場合、アプリは、このコンポーネントをサポートする機能の XrSpatialCapabilityConfigurationBaseHeaderEXT 派生構造の XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents リストに列挙子を含めることで、この機能を有効にできます。

このコンポーネントは、XrSpatialCapabilityConfigurationBaseHeaderEXT :: next チェーンに含めるために特別な構成を必要としませんが、アプリケーションが提供するオプションの構成を提供します。

XrSpatialFeatureObjectSemanticLabelSubsetEXT 構造体は次のように定義されます。

typedef struct XrSpatialFeatureObjectSemanticLabelSubsetEXT {
    XrStructureType                           type;
    const void*                               next;
    uint32_t                                  semanticLabelCount;
    const XrSpatialObjectSemanticLabelEXT*    semanticLabels;
} XrSpatialFeatureObjectSemanticLabelSubsetEXT;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • semanticLabelCount は、semanticLabels 配列内の要素の数を表す uint32_t です。
  • semanticLabels は XrSpatialObjectSemanticLabelEXT の配列です。

ランタイムが特定の機能について xrEnumerateSpatialCapabilityComponentTypesEXT から XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT を列挙する場合、同じ機能について xrEnumerateSpatialCapabilityFeaturesEXT から XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT も列挙しなければなりません。アプリがその機能を構成するときに XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT を有効にすると、XrSpatialFeatureObjectSemanticLabelSubsetEXT をその機能の対応する構成構造にチェーンして、XrSpatialObjectSemanticLabelEXT で定義されたラベルのサブセットをランタイムに提供できます。ランタイムは、このラベルのサブセットを使用してトラッキング パイプラインを最適化する場合があります。

semanticLabels に XrSpatialObjectSemanticLabelEXT で定義されていないラベルが含まれている場合、または semanticLabels に XR_SPATIAL_OBJECT_SEMANTIC_LABEL_UNCATEGORIZED_EXT が含まれている場合、ランタイムは xrCreateSpatialContextAsyncEXT から XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

アプリケーションが semanticLabels で有効なラベルのリストを提供しているが、XrSpatialFeatureObjectSemanticLabelSubsetEXT がチェーンされている構成構造の XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 配列に XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT が含まれていない場合、ランタイムは xrCreateSpatialContextAsyncEXT から XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT を返さなければなりません。

アプリが有効な XrSpatialFeatureObjectSemanticLabelSubsetEXT を使用して機能を構成する場合、ランタイムは、構成された空間コンテキスト用に作成された検出スナップショットに、semanticLabels にリストされていないセマンティック ラベルを持つエンティティを含めてはなりません。

有効な使用方法(暗黙的)

  • XR_EXT_spatial_object_tracking 拡張機能は、XrSpatialFeatureObjectSemanticLabelSubsetEXT を使用する前に有効にする必要があります。
  • type は XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • semanticLabels は、semanticLabelCount 個の有効な XrSpatialObjectSemanticLabelEXT 値の配列へのポインタでなければなりません。
  • semanticLabelCount パラメータは 0 より大きい値にする必要があります。

キーボードのセマンティック ラベル

コンポーネント データ

typedef enum XrSpatialKeyboardSemanticLabelEXT {
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT = 2,
    XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialKeyboardSemanticLabelEXT;

XrSpatialKeyboardSemanticLabelEXT 列挙型は、キーボードのセマンティック ラベルを記述します。

同じエンティティの Bounded 3D コンポーネントで表される XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT の範囲と方向は、オブジェクトの中心を起点とする次の画像(xyz = rgb)に示されています。

外部空間オブジェクト トラッキング キーボードの向き

図 30. キーボードの向き。

列挙型の説明

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_UNCATEGORIZED_EXT

ランタイムがこのエンティティを分類できませんでした。

XR_SPATIAL_KEYBOARD_SEMANTIC_LABEL_KEYBOARD_EXT

エンティティはキーボードです。

クエリデータへのコンポーネント リスト構造体

XrSpatialComponentKeyboardSemanticLabelListEXT 構造体は次のように定義されます。

typedef struct XrSpatialComponentKeyboardSemanticLabelListEXT {
    XrStructureType                       type;
    void*                                 next;
    uint32_t                              semanticLabelCount;
    XrSpatialKeyboardSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentKeyboardSemanticLabelListEXT;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。このような構造体は、コア OpenXR またはこの拡張機能では定義されていません。
  • semanticLabelCount は、semanticLabels 配列内の要素の数を表す uint32_t です。
  • semanticLabels は XrSpatialKeyboardSemanticLabelEXT の配列です。

XrSpatialSnapshotEXT 内の空間エンティティのキーボード セマンティック ラベル コンポーネントをクエリするには、XrSpatialComponentDataQueryConditionEXT :: componentTypes に XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT を含め、XrSpatialComponentDataQueryResultEXT :: next チェーンに XrSpatialComponentKeyboardSemanticLabelListEXT を追加します。

XrSpatialComponentKeyboardSemanticLabelListEXT が XrSpatialComponentDataQueryResultEXT :: next チェーンに含まれているが、XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT が XrSpatialComponentDataQueryConditionEXT :: componentTypes に含まれていない場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

semanticLabelCount が XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput より小さい場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_SIZE_INSUFFICIENT を返さなければなりません。

有効な使用方法(暗黙的)

  • XrSpatialComponentKeyboardSemanticLabelListEXT を使用する前に、XR_EXT_spatial_object_tracking 拡張機能を有効にする必要があります。
  • type は XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • semanticLabels は、semanticLabelCount XrSpatialKeyboardSemanticLabelEXT 値の配列へのポインタでなければなりません
  • semanticLabelCount パラメータは 0 より大きい値にする必要があります。
構成

XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT が XrSpatialCapabilityComponentTypesEXT :: componentTypes で列挙されている場合、アプリは、このコンポーネントをサポートする機能の XrSpatialCapabilityConfigurationBaseHeaderEXT 派生構造の XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents リストに列挙子を含めることで、この機能を有効にできます。

このコンポーネントを XrSpatialCapabilityConfigurationBaseHeaderEXT :: next チェーンに含めるために、特別な構成は必要ありません。

マウスのセマンティック ラベル

コンポーネント データ

typedef enum XrSpatialMouseSemanticLabelEXT {
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT = 2,
    XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialMouseSemanticLabelEXT;

XrSpatialMouseSemanticLabelEXT 列挙型は、マウスのセマンティック ラベルを記述します。

列挙型の説明

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_UNCATEGORIZED_EXT

ランタイムがこのエンティティを分類できませんでした。

XR_SPATIAL_MOUSE_SEMANTIC_LABEL_MOUSE_EXT

エンティティはマウスです。

クエリデータへのコンポーネント リスト構造体

XrSpatialComponentMouseSemanticLabelListEXT 構造体は次のように定義されます。

typedef struct XrSpatialComponentMouseSemanticLabelListEXT {
    XrStructureType                    type;
    void*                              next;
    uint32_t                           semanticLabelCount;
    XrSpatialMouseSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentMouseSemanticLabelListEXT;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。このような構造体は、コア OpenXR またはこの拡張機能では定義されていません。
  • semanticLabelCount は、semanticLabels 配列内の要素の数を表す uint32_t です。
  • semanticLabels は XrSpatialMouseSemanticLabelEXT の配列です。

XrSpatialSnapshotEXT 内の空間エンティティのマウス セマンティック ラベル コンポーネントをクエリするには、XrSpatialComponentDataQueryConditionEXT :: componentTypes に XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT を含め、XrSpatialComponentDataQueryResultEXT :: next チェーンに XrSpatialComponentMouseSemanticLabelListEXT を追加します。

XrSpatialComponentMouseSemanticLabelListEXT が XrSpatialComponentDataQueryResultEXT :: next チェーンに含まれているが、XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT が XrSpatialComponentDataQueryConditionEXT :: componentTypes に含まれていない場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_VALIDATION_FAILURE を返さなければなりません。

semanticLabelCount が XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput より小さい場合、ランタイムは xrQuerySpatialComponentDataEXT から XR_ERROR_SIZE_INSUFFICIENT を返さなければなりません。

有効な使用方法(暗黙的)

  • XR_EXT_spatial_object_tracking 拡張機能は、XrSpatialComponentMouseSemanticLabelListEXT を使用する前に有効にしなければなりません。
  • type は XR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • semanticLabels は、semanticLabelCount XrSpatialMouseSemanticLabelEXT 値の配列へのポインタでなければなりません
  • semanticLabelCount パラメータは 0 より大きい値にする必要があります。
構成

XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT が XrSpatialCapabilityComponentTypesEXT :: componentTypes で列挙されている場合、アプリは、このコンポーネントをサポートする機能の XrSpatialCapabilityConfigurationBaseHeaderEXT 派生構造の XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents リストに列挙子を含めることで、この機能を有効にできます。

このコンポーネントを XrSpatialCapabilityConfigurationBaseHeaderEXT :: next チェーンに含めるために、特別な構成は必要ありません。

コード例

オブジェクト トラッキング機能を構成する

次のサンプルコードは、空間コンテキストの作成時にオブジェクト トラッキング機能を構成する方法を示しています。

// Check if object tracking capability is supported
uint32_t capabilityCount;
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, 0, &capabilityCount, nullptr));
std::vector<XrSpatialCapabilityEXT> capabilities(capabilityCount);
CHK_XR(xrEnumerateSpatialCapabilitiesEXT(instance, systemId, capabilityCount, &capabilityCount, capabilities.data()));

if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT) == capabilities.end()) {
  return;
}

// Enumerate supported components for object tracking capability
XrSpatialCapabilityComponentTypesEXT objectComponents{XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));
std::vector<XrSpatialComponentTypeEXT> objectCapabilityComponents(objectComponents.componentTypeCountOutput);
objectComponents.componentTypeCapacityInput = objectCapabilityComponents.size();
objectComponents.componentTypes = objectCapabilityComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, &objectComponents));

// Check if the object & keyboard semantic labels component is supported
const auto supportsComponent = [&objectCapabilityComponents](XrSpatialComponentTypeEXT component) {
  return std::find(objectCapabilityComponents.begin(), objectCapabilityComponents.end(), component) != objectCapabilityComponents.end();
};

const bool supportsObjectSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
const bool supportsKeyboardSemanticLabel = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);

// Enumerate supported features for object tracking capability
uint32_t featureCount;
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, 0, &featureCount, nullptr));
std::vector<XrSpatialCapabilityFeatureEXT> features(featureCount);
CHK_XR(xrEnumerateSpatialCapabilityFeaturesEXT(instance, systemId, XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT, featureCount, &featureCount, features.data()));

const bool supportsObjectSemanticLabelSubsetFeature = std::find(features.begin(), features.end(), XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT) != features.end();

// Create a spatial context
XrSpatialContextEXT spatialContext{};

// Enable the guaranteed components of the object tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
// Optionally enable the supported semantic labels
if (supportsObjectSemanticLabel) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT);
}
if (supportsKeyboardSemanticLabel) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}

// We only want to track sofa and table.
std::vector<XrSpatialObjectSemanticLabelEXT> objectSemanticLabelSubset = {
  XR_SPATIAL_OBJECT_SEMANTIC_LABEL_SOFA_EXT,
  XR_SPATIAL_OBJECT_SEMANTIC_LABEL_TABLE_EXT
};
XrSpatialFeatureObjectSemanticLabelSubsetEXT subsetFeature{XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT};
subsetFeature.semanticLabelCount = objectSemanticLabelSubset.size();
subsetFeature.semanticLabels = objectSemanticLabelSubset.data();

XrSpatialCapabilityConfigurationObjectTrackingEXT objectTrackingConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT};
objectTrackingConfig.capability = XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT;
objectTrackingConfig.enabledComponentCount = enabledComponents.size();
objectTrackingConfig.enabledComponents = enabledComponents.data();
if (supportsObjectSemanticLabelSubsetFeature) {
  objectTrackingConfig.next = &subsetFeature;
}

std::array<XrSpatialCapabilityConfigurationBaseHeaderEXT*, 1> capabilityConfigs = {
  reinterpret_cast<XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&objectTrackingConfig),
};

XrSpatialContextCreateInfoEXT spatialContextCreateInfo{XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT};
spatialContextCreateInfo.capabilityConfigCount = capabilityConfigs.size();
spatialContextCreateInfo.capabilityConfigs = capabilityConfigs.data();
XrFutureEXT createContextFuture;
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &spatialContextCreateInfo, &createContextFuture));

waitUntilReady(createContextFuture);

XrCreateSpatialContextCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, createContextFuture, &completion));
if (completion.futureResult != XR_SUCCESS) {
  return;
}

spatialContext = completion.spatialContext;

// ...
// Discovery entities with the spatial context
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

空間エンティティを検出してコンポーネント データをクエリする

次のサンプルコードは、XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT で構成されたコンテキストの空間エンティティを検出し、そのコンポーネント データをクエリする方法を示しています。

XrFutureEXT future = XR_NULL_FUTURE_EXT;

// We want to look for entities that have the following components.
std::vector<XrSpatialComponentTypeEXT> snapshotComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_3D_EXT,
};
if (supportsKeyboardSemanticLabel) {
  snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT);
}

auto discoverSpatialEntities = [&](XrSpatialContextEXT spatialContext, XrTime time) {
  XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT};
  snapshotCreateInfo.componentTypeCount = snapshotComponents.size();
  snapshotCreateInfo.componentTypes = snapshotComponents.data();
  CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

  waitUntilReady(future);

  XrCreateSpatialDiscoverySnapshotCompletionInfoEXT completionInfo{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT};
  completionInfo.baseSpace = localSpace;
  completionInfo.time = time;
  completionInfo.future = future;

  XrCreateSpatialDiscoverySnapshotCompletionEXT completion{XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
  CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(spatialContext, &completionInfo, &completion));
  if (completion.futureResult == XR_SUCCESS) {

    // Query for the semantic label component data
    XrSpatialComponentDataQueryConditionEXT queryCond{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT};
    queryCond.componentTypeCount = snapshotComponents.size();
    queryCond.componentTypes = snapshotComponents.data();

    XrSpatialComponentDataQueryResultEXT queryResult{XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT};
    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    std::vector<XrSpatialEntityIdEXT> entityIds(queryResult.entityIdCountOutput);
    std::vector<XrSpatialEntityTrackingStateEXT> entityStates(queryResult.entityIdCountOutput);
    queryResult.entityIdCapacityInput = entityIds.size();
    queryResult.entityIds = entityIds.data();
    queryResult.entityStateCapacityInput = entityStates.size();
    queryResult.entityStates = entityStates.data();

    std::vector<XrBoxf> bounded3D(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded3DListEXT bounded3DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_3D_LIST_EXT};
    bounded3DList.boundCount = bounded3D.size();
    bounded3DList.bounds = bounded3D.data();
    queryResult.next = &bounded3DList;

    std::vector<XrSpatialKeyboardSemanticLabelEXT> semanticLabels;
    XrSpatialComponentKeyboardSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT};
    if (supportsKeyboardSemanticLabel) {
      semanticLabels.resize(queryResult.entityIdCountOutput);
      semanticLabelsList.semanticLabelCount = semanticLabels.size();
      semanticLabelsList.semanticLabels = semanticLabels.data();
      semanticLabelsList.next = queryResult.next;
      queryResult.next = &semanticLabelsList;
    }

    CHK_XR(xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult));

    for (int32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
      if (entityStates[i] != XR_SPATIAL_ENTITY_TRACKING_STATE_TRACKING_EXT) {
        continue;
      }

      // 3D bounds for entity entityIds[i] is bounded3D[i].extents centered on bounded3D[i].center.

      if (supportsKeyboardSemanticLabel) {
        // semantic label for entity entityIds[i] is semanticLabels[i].
      }
    }

    CHK_XR(xrDestroySpatialSnapshotEXT(completion.snapshot));
  }
};

while (1) {
  // ...
  // For every frame in frame loop
  // ...

  XrFrameState frameState;  // previously returned from xrWaitFrame
  const XrTime time = frameState.predictedDisplayTime;

  // Poll for the XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT event
  XrEventDataBuffer event = {XR_TYPE_EVENT_DATA_BUFFER};
  XrResult result = xrPollEvent(instance, &event);
  if (result == XR_SUCCESS) {
      switch (event.type) {
          case XR_TYPE_EVENT_DATA_SPATIAL_DISCOVERY_RECOMMENDED_EXT: {
              const XrEventDataSpatialDiscoveryRecommendedEXT& eventdata =
                  *reinterpret_cast<XrEventDataSpatialDiscoveryRecommendedEXT*>(&event);
              // Discover spatial entities for the context that we received the "discovery
              // recommended" event for.
              discoverSpatialEntities(eventdata.spatialContext, time);
              break;
          }
      }
  }

  // ...
  // Finish frame loop
  // ...
}

新しい構造

新しい列挙型

新しい列挙型定数

  • XR_EXT_SPATIAL_OBJECT_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_object_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT の拡張:

    • XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
  • XrSpatialCapabilityFeatureEXT の拡張:

    • XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
  • XrSpatialComponentTypeEXT の拡張:

    • XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
  • XrStructureType の拡張:

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXT
    • XR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT

問題

変更履歴

  • リビジョン 1、2025-06-03(Nihav Jain、Google)

    • 拡張機能の初期説明