XR_ANDROID_spatial_discovery_bounds

Name String

XR_ANDROID_spatial_discovery_bounds

拡張機能の種類

インスタンス拡張

登録済みの内線番号

762

リビジョン

1

承認ステータス

未批准

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

XR_EXT_spatial_entity

寄与者

Nihav Jain、Google
Natalie Fleury、Meta
Yuichi Taguchi、Meta
Yin Li、Microsoft
Ron Bessems、Meta
Karthik Kadappan、Magic Leap
Jimmy Alamparambil、ByteDance
Zhipeng Liu、ByteDance
Jun Yan、ByteDance

概要

この拡張機能により、空間境界の定義が追加され、アプリが xrCreateSpatialDiscoverySnapshotAsyncEXT を呼び出すときに、検出された空間エンティティをフィルタできるようになります。

空間境界

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

typedef struct XrSpatialBoundsSpherefANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             time;
    XrSpheref          sphere;
} XrSpatialBoundsSpherefANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • space は、境界のポーズが定義されている XrSpace です。
  • time は、境界のポーズが定義される XrTime です。
  • sphere は XrSpheref で、ランタイムが空間エンティティの検出を制限しなければならない球状のボリュームを記述します。

XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID をサポートする空間機能(xrEnumerateSpatialCapabilityFeaturesEXT で列挙される)により、アプリは、XrSpatialBoundsSpherefANDROID を XrSpatialDiscoverySnapshotCreateInfoEXT :: next にチェーンすることで、検出を、位置または境界が sphere 内にあるか と交差する空間エンティティに制限できます。該当する機能が XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID をサポートしているディスカバリー スナップショットの場合、この構造が next チェーンに存在する場合、ランタイムは、位置または境界が sphere の完全に外側にある空間エンティティを含めてはなりません。

XrSpatialDiscoverySnapshotCreateInfoEXT の次のチェーンに XrSpatialBoundsSpherefANDROID を含めると、指定された他のフィルタとの「AND」条件として機能します。XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID をサポートしていない空間機能から取得されたエンティティは、検出スナップショットに含めてはなりません。この動作は、次のポインタ チェーン内の認識されない構造体やサポートされていない構造体がランタイムによって無視される OpenXR 仕様の他の部分とは異なります。また、次のチェーン構造の一意性セクションで説明したように、ランタイムは次のチェーンで最初に出現した XrSpatialBoundsSpherefANDROID 構造のみを処理します。

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

  • XrSpatialBoundsSpherefANDROID を使用する前に、XR_ANDROID_spatial_discovery_bounds 拡張機能を有効にする必要があります。
  • type は XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • space は有効な XrSpace ハンドルでなければなりません

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

typedef struct XrSpatialBoundsBoxfANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             time;
    XrBoxf             box;
} XrSpatialBoundsBoxfANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • space は、境界のポーズが定義されている XrSpace です。
  • time は、境界のポーズが定義される XrTime です。
  • box は XrBoxf で、ランタイムが空間エンティティの検出を制限しなければならないボックス ボリュームを記述します。

XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID をサポートする空間機能(xrEnumerateSpatialCapabilityFeaturesEXT で列挙)により、アプリは XrSpatialBoundsBoxfANDROID を XrSpatialDiscoverySnapshotCreateInfoEXT :: next にチェーンすることで、検出を、位置または境界が box 内にあるか と交差する空間エンティティに制限できます。該当する機能が XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID をサポートしているディスカバリー スナップショットの場合、この構造が next チェーンに存在する場合、ランタイムは、位置または境界が box の完全に外側にある空間エンティティを含めてはなりません。

XrSpatialDiscoverySnapshotCreateInfoEXT の次のチェーンに XrSpatialBoundsBoxfANDROID を含めると、指定された他のフィルタとの「AND」条件として機能します。XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID をサポートしていない空間機能から取得されたエンティティは、検出スナップショットに含めてはなりません。この動作は、次のポインタ チェーン内の認識されない構造体やサポートされていない構造体がランタイムによって無視される OpenXR 仕様の他の部分とは異なります。また、次のチェーン構造の一意性セクションで説明されているように、ランタイムは次のチェーンで最初に出現する XrSpatialBoundsBoxfANDROID 構造のみを処理します。

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

  • XrSpatialBoundsBoxfANDROID を使用する前に、XR_ANDROID_spatial_discovery_bounds 拡張機能を有効にする必要があります。
  • type は XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • space は有効な XrSpace ハンドルでなければなりません

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

typedef struct XrSpatialBoundsFrustumfANDROID {
    XrStructureType    type;
    const void*        next;
    XrSpace            space;
    XrTime             time;
    XrFrustumf         frustum;
} XrSpatialBoundsFrustumfANDROID;

