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입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.capability는 XrSpatialCapabilityEXT이며 여야 합니다(XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT).enabledComponentCount는enabledComponents배열의 요소 수를 설명하는uint32_t입니다.enabledComponents는 XrSpatialComponentTypeEXT 배열을 가리키는 포인터입니다 .
애플리케이션은 공간 기능을 사용 설정할 수 있습니다. XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT 구조를 가리키는 포인터를 XrSpatialCapabilityConfigurationPlaneTrackingEXT에 포함하여 XrSpatialContextCreateInfoEXT :: capabilityConfigs
capability가 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT가 아닌 경우 런타임은 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다( MUST ).
유효한 사용 (암시적)
-
XR_EXT_spatial_plane_tracking확장 프로그램을 사용하기 전에 XrSpatialCapabilityConfigurationPlaneTrackingEXT를 사용 설정해야 합니다( MUST ). -
type여야 합니다( **MUST** )XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
capability는 유효한 XrSpatialCapabilityEXT 값이어야 합니다(MUST) -
enabledComponents는enabledComponentCount유효한 XrSpatialComponentTypeEXT 값의 배열을 가리키는 포인터여야 합니다(MUST). -
enabledComponentCount매개변수는 커야 합니다 (MUST).0
보장된 구성요소
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT를 지원하는 런타임은 이 기능으로 검색된 모든 항목의 보장된 구성요소로 다음 공간 구성요소를 제공해야 하며(MUST) xrEnumerateSpatialCapabilityComponentTypesEXT에서 이를 열거해야 합니다(MUST).
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXTXR_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입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.planeAlignmentCount는planeAlignments배열의 요소 수를 설명하는uint32_t입니다.planeAlignments는 XrSpatialPlaneAlignmentEXT 배열입니다 .
XrSpatialSnapshotEXT에서 공간 항목의 평면 정렬 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT를 포함하고 XrSpatialComponentPlaneAlignmentListEXT를 XrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.
XrSpatialComponentPlaneAlignmentListEXT가 XrSpatialComponentDataQueryResultEXT :: next 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT가 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).
`planeAlignmentCount`가 planeAlignmentCount XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다(MUST).
유효한 사용 (암시적)
- XrSpatialComponentPlaneAlignmentListEXT를 사용하기 전에
XR_EXT_spatial_plane_tracking확장 프로그램을 사용 설정해야 합니다(MUST). -
type여야 합니다( **MUST** )XR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXT -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
planeAlignments는planeAlignmentCountXrSpatialPlaneAlignmentEXT 값의 배열을 가리키는 포인터여야 합니다(must) -
planeAlignmentCount매개변수는 반드시 보다 커야 합니다0
구성
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입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.meshCount는meshes배열의 요소 수를 설명하는uint32_t입니다.meshes는 XrSpatialMeshDataEXT 배열입니다 .
XrSpatialSnapshotEXT에서 공간 항목의 메시 2D 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT를 포함하고 XrSpatialComponentMesh2DListEXT를 XrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.
XrSpatialComponentMesh2DListEXT가 XrSpatialComponentDataQueryResultEXT :: next 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXT가 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(must).
런타임은 meshCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다(MUST).
meshes 배열에서 런타임으로 채워진 XrSpatialMeshDataEXT의 경우 XrSpatialMeshDataEXT :: vertexBuffer의 XrSpatialBufferEXT :: bufferType은 XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT여야 하며 XrSpatialMeshDataEXT :: indexBuffer의 XrSpatialBufferEXT :: bufferType은 XR_SPATIAL_BUFFER_TYPE_UINT16_EXT여야 합니다( MUST ).
유효한 사용 (암시적)
-
XR_EXT_spatial_plane_tracking확장 프로그램을 사용하기 전에 XrSpatialComponentMesh2DListEXT를 사용 설정해야 합니다(MUST). -
type여야 합니다( **MUST** )XR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXT -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
meshes는meshCountXrSpatialMeshDataEXT 구조의 배열을 가리키는 포인터여야 합니다(MUST). -
meshCount매개변수는 커야 합니다 (0).
구성
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 평면에서 이 원점을 기준으로 합니다.vertexBuffer는 XrSpatialBufferEXT이며,XR_SPATIAL_BUFFER_TYPE_VECTOR2F_EXT유형의 버퍼 ID를 제공하고 이 구성요소가 있는 항목의 꼭짓점 버퍼를 나타냅니다. 꼭짓점은 시계 반대 방향으로 반환되어야 합니다( MUST ). 이러한 꼭짓점으로 표시되는 다각형은 자체적으로 교차해서는 안 되며(MUST) 오목할 수 있습니다(MAY).
vertexBuffer의 XrSpatialBufferEXT :: bufferType은 XR_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입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.polygonCount는polygons배열의 요소 수를 설명하는uint32_t입니다.polygons는 XrSpatialPolygon2DDataEXT 배열입니다 .
XrSpatialSnapshotEXT에서 공간 항목의 다각형 2D 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT를 포함하고 XrSpatialComponentPolygon2DListEXT를 XrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.
XrSpatialComponentPolygon2DListEXT가 XrSpatialComponentDataQueryResultEXT :: 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를 반환해야 합니다. polygonCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우
유효한 사용 (암시적)
- XrSpatialComponentPolygon2DListEXT를 사용하기 전에
XR_EXT_spatial_plane_tracking확장 프로그램을 사용 설정해야 합니다(MUST). -
type여야 합니다( **MUST** )XR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
polygons는polygonCountXrSpatialPolygon2DDataEXT 구조의 배열을 가리키는 포인터여야 합니다(MUST). -
polygonCount매개변수는 반드시 보다 커야 합니다0
구성
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입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.semanticLabelCount는semanticLabels배열의 요소 수를 설명하는uint32_t입니다.semanticLabels는 XrSpatialPlaneSemanticLabelEXT 배열입니다 .
XrSpatialSnapshotEXT에서 공간 항목의 평면 시맨틱 라벨 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT를 포함하고 XrSpatialComponentPlaneSemanticLabelListEXT를 XrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.
XrSpatialComponentPlaneSemanticLabelListEXT가 XrSpatialComponentDataQueryResultEXT :: next의 다음 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXT가 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다(MUST).
런타임은 반드시 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다. semanticLabelCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우
유효한 사용 (암시적)
- XrSpatialComponentPlaneSemanticLabelListEXT를 사용하기 전에
XR_EXT_spatial_plane_tracking확장 프로그램을 사용 설정해야 합니다(MUST). -
type여야 합니다( **MUST** )XR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXT -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
semanticLabels는semanticLabelCountXrSpatialPlaneSemanticLabelEXT 값의 배열을 가리키는 포인터여야 합니다( **MUST** ). -
semanticLabelCount매개변수는 00보다 커야 합니다.
구성
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_NAMEXR_EXT_spatial_plane_tracking_SPEC_VERSION-
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT
XrSpatialComponentTypeEXT 확장 :
XR_SPATIAL_COMPONENT_TYPE_MESH_2D_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXTXR_SPATIAL_COMPONENT_TYPE_PLANE_SEMANTIC_LABEL_EXTXR_SPATIAL_COMPONENT_TYPE_POLYGON_2D_EXT
XrStructureType 확장 :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXTXR_TYPE_SPATIAL_COMPONENT_MESH_2D_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_PLANE_ALIGNMENT_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_PLANE_SEMANTIC_LABEL_LIST_EXTXR_TYPE_SPATIAL_COMPONENT_POLYGON_2D_LIST_EXT
문제
버전 기록
버전 1, 2024-07-02 (Nihav Jain, Google)
- 초기 확장 프로그램 설명