XR_ANDROID_spatial_discovery_bounds

이름 문자열

XR_ANDROID_spatial_discovery_bounds

확장 프로그램 유형

인스턴스 확장 프로그램

등록된 내선 번호

762

버전

1

승인 상태

비준되지 않음

확장 프로그램 및 버전 종속 항목

XR_EXT_spatial_entity

도움을 주신 분들

니하브 자인, Google
나탈리 플뢰리, Meta
유이치 타구치, Meta
인 리, Microsoft
론 베셈스, Meta
카르틱 카다판, Magic Leap
지미 알람파람빌, ByteDance
지펑 리우, ByteDance
준 얀, 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 외부에 있는 공간 항목을 포함하지 않아야 합니다(MUST NOT).

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 핸들이어야 합니다(must).

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 내에 있거나 box와 교차하는 공간 항목으로 검색을 제한할 수 있습니다. 관련 기능이 XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID를 지원하는 탐색 스냅샷의 경우 이 구조가 next 체인에 있으면 런타임은 위치 또는 경계가 완전히 box 외부에 있는 공간 항목을 포함하지 않아야 합니다(MUST NOT).

XrSpatialDiscoverySnapshotCreateInfoEXT의 다음 체인에 XrSpatialBoundsBoxfANDROID를 포함하면 제공된 다른 필터와 함께 'AND' 조건으로 작동한다는 점에 유의하세요. XR_SPATIAL_CAPABILITY_FEATURE_BOX_BOUNDS_FILTER_ANDROID를 지원하지 않는 공간 기능에서 가져온 항목은 탐색 스냅샷에 포함되면 안 됩니다. 이 동작은 다음 포인터 체인에서 인식되지 않거나 지원되지 않는 구조가 런타임에 의해 무시되는 나머지 OpenXR 사양과 다릅니다. 또한 다음 체인 구조 고유성 섹션에 설명된 대로 런타임은 다음 체인에서 처음 발생하는 XrSpatialBoundsBoxfANDROID 구조만 처리합니다.

올바른 사용 (암시적)

  • XR_ANDROID_spatial_discovery_bounds 확장 프로그램은 XrSpatialBoundsBoxfANDROID를 사용하기 전에 사용 설정해야 합니다.
  • type은(는) XR_TYPE_SPATIAL_BOUNDS_BOXF_ANDROID여야 합니다.
  • next는 NULL 또는 구조 체인의 다음 구조에 대한 유효한 포인터여야 합니다.
  • space는 유효한 XrSpace 핸들이어야 합니다(must).

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 외부에 있는 공간 항목을 포함하지 않아야 합니다(MUST NOT).

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 핸들이어야 합니다(must).

예

다음 코드는 공간 경계를 사용하여 공간 항목 검색을 필터링하는 방법을 보여줍니다.

// 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));

새로운 구조

새 enum 상수

  • 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년 5월 3일 (니하브 자인, Google)

    • 초기 확장 프로그램 설명