XR_EXT_spatial_plane_tracking

이름 문자열

XR_EXT_spatial_plane_tracking

확장 프로그램 유형

인스턴스 확장 프로그램

등록된 확장 프로그램 번호

742

버전

1

비준 상태

비준국

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

XR_EXT_spatial_entity

도움을 주신 분들

Nihav Jain, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Ron Bessems, Meta
Yin Li, Microsoft
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
Jun Yan, ByteDance

개요

이 확장 프로그램은 XR_EXT_spatial_entity를 기반으로 하며 공간 항목 프레임워크의 평면 추적 공간 기능을 정의합니다.

런타임 지원

런타임이 평면 추적을 지원하는 경우 이를 나타내야 합니다. XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT에서 xrEnumerateSpatialCapabilitiesEXT를 열거하여

구성

XrSpatialCapabilityConfigurationPlaneTrackingEXT 구조는 다음과 같이 정의됩니다.

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

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
  • capabilityXrSpatialCapabilityEXT이며 여야 합니다(XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT).
  • enabledComponentCountenabledComponents 배열의 요소 수를 설명하는 uint32_t입니다.
  • enabledComponentsXrSpatialComponentTypeEXT 배열을 가리키는 포인터입니다 .

애플리케이션은 공간 기능을 사용 설정할 수 있습니다. XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT 구조를 가리키는 포인터를 XrSpatialCapabilityConfigurationPlaneTrackingEXT에 포함하여 XrSpatialContextCreateInfoEXT :: capabilityConfigs

capabilityXR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT가 아닌 경우 런타임은 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다( MUST ).

유효한 사용 (암시적)

보장된 구성요소

XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT를 지원하는 런타임은 이 기능으로 검색된 모든 항목의 보장된 구성요소로 다음 공간 구성요소를 제공해야 하며(MUST) xrEnumerateSpatialCapabilityComponentTypesEXT에서 이를 열거해야 합니다(MUST).

  • XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT
  • XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT

제한된 2D 구성요소

제한된 2D 구성요소는 평면의 중심과 범위를 제공하며 항목이 있는 평면으로 표시됩니다. 자세한 내용은 제한된 2D를 참고하세요.

평면 정렬 구성요소

구성요소 데이터

typedef enum XrSpatialPlaneAlignmentEXT {
    XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT = 0,
    XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT = 1,
    XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT = 2,
    XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT = 3,
    XR_SPATIAL_PLANE_ALIGNMENT_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneAlignmentEXT;

XrSpatialPlaneAlignmentEXT 열거형은 XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT 구성요소가 있는 공간 항목과 연결된 평면의 정렬을 설명합니다.

열거형 값은 다음과 같은 의미를 갖습니다.

열거형 설명

XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_UPWARD_EXT

항목은 수평이며 위를 향합니다 (예: 바닥).

XR_SPATIAL_PLANE_ALIGNMENT_HORIZONTAL_DOWNWARD_EXT

항목은 수평이며 아래를 향합니다 (예: 천장).

XR_SPATIAL_PLANE_ALIGNMENT_VERTICAL_EXT

항목은 수직입니다 (예: 벽).

XR_SPATIAL_PLANE_ALIGNMENT_ARBITRARY_EXT

항목은 임의의 비수직 및 비수평 방향을 갖습니다.

데이터를 쿼리하는 구성요소 목록 구조

XrSpatialComponentPlaneAlignmentListEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialComponentPlaneAlignmentListEXT {
    XrStructureType                type;
    void*                          next;
    uint32_t                       planeAlignmentCount;
    XrSpatialPlaneAlignmentEXT*    planeAlignments;
} XrSpatialComponentPlaneAlignmentListEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
  • planeAlignmentCountplaneAlignments 배열의 요소 수를 설명하는 uint32_t입니다.
  • planeAlignmentsXrSpatialPlaneAlignmentEXT 배열입니다 .

XrSpatialSnapshotEXT에서 공간 항목의 평면 정렬 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT를 포함하고 XrSpatialComponentPlaneAlignmentListEXTXrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.

XrSpatialComponentPlaneAlignmentListEXTXrSpatialComponentDataQueryResultEXT :: next 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXTXrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).

`planeAlignmentCount`가 planeAlignmentCount XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다(MUST).

유효한 사용 (암시적)

구성

XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT가 일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 있습니다.

이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함하기 위해 특별한 구성이 필요하지 않습니다.

선택적 구성요소

XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT를 지원하는 런타임은 보장된 구성요소 섹션에 나열된 구성요소 외에 다른 공간 구성요소를 지원할 있습니다. 애플리케이션은 xrEnumerateSpatialCapabilityComponentTypesEXT를 사용하여 런타임이 지원하는 구성요소의 전체 목록을 가져온 다음 공간 컨텍스트를 만들 때 관심 있는 구성요소를 구성합니다.

메시 2D 구성요소

구성요소 데이터

XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT는 데이터에 XrSpatialMeshDataEXT 구조를 사용합니다.

데이터를 쿼리하는 구성요소 목록 구조

