XR_ANDROID_spatial_discovery_raycast
Строка имени
XR_ANDROID_spatial_discovery_raycast
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
787
Пересмотр
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
XR_EXT_spatial_entity
Дата последнего изменения
2025-08-12
Статус IP
Известных претензий на интеллектуальную собственность нет.
Авторы
Брайан Чен, Google
Левана Чен, Google
Кайл Чен, Google
Нихав Джайн, Google
Спенсер Куин, Google
Натали Флери, Мета
Юичи Тагучи, Мета
Джимми Алампарамбил, ByteDance
Чжипен Лю, 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 считаются опасными.
(Уровень защиты: опасный)
Поддержка во время выполнения
Если среда выполнения поддерживает обнаружение пространственных объектов с помощью трассировки лучей, она должна указать это, перечислив XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID в xrEnumerateSpatialCapabilityComponentTypesEXT для возможностей, поддерживающих обнаружение с помощью трассировки лучей.
Если среда выполнения поддерживает трассировку лучей по буферу глубины, она должна перечислить 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— это XrSpace , в котором будет находиться позиция объекта XrSpatialRaycastResultDataANDROID . -
time— это значениеXrTime, в которое определена поза объекта XrSpatialRaycastResultDataANDROID . -
originпредставляет собой XrVector3f , описывающий начало координат луча. -
directionпредставляет собой объект XrVector3f , описывающий направление луча. -
maxDistance— это расстояние в метрах, которое приложение может дополнительно указать для ограничения обнаружения объектов, находящихся в пределах указанного расстояния отorigin, вдольdirection.
Приложение может включить XrSpatialRaycastInfoANDROID в цепочку XrSpatialDiscoverySnapshotCreateInfoEXT :: next для обнаружения пространственных объектов, пересекающихся с лучом, определенным в этой структуре.
Если приложение использует XrSpatialRaycastInfoANDROID с XrSpatialContextEXT , который был настроен без включения XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID для какой-либо возможности, среда выполнения должна вернуть XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT из xrCreateSpatialDiscoverySnapshotAsyncEXT или xrCreateSpatialRaycastSnapshotANDROID .
В среду выполнения должны быть включены данные компонентов и идентификаторы только тех пространственных объектов в XrSpatialSnapshotEXT , которые получены из возможностей, поддерживающих компонент XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID .
Если приложение задает значение maxDistance как положительное, среда выполнения не должна включать в снимок пространственные объекты, находящиеся на расстоянии, превышающем maxDistance , от panme:origin в direction . Если maxDistance установлено на 0 или отрицательное значение, среда выполнения должна считать луч неограниченным.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_raycastнеобходимо включить перед использованием XrSpatialRaycastInfoANDROID. -
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 , созданном из xrCreateSpatialDiscoverySnapshotAsyncEXT , где XrSpatialRaycastInfoANDROID включен в цепочку XrSpatialDiscoverySnapshotCreateInfoEXT :: next , или в XrSpatialSnapshotEXT, созданном из xrCreateSpatialRaycastSnapshotANDROID .
В среде выполнения этот компонент не должен присутствовать ни в одном файле XrSpatialSnapshotEXT , созданном с помощью функции xrCreateSpatialUpdateSnapshotEXT .
Если приложение включает XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID в XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes , среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE из xrCreateSpatialUpdateSnapshotEXT .
Если XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID включен только для определенных возможностей, среда выполнения должна включать в снимок только пространственные объекты, предоставляемые этими возможностями. Например, если объект и плоскость выравниваются в одном направлении, и XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID включен только для XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , будет обнаружена только плоскость.
hitPose объекта XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID будет находиться в XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace в момент времени XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time . Положительная ось Z — это нормаль к поверхности попадания, а отрицательная ось Y приблизительно указывает на начало луча.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_raycastнеобходимо включить перед использованием XrSpatialRaycastResultDataANDROID.
Структура списка компонентов для запроса данных.
Структура XrSpatialComponentRaycastResultListANDROID определяется следующим образом:
typedef struct XrSpatialComponentRaycastResultListANDROID {
XrStructureType type;
void* next;
uint32_t raycastResultCount;
XrSpatialRaycastResultDataANDROID* raycastResults;
} XrSpatialComponentRaycastResultListANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
next— этоNULLили указатель на следующую структуру в цепочке структур. -
raycastResultCount— это тип данныхuint32_t, описывающий количество элементов в массивеraycastResults. -
raycastResults— это массив объектов XrSpatialRaycastResultDataANDROID .
Для запроса компонента результата трассировки лучей пространственных объектов в XrSpatialSnapshotEXT необходимо включить XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID в XrSpatialComponentDataQueryConditionEXT :: componentTypes и добавить XrSpatialComponentRaycastResultListANDROID в цепочку XrSpatialComponentDataQueryResultEXT :: next .
Среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE из xrQuerySpatialComponentDataEXT , если XrSpatialComponentRaycastResultListANDROID находится в цепочке XrSpatialComponentDataQueryResultEXT :: next , но XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID не включен в XrSpatialComponentDataQueryConditionEXT :: componentTypes .
Если raycastResultCount меньше, чем XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput , среда выполнения должна возвращать XR_ERROR_SIZE_INSUFFICIENT из xrQuerySpatialComponentDataEXT .
Возвращаемые raycastResults не упорядочены. Приложение может использовать XrSpatialRaycastResultDataANDROID :: distanceSquared для сортировки результатов по расстоянию.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_raycastнеобходимо включить перед использованием XrSpatialComponentRaycastResultListANDROID. -
typeдолжен бытьXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
raycastResultsдолжен быть указателем на массив структурraycastResultCountXrSpatialRaycastResultDataANDROID. - Параметр
raycastResultCountдолжен быть больше0
Конфигурация
Если для какой-либо возможности в списке XrSpatialCapabilityComponentTypesEXT :: componentTypes указан XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID , приложение может включить её, добавив значение перечисления в список XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents . Для этого компонента не требуется специальная конфигурация, которую необходимо включить в следующую цепочку XrSpatialCapabilityConfigurationBaseHeaderEXT .
Если приложение включает компонент XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID в XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes , среда выполнения должна возвращать XR_ERROR_VALIDATION_FAILURE из xrCreateSpatialUpdateSnapshotEXT . Этот компонент предназначен для моментальных снимков обнаружения.
Пространственные возможности трассировки лучей глубины
Конфигурация
Структура 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— это типuint32_t, описывающий количество элементов в массивеenabledComponents. Он должен быть больше 0. -
enabledComponents— это указатель на массив XrSpatialComponentTypeEXT .
Приложения могут включить пространственную возможность XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID , добавив указатель на структуру XrSpatialCapabilityConfigurationDepthRaycastANDROID в XrSpatialContextCreateInfoEXT :: capabilityConfigs .
Если capability XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID не равно XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID , среда выполнения должна вернуть XR_ERROR_VALIDATION_FAILURE .
Идентификатор сущностей, обнаруженных с помощью этой возможности, всегда равен XR_NULL_SPATIAL_ENTITY_ID_EXT . Это также означает, что приложение не может создать дескриптор XrSpatialEntityEXT для этих сущностей, и, следовательно, они не могут быть включены в XrSpatialUpdateSnapshotCreateInfoEXT :: entities для создания снимка обновления.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_raycastнеобходимо включить перед использованием XrSpatialCapabilityConfigurationDepthRaycastANDROID. -
typeдолжен бытьXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. - Значение
capabilityдолжно быть допустимым значением XrSpatialCapabilityEXT. -
enabledComponentsдолжен быть указателем на массив допустимых значений XrSpatialComponentTypeEXT, равныхenabledComponentCount. - Параметр
enabledComponentCountдолжен быть больше0
Гарантированные компоненты
Среда выполнения, поддерживающая XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID , должна поддерживать следующие пространственные компоненты в качестве гарантированных компонентов объектов, обнаруженных с помощью этой возможности, и должна перечислять их в xrEnumerateSpatialCapabilityComponentTypesEXT -
-
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Синхронная трассировка лучей
Функция xrCreateSpatialRaycastSnapshotANDROID определена следующим образом:
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
Описание параметров
-
spatialContext— это объект XrSpatialContextEXT, созданный ранее с помощью функции xrCreateSpatialContextAsyncEXT . -
createInfo— это указатель на объект XrSpatialRaycastSnapshotCreateInfoANDROID . -
snapshot— это указатель на объект XrSpatialSnapshotEXT .
Хотя xrCreateSpatialDiscoverySnapshotAsyncEXT достаточен для большинства случаев использования, он считается медленным для приложений, требующих мгновенных результатов трассировки лучей. xrCreateSpatialRaycastSnapshotANDROID запускает синхронную трассировку лучей для создания снимка, что позволяет приложениям немедленно начать запрашивать результаты трассировки лучей.
Если какой-либо из параметров XrSpatialComponentTypeEXT в XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes не включен для пространственных возможностей, переданных в XrSpatialContextCreateInfoEXT :: capabilityConfigs при создании spatialContext , среда выполнения должна вернуть XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT
Если приложение не предоставляет список типов пространственных компонентов в XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes , среда выполнения должна включить все пространственные объекты в снимке, имеющие набор компонентов, перечисленных в XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents для поддерживаемых возможностей трассировки лучей, настроенных для spatialContext . Среда выполнения должна включать данные для всех включенных компонентов поддерживаемых возможностей трассировки лучей, настроенных для spatialContext .
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_raycastнеобходимо включить перед вызовом функции xrCreateSpatialRaycastSnapshotANDROID. -
spatialContextдолжен быть допустимым дескриптором XrSpatialContextEXT. -
createInfoдолжна быть указателем на допустимую структуру XrSpatialRaycastSnapshotCreateInfoANDROID. -
snapshotдолжен быть указателем на дескриптор XrSpatialSnapshotEXT.
Коды возврата
-
XR_SUCCESS -
XR_SESSION_LOSS_PENDING
-
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_HANDLE_INVALID -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_LIMIT_REACHED -
XR_ERROR_OUT_OF_MEMORY -
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_SESSION_LOST -
XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT -
XR_ERROR_TIME_INVALID -
XR_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— это тип данныхuint32_t, описывающий количество элементов в массивеcomponentTypes. -
componentTypes— это массив объектов XrSpatialComponentTypeEXT . -
raycastInfo— это структура XrSpatialRaycastInfoANDROID , описывающая информацию о луче.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_spatial_discovery_raycastнеобходимо включить перед использованием функции XrSpatialRaycastSnapshotCreateInfoANDROID. -
typeдолжен бытьXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. - Если
componentTypeCountне равно0,componentTypesдолжен быть указателем на массив допустимых значений XrSpatialComponentTypeEXT , содержащихcomponentTypeCount -
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
Расширение XrSpatialComponentDataQueryResultEXT :
Расширение XrSpatialDiscoverySnapshotCreateInfoEXT :
Новые константы перечислений
-
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAME -
XR_ANDROID_spatial_discovery_raycast_SPEC_VERSION Расширение XrSpatialCapabilityEXT :
-
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
-
Расширение XrSpatialComponentTypeEXT :
-
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
-
Расширение XrStructureType :
-
XR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID -
XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID -
XR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID -
XR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID
-
Проблемы
История версий
Редакция 1, 15.07.2025 (Брайан Чен)
- Первоначальное описание расширения.