メンバーの説明

  • type は、この構造の XrStructureType です。
  • next は、NULL または構造体チェーン内の次の構造体へのポインタです。
  • space は、境界のポーズが定義されている XrSpace です。
  • time は、境界のポーズが定義される XrTime です。
  • frustum は XrFrustumf で、ランタイムが空間エンティティの検出を制限しなければならない視錐台のボリュームを記述します。

XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID をサポートする空間機能(xrEnumerateSpatialCapabilityFeaturesEXT で列挙)を使用すると、アプリは XrSpatialBoundsFrustumfANDROID を XrSpatialDiscoverySnapshotCreateInfoEXT :: next にチェーンすることで、検出を、位置または境界が frustum 内にあるか と交差する空間エンティティに制限できます。該当する機能が XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID をサポートしているディスカバリー スナップショットの場合、この構造が next チェーンに存在する場合、ランタイムは、位置または境界が frustum の完全に外側にある空間エンティティを含めてはなりません。

XrSpatialDiscoverySnapshotCreateInfoEXT の次のチェーンに XrSpatialBoundsFrustumfANDROID を含めると、指定された他のフィルタとの「AND」条件として機能することに注意してください。XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID をサポートしていない空間機能から取得されたエンティティは、検出スナップショットに含めてはなりません。この動作は、次のポインタ チェーン内の認識されない構造体やサポートされていない構造体がランタイムによって無視される OpenXR 仕様の他の部分とは異なります。また、次のチェーン構造の一意性セクションで説明されているように、ランタイムは次のチェーンで最初に出現する XrSpatialBoundsFrustumfANDROID 構造のみを処理します。

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

  • XrSpatialBoundsFrustumfANDROID を使用する前に、XR_ANDROID_spatial_discovery_bounds 拡張機能を有効にする必要があります。
  • type は XR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID にする必要があります。
  • next は、NULL または構造体チェーン内の次の構造体への有効なポインタでなければなりません。
  • space は有効な XrSpace ハンドルでなければなりません

例

次のコードは、空間境界を使用して空間エンティティの検出をフィルタする方法を示しています。

// previously initialized & configured with the XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT capability.
XrSpatialContextEXT spatialContext;

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

// Check if spatial sphere bounds filter is supported
const auto supportsFeature = [&fooFeatures](XrSpatialCapabilityFeatureEXT feature) {
  return std::find(fooFeatures.begin(), fooFeatures.end(), feature) != fooFeatures.end();
};

const bool supportsSphereBoundsFilter = supportsFeature(XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID);

// We want to look for entities in a sphere around the head with a radius of 2m.
XrSpatialBoundsSpherefANDROID sphereBounds {
  .type = XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID,
  .space = viewSpace,
  .time = predictedDisplayTime,
  .sphere = {
    .center = {
      .orientation = {
        .w = 1.0f,
      },
    },
    .radius = 2.0f,
  },
};

// We want to look for entities that have the following components.
std::array<XrSpatialComponentTypeEXT, 1> snapshotComponents{XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT};

XrSpatialDiscoverySnapshotCreateInfoEXT snapshotCreateInfo{
  .type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
  .next = supportsSphereBoundsFilter ? &sphereBounds : nullptr,
  .componentTypeCount = snapshotComponents.size(),
  .componentTypes = snapshotComponents.data(),
};

XrFutureEXT future = XR_NULL_FUTURE_EXT;
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT(spatialContext, &snapshotCreateInfo, &future));

新しい構造

新しい列挙型定数

  • XR_ANDROID_SPATIAL_DISCOVERY_BOUNDS_EXTENSION_NAME
  • XR_ANDROID_spatial_discovery_bounds_SPEC_VERSION
  • XrSpatialCapabilityFeatureEXT の拡張:

    • XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID
    • XR_SPATIAL_CAPABILITY_FEATURE_FRUSTUM_BOUNDS_FILTER_ANDROID
    • XR_SPATIAL_CAPABILITY_FEATURE_SPHERE_BOUNDS_FILTER_ANDROID
  • XrStructureType の拡張:

    • XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_FRUSTUMF_ANDROID
    • XR_TYPE_SPATIAL_BOUNDS_SPHEREF_ANDROID

問題

  • 空間境界のサポートが XrSpatialCapabilityFeatureEXT 定義に依存するのはなぜですか?

    • 解決済み
    • 回答: すべての空間機能が空間境界をサポートできるわけではありません。たとえば、独自の空間位置や境界を持たず、内部の他のエンティティを収集して整理するだけの、仮想的なグローバル コンテナ エンティティがこれに該当します。この機能によって列挙される XrSpatialCapabilityFeatureEXT 値は、空間境界フィルタリングのサポートについてアプリに通知するのに役立ちます。

変更履歴

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

    • 拡張機能の初期説明