XR_ANDROID_spatial_discovery_raycast
Cadena de nombre
XR_ANDROID_spatial_discovery_raycast
Tipo de extensión
Extensión de instancia
Número de extensión registrada
787
Revisión
1
Estado de ratificación
No ratificado
Dependencias de extensión y versión
XR_EXT_spatial_entity
Fecha de modificación más reciente
12/8/2025
Estado de IP
No se conocen reclamos de IP.
Colaboradores
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
Descripción general
Esta extensión se basa en XR_EXT_spatial_entity y proporciona funcionalidad de raycast para las capacidades espaciales existentes, como XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , para descubrir entidades espaciales.
Esta extensión también presenta una nueva capacidad espacial para el raycasting en el búfer de profundidad.
Permisos
Permisos obligatorios según las capacidades que usa la aplicación para Android. Si se usa XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID, la aplicación debe tener el permiso android.permission.SCENE_UNDERSTANDING_FINE. Si se usa XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, la aplicación debe tener el permiso android.permission.SCENE_UNDERSTANDING_COARSE. El permiso android.permission.SCENE_UNDERSTANDING_FINE también implica el permiso android.permission.SCENE_UNDERSTANDING_COARSE. Si la aplicación usa ambas capacidades, no necesita solicitar ambos permisos por separado.
android.permission.SCENE_UNDERSTANDING_COARSE y android.permission.SCENE_UNDERSTANDING_FINE se consideran permisos peligrosos.
(nivel de protección: peligroso)
Asistencia del entorno de ejecución
Si el entorno de ejecución admite el descubrimiento de entidades espaciales a través del raycasting, debe indicarlo enumerando XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID en xrEnumerateSpatialCapabilityComponentTypesEXT para las capacidades que admiten el descubrimiento por raycast.
Si el entorno de ejecución admite el raycasting en el búfer de profundidad, debe enumerar XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID en xrEnumerateSpatialCapabilitiesEXT .
Descubre entidades espaciales mediante el raycasting
La estructura XrSpatialRaycastInfoANDROID se define de la siguiente manera:
typedef struct XrSpatialRaycastInfoANDROID {
XrStructureType type;
const void* next;
XrSpace space;
XrTime time;
XrVector3f origin;
XrVector3f direction;
float maxDistance;
} XrSpatialRaycastInfoANDROID;
Descripciones de miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructura.spacees el XrSpace en el que se ubicará la postura de XrSpatialRaycastResultDataANDROID.timees unXrTimeen el que se define la postura de XrSpatialRaycastResultDataANDROID.origines un XrVector3f que describe el origen del rayo.directiones un XrVector3f que describe la dirección del rayo.maxDistancees la distancia en metros que la aplicación puede especificar de forma opcional para limitar el descubrimiento de entidades que se encuentran dentro de la distancia especificada desde elorigin, junto condirection.
Una aplicación puede incluir XrSpatialRaycastInfoANDROID en la cadena XrSpatialDiscoverySnapshotCreateInfoEXT :: next para descubrir entidades espaciales que se cruzan con el rayo definido en este struct.
Si una aplicación usa XrSpatialRaycastInfoANDROID con un XrSpatialContextEXT que se configuró sin habilitar XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID para ninguna capacidad, el entorno de ejecución debe mostrar XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT desde xrCreateSpatialDiscoverySnapshotAsyncEXT o xrCreateSpatialRaycastSnapshotANDROID .
El entorno de ejecución debe incluir los datos y los IDs de los componentes de solo esas entidades espaciales en XrSpatialSnapshotEXT que provienen de capacidades que admiten el componente XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID.
Si una aplicación establece maxDistance en un valor positivo, el entorno de ejecución no debe incluir ninguna entidad espacial alcanzada en la instantánea que esté a más de maxDistance del panme:origin a lo largo de direction . Si maxDistance se establece en 0 o en un valor negativo, el entorno de ejecución debe considerar que el rayo no está delimitado.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_raycastdebe habilitarse antes de usar XrSpatialRaycastInfoANDROID. -
typedebe serXR_TYPE_SPATIAL_RAYCAST_INFO_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructura -
spacedebe ser un controlador XrSpace válido.
Componente de resultado de raycast
La estructura XrSpatialRaycastResultDataANDROID se define de la siguiente manera:
typedef struct XrSpatialRaycastResultDataANDROID {
XrPosef hitPose;
float distanceSquared;
} XrSpatialRaycastResultDataANDROID;
Descripciones de miembros
hitPosees un XrPosef que define el punto en el que el rayo se cruza con la entidad espacial.distanceSquaredes el cuadrado de la distancia desde el origen del rayo hasta el punto de intersección.
El componente XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID solo estará presente en un XrSpatialSnapshotEXT creado a partir de xrCreateSpatialDiscoverySnapshotAsyncEXT, en el que XrSpatialRaycastInfoANDROID se incluye en la cadena XrSpatialDiscoverySnapshotCreateInfoEXT :: next o en un XrSpatialSnapshotEXT creado a partir de xrCreateSpatialRaycastSnapshotANDROID .
El entorno de ejecución no debe incluir este componente en ningún XrSpatialSnapshotEXT que se cree con xrCreateSpatialUpdateSnapshotEXT .
El entorno de ejecución debe mostrar XR_ERROR_VALIDATION_FAILURE desde xrCreateSpatialUpdateSnapshotEXT si la aplicación incluye XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID en XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes .
Si XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID está habilitado solo para ciertas capacidades, el entorno de ejecución debe incluir solo las entidades espaciales proporcionadas por esas capacidades en la instantánea. Por ejemplo, si un objeto y un plano se alinean en la misma dirección y XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID está habilitado solo para XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT , solo se descubrirá el plano.
El hitPose de XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID se ubicará en XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: baseSpace en XrCreateSpatialDiscoverySnapshotCompletionInfoEXT :: time . El eje Z positivo es la normal de la superficie alcanzada, y el eje Y negativo apunta aproximadamente hacia el origen del rayo.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_raycastdebe habilitarse antes de usar XrSpatialRaycastResultDataANDROID.
Struct de lista de componentes para consultar datos
La estructura XrSpatialComponentRaycastResultListANDROID se define de la siguiente manera:
typedef struct XrSpatialComponentRaycastResultListANDROID {
XrStructureType type;
void* next;
uint32_t raycastResultCount;
XrSpatialRaycastResultDataANDROID* raycastResults;
} XrSpatialComponentRaycastResultListANDROID;
Descripciones de miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructura.raycastResultCountes unuint32_tque describe el recuento de elementos en el arrayraycastResults.raycastResultses un array de XrSpatialRaycastResultDataANDROID .
Para consultar el componente de resultado de raycast de las entidades espaciales en un XrSpatialSnapshotEXT , incluye XR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID en XrSpatialComponentDataQueryConditionEXT :: componentTypes y agrega XrSpatialComponentRaycastResultListANDROID a la cadena XrSpatialComponentDataQueryResultEXT :: next.
El entorno de ejecución debe mostrar XR_ERROR_VALIDATION_FAILURE desde xrQuerySpatialComponentDataEXT si XrSpatialComponentRaycastResultListANDROID está en la cadena XrSpatialComponentDataQueryResultEXT :: next, pero XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID no se incluye en XrSpatialComponentDataQueryConditionEXT :: componentTypes .
El entorno de ejecución debe mostrar XR_ERROR_SIZE_INSUFFICIENT desde xrQuerySpatialComponentDataEXT si raycastResultCount es menor que XrSpatialComponentDataQueryResultEXT :: entityIdCountOutput .
Los raycastResults que se muestran no están ordenados. Una aplicación puede usar XrSpatialRaycastResultDataANDROID :: distanceSquared para ordenar los resultados por distancia.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_raycastdebe habilitarse antes de usar XrSpatialComponentRaycastResultListANDROID -
typedebe serXR_TYPE_SPATIAL_COMPONENT_RAYCAST_RESULT_LIST_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructura -
raycastResultsdebe ser un puntero a un array de estructurasraycastResultCountXrSpatialRaycastResultDataANDROID. - El parámetro
raycastResultCountdebe ser mayor que0
Configuración
Si XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID se enumera en XrSpatialCapabilityComponentTypesEXT :: componentTypes para alguna capacidad, la aplicación puede habilitarla incluyendo el valor de enum en la lista XrSpatialCapabilityConfigurationBaseHeaderEXT :: enabledComponents. Este componente no requiere ninguna configuración especial para incluirse en la siguiente cadena de XrSpatialCapabilityConfigurationBaseHeaderEXT .
El entorno de ejecución debe mostrar XR_ERROR_VALIDATION_FAILURE desde xrCreateSpatialUpdateSnapshotEXT si la aplicación incluye XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID en XrSpatialUpdateSnapshotCreateInfoEXT :: componentTypes . Este componente es específico de las instantáneas de descubrimiento.
Capacidad espacial de raycast de profundidad
Configuración
La estructura XrSpatialCapabilityConfigurationDepthRaycastANDROID se define de la siguiente manera:
typedef struct XrSpatialCapabilityConfigurationDepthRaycastANDROID {
XrStructureType type;
const void* next;
XrSpatialCapabilityEXT capability;
uint32_t enabledComponentCount;
const XrSpatialComponentTypeEXT* enabledComponents;
} XrSpatialCapabilityConfigurationDepthRaycastANDROID;
Descripciones de miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructura.capabilityes un XrSpatialCapabilityEXT y debe serXR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID.enabledComponentCountes unuint32_tque describe el recuento de elementos en el arrayenabledComponents. Debe ser mayor que 0.enabledComponentses un puntero a un array de XrSpatialComponentTypeEXT .
Las aplicaciones pueden habilitar la capacidad espacial XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID incluyendo un puntero a una estructura XrSpatialCapabilityConfigurationDepthRaycastANDROID en XrSpatialContextCreateInfoEXT :: capabilityConfigs .
El entorno de ejecución debe mostrar XR_ERROR_VALIDATION_FAILURE si capability no es XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID .
El ID de las entidades descubiertas a través de esta capacidad siempre es XR_NULL_SPATIAL_ENTITY_ID_EXT . Esto también significa que la aplicación no puede crear un controlador XrSpatialEntityEXT para estas entidades y, por lo tanto, no se pueden incluir en XrSpatialUpdateSnapshotCreateInfoEXT :: entities para crear una instantánea de actualización.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_raycastdebe habilitarse antes de usar XrSpatialCapabilityConfigurationDepthRaycastANDROID. -
typedebe serXR_TYPE_SPATIAL_CAPABILITY_CONFIGURATION_DEPTH_RAYCAST_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructura -
capabilitydebe ser un valor XrSpatialCapabilityEXT válido -
enabledComponentsdebe ser un puntero a un array deenabledComponentCountvalores XrSpatialComponentTypeEXT válidos - El parámetro
enabledComponentCountdebe ser mayor que0
Componentes garantizados
Un entorno de ejecución que admite XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID , debe admitir los siguientes componentes espaciales como componentes garantizados de las entidades descubiertas por esta capacidad y debe enumerarlos en xrEnumerateSpatialCapabilityComponentTypesEXT -
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Raycast síncrono
La función xrCreateSpatialRaycastSnapshotANDROID se define de la siguiente manera:
XrResult xrCreateSpatialRaycastSnapshotANDROID(
XrSpatialContextEXT spatialContext,
const XrSpatialRaycastSnapshotCreateInfoANDROID* createInfo,
XrSpatialSnapshotEXT* snapshot);
Descripciones de parámetros
spatialContextes un XrSpatialContextEXT creado anteriormente con xrCreateSpatialContextAsyncEXT .createInfoes un puntero a un XrSpatialRaycastSnapshotCreateInfoANDROID .snapshotes un puntero a un XrSpatialSnapshotEXT .
Si bien xrCreateSpatialDiscoverySnapshotAsyncEXT es suficiente para la mayoría de los casos de uso, se considera lento para las aplicaciones que requieren resultados de raycast instantáneos. xrCreateSpatialRaycastSnapshotANDROID inicia un raycasting síncrono para crear una instantánea, lo que permite que las aplicaciones comiencen a consultar los resultados de raycast de inmediato.
El entorno de ejecución debe mostrar XR_ERROR_SPATIAL_COMPONENT_NOT_ENABLED_EXT si alguno de los XrSpatialComponentTypeEXT en XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes no está habilitado para las capacidades espaciales que se pasan a XrSpatialContextCreateInfoEXT :: capabilityConfigs cuando se crea spatialContext .
Si la aplicación no proporciona una lista de tipos de componentes espaciales en XrSpatialRaycastSnapshotCreateInfoANDROID :: componentTypes , el entorno de ejecución debe incluir todas las entidades espaciales en la instantánea que tengan el conjunto de componentes que se enumeran en XrSpatialCapabilityConfigurationBaseHeaderEXT ::enabledComponents para las capacidades compatibles con raycast configuradas para spatialContext . El entorno de ejecución debe incluir los datos de todos los componentes habilitados de las capacidades compatibles con raycast configuradas para spatialContext .
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_raycastdebe habilitarse antes de llamar a xrCreateSpatialRaycastSnapshotANDROID -
spatialContextdebe ser un controlador XrSpatialContextEXT válido. -
createInfodebe ser un puntero a una estructura XrSpatialRaycastSnapshotCreateInfoANDROID válida. -
snapshotdebe ser un puntero a un controlador XrSpatialSnapshotEXT.
Códigos de retorno
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
La estructura XrSpatialRaycastSnapshotCreateInfoANDROID se define de la siguiente manera:
typedef struct XrSpatialRaycastSnapshotCreateInfoANDROID {
XrStructureType type;
const void* next;
uint32_t componentTypeCount;
const XrSpatialComponentTypeEXT* componentTypes;
const XrSpatialRaycastInfoANDROID* raycastInfo;
} XrSpatialRaycastSnapshotCreateInfoANDROID;
Descripciones de miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructura. No se definen esas estructuras en el núcleo de OpenXR ni en esta extensión.componentTypeCountes unuint32_tque describe el recuento de elementos en el arraycomponentTypes.componentTypeses un array de XrSpatialComponentTypeEXT .raycastInfoes la estructura XrSpatialRaycastInfoANDROID que describe la información de un rayo.
Uso válido (implícito)
- La extensión
XR_ANDROID_spatial_discovery_raycastdebe habilitarse antes de usar XrSpatialRaycastSnapshotCreateInfoANDROID -
typedebe serXR_TYPE_SPATIAL_RAYCAST_SNAPSHOT_CREATE_INFO_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructura - Si
componentTypeCountno es0,componentTypesdebe ser un puntero a un array de valores XrSpatialComponentTypeEXT válidoscomponentTypeCount. -
raycastInfodebe ser un puntero a una estructura XrSpatialRaycastInfoANDROID válida.
Ejemplo de código
Configura la capacidad de raycast de profundidad y seguimiento de planos
En el siguiente código de ejemplo, se muestra cómo crear un contexto espacial con capacidades que admiten la funcionalidad de raycast. En este ejemplo, se usan XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID y 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))
Descubre entidades espaciales y consulta datos de componentes
En el siguiente código de ejemplo, se muestra cómo descubrir entidades espaciales para un contexto configurado con XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID y XR_SPATIAL_CAPABILITY_PLANE_TRACKING_EXT, y consultar sus datos de componentes.
// 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);
Crea una instantánea de raycast
En el siguiente código de ejemplo, se muestra cómo crear una instantánea de raycast síncrona.
// 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);
Comandos nuevos
Estructuras nuevas
- XrSpatialCapabilityConfigurationDepthRaycastANDROID
- XrSpatialRaycastResultDataANDROID
- XrSpatialRaycastSnapshotCreateInfoANDROID
Extensión de XrSpatialComponentDataQueryResultEXT :
Extensión de XrSpatialDiscoverySnapshotCreateInfoEXT :
Constantes de enum nuevas
XR_ANDROID_SPATIAL_DISCOVERY_RAYCAST_EXTENSION_NAMEXR_ANDROID_spatial_discovery_raycast_SPEC_VERSIONExtensión de XrSpatialCapabilityEXT :
XR_SPATIAL_CAPABILITY_DEPTH_RAYCAST_ANDROID
Extensión de XrSpatialComponentTypeEXT :
XR_SPATIAL_COMPONENT_TYPE_RAYCAST_RESULT_ANDROID
Extensión de 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
Problemas
Historial de versiones
Revisión 1, 15/7/2025 (Brian Chen)
- Descripción inicial de la extensión