XR_ANDROID_spatial_component_subsumed_by
이름 문자열
XR_ANDROID_spatial_component_subsumed_by
확장 프로그램 유형
인스턴스 확장 프로그램
등록된 확장 프로그램 번호
792
버전
1
비준 상태
비준되지 않음
확장 프로그램 및 버전 종속성
XR_EXT_spatial_entity
및
XR_EXT_spatial_plane_tracking
최종 수정일
2025-08-19
IP 상태
알려진 IP 클레임이 없습니다.
도움을 주신 분들
Brian Chen, Google
Kyle Chen, Google
Levana Chen, Google
Nihav Jain, Google
Spencer Quin, Google
개요
이 확장 프로그램은 XR_EXT_spatial_entity를 기반으로 하며 subsumed_by 속성을 노출하기 위해 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT에 새로운 구성요소를 제공합니다.
런타임이 추적된 2개의 평면이 실제로 동일함을 감지할 수 있을 만큼 충분한 환경 정보를 획득하면 평면 중 하나의 ID가 있는 subsumed_by 구성요소가 다른 평면에 연결됩니다.
이 확장 프로그램은 애플리케이션이 연결하여 XrSpatialDiscoverySnapshotCreateInfoEXT subsumed_by 구성요소가 연결된 모든 항목을 필터링할 수 있는 새로운 필터도 도입합니다.
권한
이 확장 프로그램은 환경에서 평면을 추적하므로 Android 애플리케이션은 매니페스트에 android.permission.SCENE_UNDERSTANDING_COARSE 권한을 나열해야 합니다. android.permission.SCENE_UNDERSTANDING_COARSE 권한은 위험한 권한으로 간주됩니다.
(보호 수준: 위험)
런타임 지원
런타임이 subumed_by를 지원하는 경우 평면 추적 기능을 지원하고 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT에서 xrEnumerateSpatialCapabilitiesEXT를 열거하여 이를 나타내야 합니다 .
런타임이 subsumed_by를 제공하는 경우 이를 XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID에서 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT 기능의 지원되는 구성요소로 xrEnumerateSpatialCapabilityComponentTypesEXT를 열거하여 나타내야 합니다 .
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID 연결된 항목의 모든 구성요소 데이터는 이를 포함하는 항목과 동일해야 합니다.
Subsumed By 구성요소
구성요소 데이터
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID는 포함하는 항목의 ID를 나타내는 데이터에 XrSpatialEntityIdEXT 구조를 사용합니다.
데이터를 쿼리하는 구성요소 목록 구조
XrSpatialComponentSubsumedByListANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialComponentSubsumedByListANDROID {
XrStructureType type;
void* next;
uint32_t subsumedUniqueIdCount;
XrSpatialEntityIdEXT* subsumedUniqueIds;
} XrSpatialComponentSubsumedByListANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.subsumedUniqueIdCount는subsumedUniqueIds배열의 요소 수를 설명하는uint32_t입니다.subsumedUniqueIds는XrSpatialEntityIdEXT배열입니다 .
애플리케이션은 XrSpatialComponentDataQueryResultEXT의 다음 체인에 XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID를 추가하여 XrSpatialSnapshotEXT의 공간 항목의 subsumed_by 구성요소를 쿼리할 수 있습니다 .
XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID가 XrSpatialComponentDataQueryResultEXT :: next의 다음 체인에 있지만 XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID가 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다 .
런타임은 해야 XR_ERROR_SIZE_INSUFFICIENT에서 xrQuerySpatialComponentDataEXT를 반환해야 subsumedUniqueIdCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우입니다 .
유효한 사용 (암시적)
-
XR_ANDROID_spatial_component_subsumed_by확장 프로그램을 사용하기 전에 XrSpatialComponentSubsumedByListANDROID를 사용 설정해야 합니다. -
type여야XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
subsumedUniqueIds는subsumedUniqueIdCountXrSpatialEntityIdEXT값의 배열을 가리키는 포인터여야 합니다 -
subsumedUniqueIdCount매개변수는 보다 커야 합니다0
구성
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID가 XrSpatialCapabilityComponentTypesEXT :: componentTypes에서 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT 기능으로 열거되면 애플리케이션은 이 구성요소를 지원하는 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT 파생 구조의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 enum을 포함하여 이를 사용 설정할 수 있습니다.
포함된 항목 필터링
XrSpatialDiscoveryUniqueEntitiesFilterANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialDiscoveryUniqueEntitiesFilterANDROID {
XrStructureType type;
const void* next;
} XrSpatialDiscoveryUniqueEntitiesFilterANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.
애플리케이션은 XrSpatialDiscoverySnapshotCreateInfoEXT의 다음 체인에 XrSpatialDiscoveryUniqueEntitiesFilterANDROID를 포함하여 다른 항목에 포함되지 않은 항목이 있는 스냅샷을 가져올 수 있습니다.
애플리케이션이 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID 구성요소를 포함하면서 XrSpatialDiscoveryUniqueEntitiesFilterANDROID를 XrSpatialDiscoverySnapshotCreateInfoEXT에 연결하는 경우 런타임은 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다 .
애플리케이션이 XrSpatialDiscoveryUniqueEntitiesFilterANDROID를 XrSpatialDiscoverySnapshotCreateInfoEXT에 연결하지만 XrSpatialDiscoverySnapshotCreateInfoEXT :: componentTypes에 구성요소를 나열하지 않는 경우 런타임은 XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID 구성요소가 있는 항목을 제외하고 spatialContext에 구성된 기능의 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents에 열거된 구성요소 집합이 있는 모든 공간 항목을 스냅샷에 포함해야 합니다.
유효한 사용 (암시적)
- XrSpatialDiscoveryUniqueEntitiesFilterANDROID를 사용하기 전에
XR_ANDROID_spatial_component_subsumed_by확장 프로그램을 사용 설정해야 합니다. -
type여야 **합니다**.XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다
예시 코드
평면 추적 기능 구성
다음 예시 코드에서는 subsumed_by를 지원하는 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT 기능으로 공간 컨텍스트를 만드는 방법을 보여줍니다.
// Check runtime supported capabilities
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;
}
std::vector<XrSpatialComponentTypeEXT> planeTrackingComponents {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID,
};
// Create capability config for plane tracking
XrSpatialCapabilityConfigurationPlaneTrackingEXT planeTrackingConfig {
.type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_PLANE_TRACKING_EXT,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT,
.enabledComponentCount = (uint32_t)planeTrackingComponents.size(),
.enabledComponents = planeTrackingComponents.data(),
};
// Create spatial context
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&planeTrackingConfig));
XrSpatialContextCreateInfoEXT contextCreateInfo{
.type = XR_TYPE_SPATIAL_CONTEXT_CREATE_INFO_EXT,
.next = nullptr,
.capabilityConfigCount = (uint32_t)capabilityConfigs.size(),
.capabilityConfigs = capabilityConfigs.data(),
};
CHK_XR(xrCreateSpatialContextAsyncEXT(session, &contextCreateInfo, &future))
// Completes creating spatial context
XrCreateSpatialContextCompletionEXT contextCompletion{
XR_TYPE_CREATE_SPATIAL_CONTEXT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialContextCompleteEXT(session, future, &contextCompletion))
구성요소 데이터 쿼리
다음 예시 코드에서는 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT로 구성된 컨텍스트에서 subsumed_by 구성요소 데이터를 쿼리하는 방법을 보여줍니다 .
// Create Discovery Snapshot
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
.type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
};
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT (
spatialContext, &discoverySnapshotCreateInfo, &future));
// Poll the state till snapshot it's ready.
waitUntilReady(future);
// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
createSnapshotCompletionInfo {
.type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
.baseSpace = space,
.time = updateTime,
.future = future,
};
XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
spatialContext, &createSnapshotCompletionInfo,
&completion));
if(completion.futureResult != XR_SUCCESS) return;
// Query subsumed_by components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
};
XrSpatialComponentDataQueryConditionEXT queryCond {
.type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT,
.componentTypeCount = 1,
.componentTypes = enabledComponents.data(),
};
XrSpatialComponentDataQueryResultEXT queryResult {
.type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT,
};
CHK_XR(xrQuerySpatialComponentDataEXT(
completion.snapshot, &queryCond, &queryResult));
// Query again with allocated memory
std::vector<XrSpatialEntityIdEXT> subsumedUniqueIds;
subsumedUniqueIds.resize(queryResult.entityIdCountOutput);
XrSpatialComponentSubsumedByListANDROID subsumedByList {
.type = XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROID,
.subsumedUniqueIdCount = static_cast<uint32_t>(subsumedUniqueIds.size()),
.subsumedUniqueIds = subsumedUniqueIds.data(),
};
queryResult.next = &subsumedByList;
CHK_XR(xrQuerySpatialComponentDataEXT(
completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityEXT> subsumedEntities;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// access planes[i] for merged plane id
XrSpatialEntityIdEXT entityId = queryResult.entityIds[i];
XrSpatialEntityIdEXT subsumedUniqueId = subsumedUniqueIds[i];
// create handle via entityId
XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
.type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
.entityId = entityId,
};
XrSpatialEntityEXT entity = XR_NULL_HANDLE;
xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);
subsumedEntities.push_back(entity);
}
// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);
포함된 항목 필터링
다음 예시 코드에서는 필터를 사용하여 검색 스냅샷에서 subsumed_by 구성요소가 연결된 항목을 필터링하고 포함하는 항목의 항목 ID를 쿼리하는 방법을 보여줍니다.
// Init filter
XrSpatialDiscoveryUniqueEntitiesFilterANDROID filter {
.type = XR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID,
};
// Chain filter to the snapshot create info
// WARNING: Chain the filter while include subsumed_by component in the
// componentTypes is invalid
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
.type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
.next = &filter
};
waitUntilReady(future);
// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
createSnapshotCompletionInfo {
.type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
.baseSpace = space,
.time = updateTime,
.future = future,
};
XrCreateSpatialDiscoverySnapshotCompletionEXT completion {
XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_EXT};
CHK_XR(xrCreateSpatialDiscoverySnapshotCompleteEXT(
spatialContext, &createSnapshotCompletionInfo,
&completion));
if(completion.futureResult != XR_SUCCESS) return;
// Subsumed entities has already been filtered out in this snapshot,now query
// Bounded2D to render subsuming planes
std::vector<XrSpatialComponentTypeEXT> queryComponents {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
};
XrSpatialComponentDataQueryConditionEXT queryCond {
.type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_CONDITION_EXT,
.componentTypeCount = 1,
.componentTypes = queryComponents.data(),
};
XrSpatialComponentDataQueryResultEXT queryResult {
.type = XR_TYPE_SPATIAL_COMPONENT_DATA_QUERY_RESULT_EXT,
};
CHK_XR(xrQuerySpatialComponentDataEXT(
completion.snapshot, &queryCond, &queryResult));
// Chain Bounded2D list
std::vector<XrSpatialBounded2DDataEXT> bounded2dData;
bounded2dData.resize(queryResult.entityIdCountOutput);
XrSpatialComponentBounded2DListEXT bounded2dList {
.type = XR_TYPE_SPATIAL_COMPONENT_BOUNDED_2D_LIST_EXT,
.boundCount = static_cast<uint32_t>(bounded2dData.size()),
.bounds = bounded2dData.data(),
};
// Query again
queryResult.next = &bounded2dList;
CHK_XR(xrQuerySpatialComponentDataEXT(
completion.snapshot, &queryCond, &queryResult));
std::vector<XrSpatialEntityEXT> subsumingPlanes;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// access planes[i] for merged plane id
XrSpatialEntityIdEXT entityId = queryResult.entityIds[i];
// create handle via entityId.
XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
.type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
.entityId = entityId,
};
XrSpatialEntityEXT entity = XR_NULL_HANDLE;
xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);
subsumingPlanes.push_back(entity);
}
// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);
새로운 구조
새로운 enum 상수
XR_ANDROID_SPATIAL_COMPONENT_SUBSUMED_BY_EXTENSION_NAMEXR_ANDROID_spatial_component_subsumed_by_SPEC_VERSIONXrSpatialComponentTypeEXT 확장 :
XR_SPATIAL_COMPONENT_TYPE_SUBSUMED_BY_ANDROID
XrStructureType 확장 :
XR_TYPE_SPATIAL_COMPONENT_SUBSUMED_BY_LIST_ANDROIDXR_TYPE_SPATIAL_DISCOVERY_UNIQUE_ENTITIES_FILTER_ANDROID
문제
버전 기록
버전 1, 2025-11-19 (Brian Chen)
- 초기 확장 프로그램 설명입니다.