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 или отрицательное значение, среда выполнения должна считать луч неограниченным.

Допустимое использование (неявное)

Компонент результата трассировки луча

Структура 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 для сортировки результатов по расстоянию.

Допустимое использование (неявное)

Конфигурация

Если для какой-либо возможности в списке 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_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID , должна поддерживать следующие пространственные компоненты в качестве гарантированных компонентов объектов, обнаруженных с помощью этой возможности, и должна перечислять их в xrEnumerateSpatialCapabilityComponentTypesEXT -

  • XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID

Синхронная трассировка лучей

Функция xrCreateSpatialRaycastSnapshotANDROID определена следующим образом:

XrResult xrCreateSpatialRaycastSnapshotANDROID(
    XrSpatialContextEXT                         spatialContext,
    const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
    XrSpatialSnapshotEXT*                       snapshot);

Описание параметров

Хотя xrCreateSpatialDiscoverySnapshotAsyncEXT достаточен для большинства случаев использования, он считается медленным для приложений, требующих мгновенных результатов трассировки лучей. xrCreateSpatialRaycastSnapshotANDROID запускает синхронную трассировку лучей для создания снимка, что позволяет приложениям немедленно начать запрашивать результаты трассировки лучей.

Если какой-либо из параметров XrSpatialComponentTypeEXT в XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes не включен для пространственных возможностей, переданных в XrSpatialContextCreateInfoEXT :: capabilityConfigs при создании spatialContext , среда выполнения должна вернуть XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT

Если приложение не предоставляет список типов пространственных компонентов в XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes , среда выполнения должна включить все пространственные объекты в снимке, имеющие набор компонентов, перечисленных в XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents для поддерживаемых возможностей трассировки лучей, настроенных для spatialContext . Среда выполнения должна включать данные для всех включенных компонентов поддерживаемых возможностей трассировки лучей, настроенных для spatialContext .

Допустимое использование (неявное)

Коды возврата

Успех

  • 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_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);

Новые команды

Новые сооружения

Новые константы перечислений

  • 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 (Брайан Чен)

    • Первоначальное описание расширения.