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 を返さなければなりません。
有効な使用方法(暗黙的)
- XrSpatialCapabilityConfigurationObjectTrackingEXT を使用する前に、
XR_EXT_spatial_object_tracking拡張機能を有効にする必要があります。 -
typeはXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXTにする必要があります。 -
nextは、NULLまたは構造体チェーン内の次の構造体への有効なポインタである必要があります。XrSpatialFeatureObjectSemanticLabelSubsetEXT も参照。 -
capabilityは、有効な XrSpatialCapabilityEXT 値でなければなりません -
enabledComponentsは、enabledComponentCount個の有効な XrSpatialComponentTypeEXT 値の配列へのポインタでなければなりません。 -
enabledComponentCountパラメータは0より大きい値にする必要があります。
保証対象の部品
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は、semanticLabelCountXrSpatialObjectSemanticLabelEXT 値の配列へのポインタでなければなりません -
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は、semanticLabelCountXrSpatialKeyboardSemanticLabelEXT 値の配列へのポインタでなければなりません -
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は、semanticLabelCountXrSpatialMouseSemanticLabelEXT 値の配列へのポインタでなければなりません -
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_NAMEXR_EXT_spatial_object_tracking_SPEC_VERSION-
XR_SPATIAL_CAPABILITY_OBJECT_TRACKING_EXT
XrSpatialCapabilityFeatureEXT の拡張:
XR_SPATIAL_CAPABILITY_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
XrSpatialComponentTypeEXT の拡張:
XR_SPATIAL_COMPONENT_TYPE_KEYBOARD_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_MOUSE_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_OBJECT_SEMANTIC_LABEL_EXT
XrStructureType の拡張:
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_OBJECT_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_KEYBOARD_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_MOUSE_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_OBJECT_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_FEATURE_OBJECT_SEMANTIC_LABEL_SUBSET_EXT
問題
変更履歴
リビジョン 1、2025-06-03(Nihav Jain、Google)
- 拡張機能の初期説明