XR_ANDROID_spatial_discovery_raycast
이름 문자열
XR_ANDROID_spatial_discovery_raycast
확장 프로그램 유형
인스턴스 확장 프로그램
등록된 확장 프로그램 번호
787
버전
1
비준 상태
비준되지 않음
확장 프로그램 및 버전 종속 항목
XR_EXT_spatial_entity
최종 수정일
2025-08-12
IP 상태
알려진 IP 클레임이 없습니다.
도움을 주신 분들
Brian Chen, Google
Levana Chen, Google
Kyle Chen, Google
Nihav Jain, Google
Spencer Quin, Google
Natalie Fleury, Meta
Yuichi Taguchi, Meta
Jimmy Alamparambil, ByteDance
Zhipeng Liu, ByteDance
개요
이 확장 프로그램은 XR_EXT_spatial_entity를 기반으로 하며 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT와 같은 기존 공간 기능에 대한 레이캐스트 기능을 제공하여 공간 항목을 검색합니다.
이 확장 프로그램은 심도 버퍼에 대해 레이캐스팅하는 새로운 공간 기능도 도입합니다.
권한
Android 애플리케이션에서 사용하는 기능에 따라 필요한 권한입니다. XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID가 사용되는 경우 애플리케이션에 android.permission.SCENE_UNDERSTANDING_FINE 권한이 있어야 합니다. XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT가 사용되는 경우 애플리케이션에 android.permission.SCENE_UNDERSTANDING_COARSE 권한이 있어야 합니다. 애플리케이션에서 두 기능을 모두 사용하는 경우 android.permission.SCENE_UNDERSTANDING_FINE은 android.permission.SCENE_UNDERSTANDING_COARSE 권한도 의미하므로 애플리케이션에서 두 권한을 별도로 요청할 필요가 없습니다.
android.permission.SCENE_UNDERSTANDING_COARSE와 android.permission.SCENE_UNDERSTANDING_FINE은 모두 위험한 권한으로 간주됩니다.
(보호 수준: 위험)
런타임 지원
런타임에서 레이캐스팅을 통해 공간 항목 검색을 지원하는 경우 레이캐스트로 검색을 지원하는 기능에 대해 xrEnumerateSpatialCapabilityComponentTypesEXT에서 XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID를 열거하여 이를 나타내야 합니다.
런타임에서 심도 버퍼에 대해 레이캐스팅을 지원하는 경우 해야 합니다에서 XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID를 열거해야 xrEnumerateSpatialCapabilitiesEXT 합니다 .
레이캐스팅으로 공간 항목 검색
XrSpatialRaycastInfoANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialRaycastInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrVector3f origin;
XrVector3f direction;
float maxDistance;
} XrSpatialRaycastInfoANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.space는 XrSpatialRaycastResultDataANDROID의 포즈가 위치할 XrSpace입니다.time은XrTime의 포즈가 정의된 XrSpatialRaycastResultDataANDROID입니다.origin은 광선의 원점을 설명하는 XrVector3f입니다.direction은 광선의 방향을 설명하는 XrVector3f입니다.maxDistance는 애플리케이션에서direction을 따라origin으로부터 지정된 거리 내에 있는 항목의 검색을 제한하기 위해 선택적으로 지정 할 수 있는 거리(미터)입니다 .
애플리케이션은 XrSpatialDiscoverySnapshotCreateInfoEXT :: 체인에 XrSpatialRaycastInfoANDROID를 포함하여 이 구조에 정의된 광선과 교차하는 공간 항목을 검색 할 수 있습니다.next
애플리케이션에서 기능에 대해 XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID를 사용 설정하지 않고 구성된 XrSpatialContextEXT와 함께 XrSpatialRaycastInfoANDROID를 사용하는 경우 런타임에서 xrCreateSpatialDiscoverySnapshotAsyncEXT 또는 xrCreateSpatialRaycastSnapshotANDROID로부터 XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT를 반환해야 합니다 .
런타임은 XrSpatialSnapshotEXT에 구성요소를 지원하는 기능에서 가져온 공간 항목만 포함해야 합니다.XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
애플리케이션에서 maxDistance를 양수 값으로 설정하는 경우 런타임은 direction을 따라 panme:origin으로부터 maxDistance보다 멀리 있는 적중 공간 항목을 스냅샷에 포함해서는 안 됩니다 . maxDistance가 0 또는 음수 값으로 설정된 경우 런타임은 광선을 무한대로 간주해야 합니다.
유효한 사용 (암시적)
- XrSpatialRaycastInfoANDROID를 사용하기 전에
XR_ANDROID_spatial_discovery_raycast확장 프로그램을 사용 설정해야 합니다. -
type여야 **합니다**.XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
space는 유효한 XrSpace 핸들이어야 합니다
레이캐스트 결과 구성요소
XrSpatialRaycastResultDataANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialRaycastResultDataANDROID {
XrPosef hitPose;
float distanceSquared;
} XrSpatialRaycastResultDataANDROID;
회원 설명
hitPose는 광선이 공간 항목과 교차하는 지점을 정의하는 XrPosef입니다.distanceSquared는 광선의 원점에서 교차점까지의 거리의 제곱입니다.
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID 구성요소는 XrSpatialSnapshotEXT가 XrSpatialRaycastInfoANDROID가 XrSpatialDiscoverySnapshotCreateInfoEXT :: next 체인에 포함된 xrCreateSpatialDiscoverySnapshotAsyncEXT에서 생성된 경우 또는 xrCreateSpatialRaycastSnapshotANDROID에서 생성된 XrSpatialSnapshotEXT에만 있습니다 .
런타임은 이 구성요소를 xrCreateSpatialUpdateSnapshotEXT를 사용하여 생성된 모든 XrSpatialSnapshotEXT에 포함해서는 안 됩니다 .
애플리케이션에서 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID를 포함하는 경우 런타임은 xrCreateSpatialUpdateSnapshotEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다 .
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID가 특정 기능에만 사용 설정된 경우 런타임은 스냅샷에 이러한 기능에서 제공하는 공간 항목만 포함해야 합니다. 예를 들어 객체와 평면이 같은 방향으로 정렬되고 XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID가 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT에만 사용 설정된 경우 평면만 검색됩니다.
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID의 hitPose는 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time의 XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace에 있습니다 . 양의 Z축은 적중 표면의 법선이고 음의 Y축은 광선 원점을 대략적으로 가리킵니다.
유효한 사용 (암시적)
- XrSpatialRaycastResultDataANDROID를 사용하기 전에
XR_ANDROID_spatial_discovery_raycast확장 프로그램을 사용 설정해야 합니다.
데이터를 쿼리하는 구성요소 목록 구조
XrSpatialComponentRaycastResultListANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialComponentRaycastResultListANDROID {
XrStructureType type;
void* next;
uint32_t raycastResultCount;
XrSpatialRaycastResultDataANDROID* raycastResults;
} XrSpatialComponentRaycastResultListANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.raycastResultCount는raycastResults배열의 요소 수를 설명하는uint32_t입니다.raycastResults는 XrSpatialRaycastResultDataANDROID 배열입니다 .
XrSpatialSnapshotEXT의 공간 항목의 레이캐스트 결과 구성요소를 쿼리하려면 XrSpatialComponentDataQueryConditionEXT :: componentTypes에 XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID를 포함하고 XrSpatialComponentRaycastResultListANDROID를 XrSpatialComponentDataQueryResultEXT :: next 체인에 추가합니다.
XrSpatialComponentRaycastResultListANDROID가 XrSpatialComponentDataQueryResultEXT :: `next` 체인에 있지만 `XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID`가 XrSpatialComponentDataQueryConditionEXT :: `componentTypes`에 포함되지 않은 경우 런타임은 xrQuerySpatialComponentDataEXT에서 `XR_ERROR_VALIDATION_FAILURE`를 반환해야 합니다.XR_ERROR_VALIDATION_FAILUREnextXR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROIDcomponentTypes
런타임은 raycastResultCount가 XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput보다 작은 경우 xrQuerySpatialComponentDataEXT에서 XR_ERROR_SIZE_INSUFFICIENT를 반환해야 합니다 .
반환된 raycastResults는 정렬되지 않습니다. 애플리케이션은 할 수 있습니다 XrSpatialRaycastResultDataANDROID :: distanceSquared를 사용하여 결과를 거리별로 정렬합니다.
유효한 사용 (암시적)
-
XR_ANDROID_spatial_discovery_raycast확장 프로그램을 사용하기 전에 XrSpatialComponentRaycastResultListANDROID를 사용 설정해야 합니다. -
type여야 합니다.XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
raycastResults는raycastResultCountXrSpatialRaycastResultDataANDROID 구조의 배열을 가리키는 포인터여야 합니다. -
raycastResultCount매개변수는 해야0보다 커야 합니다.
구성
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID가 일부 기능에 대해 XrSpatialCapabilityComponentTypesEXT :: componentTypes에 열거된 경우 애플리케이션은 enum 값을 XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents 목록에 포함하여 사용 설정 할 수 있습니다. 이 구성요소는 XrSpatialCapabilityConfigurationBaseHeaderEXT의 다음 체인에 포함하기 위해 특별한 구성이 필요하지 않습니다 .
애플리케이션에서 XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes에 XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID를 포함하는 경우 런타임은 xrCreateSpatialUpdateSnapshotEXT에서 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다 . 이 구성요소는 검색 스냅샷에만 해당됩니다.
심도 레이캐스트 공간 기능
구성
XrSpatialCapabilityConfigurationDepthRaycastANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialCapabilityConfigurationDepthRaycastANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationDepthRaycastANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다.capability는 XrSpatialCapabilityEXT이며 여야 합니다XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID.enabledComponentCount는enabledComponents배열의 요소 수를 설명하는uint32_t입니다. 0보다 커야 합니다.enabledComponents는 XrSpatialComponentTypeEXT 배열을 가리키는 포인터입니다 .
애플리케이션은 XrSpatialContextCreateInfoEXT :: capabilityConfigs에 XrSpatialCapabilityConfigurationDepthRaycastANDROID 구조를 가리키는 포인터를 포함하여 XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID 공간 기능을 사용 설정 할 수 있습니다 .
capability가 XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID가 아닌 경우 런타임은 XR_ERROR_VALIDATION_FAILURE를 반환해야 합니다 .
이 기능을 통해 검색된 항목의 ID는 항상 XR_NULL_SPATIAL_ENTITY_ID_EXT입니다 . 이는 애플리케이션에서 이러한 항목에 대한 XrSpatialEntityEXT 핸들을 만들 수 없으므로 업데이트 스냅샷을 만들기 위해 XrSpatialUpdateSnapshotCreateInfoEXT :: entities에 포함할 수 없음을 의미합니다.
유효한 사용 (암시적)
- XrSpatialCapabilityConfigurationDepthRaycastANDROID를 사용하기 전에
XR_ANDROID_spatial_discovery_raycast확장 프로그램을 사용 설정해야**합니다**. -
type여야 **합니다**.XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
capability는 유효한 XrSpatialCapabilityEXT 값이어야 합니다. -
enabledComponents는enabledComponentCount유효한 XrSpatialComponentTypeEXT 값의 배열을 가리키는 포인터여야 합니다. -
enabledComponentCount매개변수는 해야0보다 커야 합니다.
보장된 구성요소
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
동기식 레이캐스트
xrCreateSpatialRaycastSnapshotANDROID 함수는 다음과 같이 정의됩니다.
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
파라미터 설명
spatialContext는 이전에 xrCreateSpatialContextAsyncEXT를 사용하여 생성된 XrSpatialContextEXT입니다 .createInfo는 XrSpatialRaycastSnapshotCreateInfoANDROID를 가리키는 포인터입니다 .snapshot은 XrSpatialSnapshotEXT를 가리키는 포인터입니다 .
xrCreateSpatialDiscoverySnapshotAsyncEXT는 대부분의 사용 사례에 충분하지만 즉각적인 레이캐스트 결과가 필요한 애플리케이션에서는 느린 것으로 간주됩니다. xrCreateSpatialRaycastSnapshotANDROID는 스냅샷을 만들기 위해 동기식 레이캐스팅을 시작하므로 애플리케이션에서 즉시 레이캐스트 결과 쿼리를 시작할 수 있습니다.
런타임은 해야 합니다. XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT를 반환합니다. spatialContext를 만들 때 XrSpatialContextCreateInfoEXT :: capabilityConfigs에 전달된 공간 기능에 대해 XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes의 XrSpatialComponentTypeEXT가 사용 설정되지 않은 경우
애플리케이션에서 XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes에 공간 구성요소 유형 목록을 제공하지 않는 경우 런타임은 spatialContext에 구성된 레이캐스트 지원 기능에 대해 XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents에 열거된 구성요소 집합이 있는 모든 공간 항목을 스냅샷에 포함해야 합니다 . 런타임은 spatialContext에 구성된 레이캐스트 지원 기능의 사용 설정된 모든 구성요소의 데이터를 포함해야 합니다 .
유효한 사용 (암시적)
-
XR_ANDROID_spatial_discovery_raycast확장 프로그램을 xrCreateSpatialRaycastSnapshotANDROID를 호출하기 전에 사용 설정해야 합니다. -
spatialContext는 유효한 XrSpatialContextEXT 핸들이어야 합니다. -
createInfo는 유효한 XrSpatialRaycastSnapshotCreateInfoANDROID 구조를 가리키는 포인터여야 합니다. -
snapshot은 XrSpatialSnapshotEXT 핸들을 가리키는 포인터여야 합니다
반환 코드
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_OUT_OF_MEMORYXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
XrSpatialRaycastSnapshotCreateInfoANDROID 구조는 다음과 같이 정의됩니다.
typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
const XrSpatialRaycastInfoANDROID* raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;
회원 설명
type은 이 구조의 XrStructureType입니다.next는NULL이거나 구조 체인의 다음 구조를 가리키는 포인터입니다. 이러한 구조는 핵심 OpenXR 또는 이 확장 프로그램에 정의되어 있지 않습니다.componentTypeCount는componentTypes배열의 요소 수를 설명하는uint32_t입니다.componentTypes는 XrSpatialComponentTypeEXT 배열입니다 .raycastInfo는 XrSpatialRaycastInfoANDROID 구조로 광선의 정보를 설명합니다.
유효한 사용 (암시적)
-
XR_ANDROID_spatial_discovery_raycast확장 프로그램을 사용하기 전에 XrSpatialRaycastSnapshotCreateInfoANDROID를 사용 설정해야 합니다. -
type여야XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID**합니다**. -
next는NULL이거나 구조 체인의 다음 구조를 가리키는 유효한 포인터여야 합니다 -
componentTypeCount가0이 아닌 경우componentTypes는componentTypeCount유효한 XrSpatialComponentTypeEXT 값의 배열을 가리키는 포인터여야 합니다. -
raycastInfo는 유효한 XrSpatialRaycastInfoANDROID 구조를 가리키는 포인터여야 합니다.
예시 코드
심도 레이캐스트 및 평면 추적 기능 구성
다음 예시 코드는 레이캐스트 기능을 지원하는 기능으로 공간 컨텍스트를 만드는 방법을 보여줍니다. 이 예시에서는 XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID 및 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_DEPTH_RAYCAST_ANDROID) == capabilities.end()) {
return;
}
if (std::find(capabilities.begin(), capabilities.end(), XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT) == capabilities.end()) {
return;
}
// Create capability config for depth raycasting
std::vector<XrSpatialComponentTypeEXT> depthRaycastComponents {
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
};
// Create capability config for depth raycasting
XrSpatialCapabilityConfigurationDepthRaycastANDROID depthRaycastConfig {
.type = XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID,
.next = nullptr,
.capability = XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID,
.enabledComponentCount = (uint32_t)depthRaycastComponents.size(),
.enabledComponents = depthRaycastComponents.data(),
};
// Enumerate runtime supported components for plane tracking capability
XrSpatialCapabilityComponentTypesEXT capabilityComponentTypes {
XR_TYPE_SPATIAL_CAPABILITY_COMPONENT_TYPES_EXT
};
bool isRaycastSupportedViaPlaneTracking;
std::vector<XrSpatialComponentTypeEXT> planeTrackingComponents {
XR_SPATIAL_COMPONENT_TYPE_BOUNDED_2D_EXT,
XR_SPATIAL_COMPONENT_TYPE_PLANE_ALIGNMENT_EXT,
};
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));
planeTrackingComponents.resize(capabilityComponentTypes.componentTypeCountOutput);
capabilityComponentTypes.componentTypeCapacityInput = (uint32_t)planeTrackingComponents.size();
capabilityComponentTypes.componentTypes = planeTrackingComponents.data();
CHK_XR(xrEnumerateSpatialCapabilityComponentTypesEXT(instance, systemId,
XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, &capabilityComponentTypes));
// Check if raycast is supported by plane tracking
isRaycastSupportedViaPlaneTracking = std::find(planeTrackingComponents.begin(),
planeTrackingComponents.end(), XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID)
!= planeTrackingComponents.end();
// 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
// Types of raycast is determined by configs included in XrSpatialContextCreateInfoEXT
// For this example, both plane raycast & depth raycast are performed
std::vector<const XrSpatialCapabilityConfigurationBaseHeaderEXT*> capabilityConfigs;
capabilityConfigs.push_back(reinterpret_cast<const XrSpatialCapabilityConfigurationBaseHeaderEXT*>(&depthRaycastConfig));
if(isRaycastSupportedViaPlaneTracking) 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_DEPTH_RAYCAST_ANDROID 및 XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT로 구성된 컨텍스트의 공간 항목을 검색하고 구성요소 데이터를 쿼리하는 방법을 보여줍니다.
// Fill in the raycast info.
XrSpatialRaycastInfoANDROID raycastInfo {
.type = XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID,
.next = nullptr,
.space = viewSpace,
.time = updateTime,
.origin = {0.0f, 0.0f, 0.0f},
.direction = {0.0f, 0.0f,-1.0f},
.maxDistance = 0.0f // ray is unbounded
};
// Next pointing to the raycast info.
XrSpatialDiscoverySnapshotCreateInfoEXT discoverySnapshotCreateInfo {
.type = XR_TYPE_SPATIAL_DISCOVERY_SNAPSHOT_CREATE_INFO_EXT,
.next = &raycastInfo
};
// Create snapshot
CHK_XR(xrCreateSpatialDiscoverySnapshotAsyncEXT (
spatialContext, &discoverySnapshotCreateInfo, &future));
waitUntilReady(future);
// Complete async operation.
XrCreateSpatialDiscoverySnapshotCompletionInfoEXT
createSnapshotCompletionInfo {
.type = XR_TYPE_CREATE_SPATIAL_DISCOVERY_SNAPSHOT_COMPLETION_INFO_EXT,
.baseSpace = viewSpace,
.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 hit result components
std::array<XrSpatialComponentTypeEXT, 1> enabledComponents = {
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_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,
};
XrResult result = xrQuerySpatialComponentDataEXT(
completion.snapshot, &queryCond, &queryResult);
// Check query result.
if(result != XR_SUCCESS) return;
// Query again for the hit result list.
std::vector<XrSpatialRaycastResultDataANDROID> raycastResults;
raycastResults.resize(queryResult.entityIdCountOutput);
XrSpatialComponentRaycastResultListANDROID raycastResultList {
.type = XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID,
.raycastResultCount = (uint32_t)raycastResults.size(),
.raycastResults = raycastResults.data(),
};
queryResult.next = &raycastResultList;
result = xrQuerySpatialComponentDataEXT(completion.snapshot, &queryCond, &queryResult);
// Check query result again.
if(result != XR_SUCCESS) return;
std::vector<XrSpatialEntityEXT> hitEntities;
std::vector<XrPosef> depthHitPoses;
for(uint32_t i = 0; i < queryResult.entityIdCountOutput; ++i) {
// access raycastResults[i] for id & pose
XrSpatialEntityIdEXT id = queryResult.entityIds[i];
XrPosef pose = raycastResults[i].hitPose;
if (id != XR_NULL_SPATIAL_ENTITY_ID_EXT) {
// hit entities (e.g. planes)
// get entity handle via entity id
XrSpatialEntityFromIdCreateInfoEXT entityCreateInfo {
.type = XR_TYPE_SPATIAL_ENTITY_FROM_ID_CREATE_INFO_EXT,
.entityId = id,
};
XrSpatialEntityEXT entity = XR_NULL_HANDLE;
xrCreateSpatialEntityFromIdEXT(spatialContext, &entityCreateInfo, &entity);
hitEntities.push_back(entity);
} else {
// hit depth
depthHitPoses.push_back(pose);
}
}
// Cleanup
xrDestroySpatialSnapshotEXT(completion.snapshot);
레이캐스트 스냅샷 만들기
다음 예시 코드는 동기식 레이캐스트 스냅샷을 만드는 방법을 보여줍니다.
// fill in create info
XrSpatialRaycastSnapshotCreateInfoANDROID createInfo {
.type = XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID,
.componentTypeCount = 0, // include all hit spatial entities
.componentTypes = nullptr,
.raycastInfo = &raycastInfo
};
// create raycast snapshot
XrSpatialSnapshotEXT raycastSnapshot = XR_NULL_HANDLE;
CHK_XR(xrCreateSpatialRaycastSnapshotANDROID(
spatialContext, &createInfo, &raycastSnapshot));
// ...
// query component data as previous example
// ...
// Cleanup
xrDestroySpatialSnapshotEXT(raycastSnapshot);
새 명령어
새 구조
- XrSpatialCapabilityConfigurationDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
새 enum 상수
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAMEXR_ANDROID_spatial_discovery_raycast_SPEC_VERSION-
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
XrSpatialComponentTypeEXT 확장 :
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
XrStructureType 확장 :
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROIDXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROIDXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROIDXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID
문제
버전 기록
버전 1, 2025-07-15 (Brian Chen)
- 초기 확장 프로그램 설명입니다.