XrSpatialComponentMesh2DListEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialComponentMesh2DListEXT {
    XrStructureType          type;
    void*                    next;
    uint32_t                 meshCount;
    XrSpatialMeshDataEXT*    meshes;
} XrSpatialComponentMesh2DListEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
  • meshCountmeshes 배열의 요소 수를 설명하는 uint32_t입니다.
  • meshesXrSpatialMeshDataEXT 배열입니다 .

XrSpatialSnapshotEXT에서 공간 항목의 메시 2D 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT를 포함하고 XrSpatialComponentMesh2DListEXTXrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.

XrSpatialComponentMesh2DListEXTXrSpatialComponentDataQueryResultEXT :: next 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXTXrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).

런타임은 meshCountXrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다(MUST).

meshes 배열에서 런타임으로 채워진 XrSpatialMeshDataEXT의 경우 XrSpatialMeshDataEXT :: vertexBufferXrSpatialBufferEXT :: bufferTypeXR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT여야 하며 XrSpatialMeshDataEXT :: indexBufferXrSpatialBufferEXT :: bufferTypeXR_SPATIAL_BUFFER_TYPE_UINT16_EXT여야 합니다( MUST ).

유효한 사용 (암시적)

구성

XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT가 일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 있습니다.

이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함하기 위해 특별한 구성이 필요하지 않습니다.

다각형 2D 구성요소

구성요소 데이터

XrSpatialPolygon2DDataEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialPolygon2DDataEXT {
    XrPosef               origin;
    XrSpatialBufferEXT    vertexBuffer;
} XrSpatialPolygon2DDataEXT;

회원 설명

  • origin은 다각형의 원점을 정의하는 XrPosef입니다. 다각형의 모든 꼭짓점은 X-Y 평면에서 이 원점을 기준으로 합니다.
  • vertexBufferXrSpatialBufferEXT이며, XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT 유형의 버퍼 ID를 제공하고 이 구성요소가 있는 항목의 꼭짓점 버퍼를 나타냅니다. 꼭짓점은 시계 반대 방향으로 반환되어야 합니다( MUST ). 이러한 꼭짓점으로 표시되는 다각형은 자체적으로 교차해서는 안 되며(MUST) 오목할 수 있습니다(MAY).

vertexBufferXrSpatialBufferEXT :: bufferTypeXR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT여야 합니다(MUST).

유효한 사용 (암시적)

  • XrSpatialPolygon2DDataEXT를 사용하기 전에 XR_EXT_spatial_plane_tracking 확장 프로그램을 사용 설정해야 합니다(MUST).
  • vertexBuffer 는 유효한 XrSpatialBufferEXT 구조여야 합니다( **MUST**)
데이터를 쿼리하는 구성요소 목록 구조

XrSpatialComponentPolygon2DListEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialComponentPolygon2DListEXT {
    XrStructureType               type;
    void*                         next;
    uint32_t                      polygonCount;
    XrSpatialPolygon2DDataEXT*    polygons;
} XrSpatialComponentPolygon2DListEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
  • polygonCountpolygons 배열의 요소 수를 설명하는 uint32_t입니다.
  • polygonsXrSpatialPolygon2DDataEXT 배열입니다 .

XrSpatialSnapshotEXT에서 공간 항목의 다각형 2D 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT를 포함하고 XrSpatialComponentPolygon2DListEXTXrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.

XrSpatialComponentPolygon2DListEXTXrSpatialComponentDataQueryResultEXT :: next`next` 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT`XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT`가 XrSpatialComponentDataQueryConditionEXT :: componentTypes`componentTypes`에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE`XR_ERROR_VALIDATION_FAILURE`를 반환해야 합니다(MUST).

런타임은 반드시 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다. polygonCountXrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우

유효한 사용 (암시적)

구성

XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT가 일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 있습니다.

이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함하기 위해 특별한 구성이 필요하지 않습니다.

평면 시맨틱 라벨

구성요소 데이터

typedef enum XrSpatialPlaneSemanticLabelEXT {
    XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT = 1,
    XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT = 2,
    XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT = 3,
    XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT = 4,
    XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT = 5,
    XR_SPATIAL_PLANE_SEMANTIC_LABEL_MAX_ENUM_EXT = 0x7FFFFFFF
} XrSpatialPlaneSemanticLabelEXT;

XrSpatialPlaneSemanticLabelEXT 열거형은 평면의 시맨틱 라벨 집합을 설명합니다.

열거형 설명

XR_SPATIAL_PLANE_SEMANTIC_LABEL_UNCATEGORIZED_EXT

런타임에서 이 항목을 분류할 수 없습니다.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_FLOOR_EXT

항목은 바닥입니다.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_WALL_EXT

항목은 벽입니다.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_CEILING_EXT

항목은 천장입니다.

XR_SPATIAL_PLANE_SEMANTIC_LABEL_TABLE_EXT

항목은 테이블입니다.

데이터를 쿼리하는 구성요소 목록 구조

XrSpatialComponentPlaneSemanticLabelListEXT 구조는 다음과 같이 정의됩니다.

