Cadena de nombre
XR_ANDROID_raycast
Tipo de extensión
Extensión de la instancia
Número de extensión registrado
464
Revisión
1
Dependencias de extensiones y versiones
Fecha de la última modificación
2024-10-02
Estado de la IP
No hay reclamos de IP conocidos.
Colaboradores
Spencer Quin, Google
Nihav Jain, Google
John Pursey, Google
Jared Finder, Google
Levana Chen, Google
Kenny Vercaemer, Google
Descripción general
Esta extensión permite que la aplicación realice proyecciones de rayos en elementos rastreables en el entorno. Los Raycasts pueden ser útiles para detectar objetos en el entorno con los que se cruzaría un rayo. Por ejemplo:
- Para determinar dónde caería un objeto flotante cuando se suelta, usa un rayo vertical.
- Para determinar hacia dónde mira un usuario, usa un rayo proyectado hacia adelante.
Consulta las funciones de proyección de rayos compatibles
La función xrEnumerateRaycastSupportedTrackableTypesANDROID se define de la siguiente manera:
XrResult xrEnumerateRaycastSupportedTrackableTypesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t trackableTypeCapacityInput,
uint32_t* trackableTypeCountOutput,
XrTrackableTypeANDROID* trackableTypes);
Descripciones de los parámetros
instancees el XrInstance del que se recuperósystemId.systemIdes elXrSystemIdcuyos tipos rastreables compatibles para el raycasting se enumeran.trackableTypeCapacityInputes la capacidad detrackableTypeso 0 para recuperar la capacidad requerida.trackableTypeCountOutputes un puntero al recuento del array o un puntero a la capacidad requerida en caso de quetrackableTypeCapacityInputno sea suficiente.trackableTypeses un puntero a un array de XrTrackableTypeANDROID, pero puede serNULLsitrackableTypeCapacityInputes0.
- Consulta la sección Parámetros de tamaño del búfer para obtener una descripción detallada de cómo recuperar el tamaño
trackableTypesrequerido.
xrEnumerateRaycastSupportedTrackableTypesANDROID enumera los tipos rastreables que admiten el raycasting de la sesión actual.
Uso válido (implícito)
- La extensión
XR_ANDROID_raycastdebe estar habilitada antes de llamar a xrEnumerateRaycastSupportedTrackableTypesANDROID. instancedebe ser un identificador XrInstance válido.trackableTypeCountOutputdebe ser un puntero a un valoruint32_t.- Si
trackableTypeCapacityInputno es0,trackableTypesdebe ser un puntero a un array de valorestrackableTypeCapacityInputXrTrackableTypeANDROID.
Códigos de retorno
XR_SUCCESS
XR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_FUNCTION_UNSUPPORTED
Realiza un raycast
La función xrRaycastANDROID se define de la siguiente manera:
XrResult xrRaycastANDROID(
XrSession session,
const XrRaycastInfoANDROID* rayInfo,
XrRaycastHitResultsANDROID* results);
Descripciones de los parámetros
sessiones la XrSession que realiza el raycast.rayInfoes el XrRaycastInfoANDROID que describe el rayo que se proyectará.resultses un puntero al XrRaycastHitResultsANDROID que recibe los resultados del raycast.
La aplicación puede realizar raycasts llamando a xrRaycastANDROID.
- Si un rayo de rastreo interseca más elementos rastreables que XrRaycastHitResultsANDROID::maxResults, el entorno de ejecución debe mostrar los resultados de los hits más cercanos a XrRaycastHitResultsANDROID::origin del rayo.
- Si un rayo de luz intersecta un elemento rastreable de tipo
XR_TRACKABLE_TYPE_ANDROID_PLANEque está incluido en otro plano, el entorno de ejecución debe mostrar solo el resultado del hit para el plano que lo incluye. - El entorno de ejecución debe mostrar los resultados de los hits en orden de lo más cercano a lo más alejado desde XrRaycastInfoANDROID::origin a lo largo del vector XrRaycastInfoANDROID::trajectory.
- El entorno de ejecución debe mostrar
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROIDsi xrEnumerateRaycastSupportedTrackableTypesANDROID no enumera el tipo rastreable que corresponde a los controladores XrTrackableTrackerANDROID en XrRaycastInfoANDROID::trackers.
Uso válido (implícito)
- La extensión
XR_ANDROID_raycastdebe estar habilitada antes de llamar a xrRaycastANDROID. sessiondebe ser un identificador XrSession válido.rayInfodebe ser un puntero a una estructura XrRaycastInfoANDROID válida.resultsdebe ser un puntero a una estructura XrRaycastHitResultsANDROID.
Códigos de retorno
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROIDXR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SESSION_LOSTXR_ERROR_OUT_OF_MEMORYXR_ERROR_LIMIT_REACHEDXR_ERROR_POSE_INVALIDXR_ERROR_TIME_INVALIDXR_ERROR_FEATURE_UNSUPPORTED
La estructura XrRaycastInfoANDROID se define de la siguiente manera:
typedef struct XrRaycastInfoANDROID {
XrStructureType type;
void* next;
uint32_t maxResults;
uint32_t trackerCount;
const XrTrackableTrackerANDROID* trackers;
XrVector3f origin;
XrVector3f trajectory;
XrSpace space;
XrTime time;
} XrRaycastInfoANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.maxResultses la cantidad máxima de resultadosuint32_tque se mostrarán.trackerCountes el recuento deuint32_tdel arraytrackers.trackerses el array de XrTrackableTrackerANDROID con el que se debe probar el rayo proyectado.origines el XrVector3f desde el que se proyecta el rayo.trajectoryes el XrVector3f al que se orienta el rayo.spacees el XrSpace en el que se proyecta el rayo.timees elXrTimeal que se proyecta el rayo.
La estructura XrRaycastInfoANDROID describe el rayo que se proyectará.
- El array XrRaycastInfoANDROID::trackers puede contener rastreadores de diferentes tipos.
- El array XrRaycastInfoANDROID::trackers no debe contener varios rastreadores del mismo tipo; de lo contrario, el entorno de ejecución debe mostrar
XR_ERROR_VALIDATION_FAILURE.
Uso válido (implícito)
- La extensión
XR_ANDROID_raycastdebe estar habilitada antes de usar XrRaycastInfoANDROID. typedebe serXR_TYPE_RAYCAST_INFO_ANDROID.nextdebe serNULLo un puntero válido a la próxima estructura en una cadena de estructuras.trackersdebe ser un puntero a un array de controles XrTrackableTrackerANDROIDtrackerCountválidos.spacedebe ser un identificador de XrSpace válido.- El parámetro
trackerCountdebe ser mayor que0. - Tanto
spacecomo los elementos detrackersdeben haberse creado, asignado o recuperado desde la misma XrSession.
La estructura XrRaycastHitResultsANDROID se define de la siguiente manera:
typedef struct XrRaycastHitResultsANDROID {
XrStructureType type;
void* next;
uint32_t resultsCapacityInput;
uint32_t resultsCountOutput;
XrRaycastHitResultANDROID* results;
} XrRaycastHitResultsANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras. No se definen tales estructuras en OpenXR principal ni en esta extensión.resultsCapacityInputes la capacidad del arrayresults, o 0 para indicar una solicitud para recuperar la capacidad requerida.resultsCountOutputes un puntero al recuento deresultsescrito o un puntero a la capacidad requerida en caso de queresultsCapacityInputsea insuficiente.resultses un puntero a un array de estructuras XrRaycastHitResultANDROID. Puede serNULLsiresultsCapacityInputes 0.- Consulta la sección Parámetros de tamaño del búfer para obtener una descripción detallada de cómo recuperar el tamaño
resultsrequerido.
XrRaycastHitResultsANDROID contiene el array de hits de un rayo de luz.
El entorno de ejecución debe establecer resultsCountOutput como menor o igual que XrRaycastInfoANDROID::maxResults.
Uso válido (implícito)
- La extensión
XR_ANDROID_raycastdebe estar habilitada antes de usar XrRaycastHitResultsANDROID. typedebe serXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID.nextdebe serNULLo un puntero válido a la próxima estructura en una cadena de estructuras.resultsdebe ser un puntero a un array de estructurasresultsCapacityInputbasadas en XrRaycastHitResultANDROID.- El parámetro
resultsCapacityInputdebe ser mayor que0.
La estructura XrRaycastHitResultANDROID se define de la siguiente manera:
typedef struct XrRaycastHitResultANDROID {
XrTrackableTypeANDROID type;
XrTrackableANDROID trackable;
XrPosef pose;
} XrRaycastHitResultANDROID;
Descripciones de los miembros
typees el XrTrackableTypeANDROID del elemento rastreable que golpeó el rayo.trackablees elXrTrackableANDROIDque golpeó el rayo de luz oXR_NULL_TRACKABLE_ANDROIDsi eltyperastreable eraXR_TRACKABLE_TYPE_DEPTH_ANDROID.posees el XrPosef que golpeó el rayo.
XrRaycastHitResultANDROID contiene los detalles de un hit de raycast.
XrRaycastHitResultANDROID::pose para un impacto de plano debe ser tal que X y Z sean paralelos al plano, y el eje Y sea normal al plano.
Tipo de hit rastreable |
Descripción |
|
Detecta superficies horizontales o verticales para determinar la profundidad y la orientación correctas de un punto. |
|
Usa la información de profundidad de toda la escena para determinar la profundidad y la orientación correctas de un punto. |
Uso válido (implícito)
- La extensión
XR_ANDROID_raycastdebe estar habilitada antes de usar XrRaycastHitResultANDROID. typedebe ser un valor válido de XrTrackableTypeANDROID.
Código de ejemplo para el raycasting
En el siguiente ejemplo de código, se muestra cómo realizar raycasts.
XrSession session; // previously initialized
XrTime updateTime; // previously initialized
XrSpace appSpace; // space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
XrPosef headPose; // latest pose of the HMD.
XrTrackableTrackerANDROID planeTracker; // tracker for plane trackables.
XrTrackableTrackerANDROID depthTracker; // tracker for depth trackables.
// Perform a raycast against multiple trackers.
XrTrackableTrackerANDROID trackers[] = {
&planeTracker,
&depthTracker,
};
XrRaycastInfoANDROID rayInfo = {XR_TYPE_RAYCAST_INFO_ANDROID};
rayInfo.trackerCount = sizeof(trackers) / sizeof(XrTrackableTrackerANDROID);
rayInfo.trackers = trackers;
rayInfo.origin = headPose.position;
rayInfo.trajectory = CalculateForwardDirectionFromHeadPose(headPose);
rayInfo.space = appSpace;
rayInfo.time = updateTime;
uint32_t totalHitResults = 0;
constexpr uint32 NUM_DESIRED_RESULTS = 2;
XrRaycastHitResultANDROID hitResult[NUM_DESIRED_RESULTS];
XrRaycastHitResultsANDROID hitResults = {XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID};
hitResults.maxResults = NUM_DESIRED_RESULTS;
hitResults.resultsCapacityInput = NUM_DESIRED_RESULTS;
hitResults.results = hitResult;
XrResult result = xrRaycastANDROID(session, &rayInfo, &hitResults);
if (result == XR_SUCCESS && hitResults.resultsCountOutput >= 1) {
// Hit results are returned in closest-to-farthest order in
// hitResults.results[0] .. hitResults.results[hitResults.resultsCountOutput - 1]
}
Nuevas constantes de enum
La enumeración XrStructureType se extiende con lo siguiente:
XR_TYPE_RAYCAST_INFO_ANDROIDXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
Nuevas estructuras
Funciones nuevas
Problemas
Historial de versiones
- Revisión 1, 2024-10-02 (Kenny Vercaemer)
- Descripción inicial de la extensión
OpenXR™ y el logotipo de OpenXR son marcas comerciales de The Khronos Group Inc. y están registradas como marca comercial en China, la Unión Europea, Japón y el Reino Unido.