typedef struct XrSpatialComponentPlaneSemanticLabelListEXT {
    XrStructureType                    type;
    void*                              next;
    uint32_t                           semanticLabelCount;
    XrSpatialPlaneSemanticLabelEXT*    semanticLabels;
} XrSpatialComponentPlaneSemanticLabelListEXT;

회원 설명

  • type은 이 구조의 XrStructureType입니다.
  • nextNULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
  • semanticLabelCountsemanticLabels 배열의 요소 수를 설명하는 uint32_t입니다.
  • semanticLabelsXrSpatialPlaneSemanticLabelEXT 배열입니다 .

XrSpatialSnapshotEXT에서 공간 항목의 평면 시맨틱 라벨 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypesXR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT를 포함하고 XrSpatialComponentPlaneSemanticLabelListEXTXrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.

XrSpatialComponentPlaneSemanticLabelListEXTXrSpatialComponentDataQueryResultEXT :: next의 다음 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXTXrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(MUST).

런타임은 반드시 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다. semanticLabelCountXrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우

유효한 사용 (암시적)

구성

XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT가 일부 기능의 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 열거된 경우 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 열거자를 포함하여 이를 사용 설정할 있습니다.

이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT :: next 체인에 포함하기 위해 특별한 구성이 필요하지 않습니다.

예제 코드

평면 추적 기능 구성

다음 예제 코드는 공간 컨텍스트를 만들 때 평면 추적 기능을 구성하는 방법을 보여줍니다.

// Check if plane 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_PLANE_TRACKING_EXT) == capabilities.end()) {
  return;
}

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

// Check if polygon 2D and plane semantic labels optional components are supported
const auto supportsComponent = [&planeCapabilityComponents](XrSpatialComponentTypeEXT component) {
  return std::find(planeCapabilityComponents.begin(), planeCapabilityComponents.end(), component) != planeCapabilityComponents.end();
};

const bool supportsPolygon2DComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
const bool supportsSemanticLabelComponent = supportsComponent(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);

// Create a spatial context
XrSpatialContextEXT spatialContext{};

// Enable the 2 guaranteed components of the plane tracking capability
std::vector<XrSpatialComponentTypeEXT> enabledComponents = {
  XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
// Optionally enable polygon2D if it is supported
if (supportsPolygon2DComponent) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
// Optionally enable semantic labels if it is supported
if (supportsSemanticLabelComponent) {
  enabledComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT);
}

XrSpatialCapabilityConfigurationPlaneTrackingEXT planeConfig{XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT};
planeConfig.capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT;
planeConfig.enabledComponentCount = enabledComponents.size();
planeConfig.enabledComponents = enabledComponents.data();

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

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;

// ...
// Discover entities with the spatial context
// ...

CHK_XR(xrDestroySpatialContextEXT(spatialContext));

공간 항목 검색 및 구성요소 데이터 쿼리

다음 예제 코드는 XR_SPATIAL_CAPABILITY_PLANE_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_2D_EXT,
  XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
if (supportsPolygon2DComponent) {
  snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT);
}
if (supportsSemanticLabelComponent) {
  snapshotComponents.push_back(XR_SPATIAL_COMPONENT_TYPE_PLANE_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<XrSpatialBounded2DDataEXT> bounded2D(queryResult.entityIdCountOutput);
    XrSpatialComponentBounded2DListEXT bounded2DList{XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT};
    bounded2DList.boundCount = bounded2D.size();
    bounded2DList.bounds = bounded2D.data();
    queryResult.next = &bounded2DList;

    std::vector<XrSpatialPolygon2DDataEXT> polygons;
    XrSpatialComponentPolygon2DListEXT polygonList{XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT};
    if (supportsPolygon2DComponent) {
      polygons.resize(queryResult.entityIdCountOutput);
      polygonList.polygonCount = polygons.size();
      polygonList.polygons = polygons.data();
      polygonList.next = queryResult.next;
      queryResult.next = &polygonList;
    }

    std::vector<XrSpatialPlaneSemanticLabelEXT> semanticLabels;
    XrSpatialComponentPlaneSemanticLabelListEXT semanticLabelsList{XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT};
    if (supportsSemanticLabelComponent) {
      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;
      }

      // 2D bounds for entity entityIds[i] is bounded2D[i].extents centered on bounded2D[i].center.

      if (supportsPolygon2DComponent) {
        // 2D polygon for entity entityIds[i] is the buffer represented by polygons[i].bufferId.
        // Application uses flink:xrGetSpatialBufferVector2fEXT to get the buffer data.
      }

      if (supportsSemanticLabelComponent) {
        // 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_PLANE_TRACKING_EXTENSION_NAME
  • XR_EXT_spatial_plane_tracking_SPEC_VERSION
  • XrSpatialCapabilityEXT 확장 :

    • XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
  • XrSpatialComponentTypeEXT 확장 :

    • XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT
    • XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT
    • XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT
    • XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
  • XrStructureType 확장 :

    • XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT
    • XR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT
    • XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT

문제

버전 기록

  • 버전 1, 2024-07-02 (Nihav Jain, Google)

    • 초기 확장 프로그램 설명