String de nome
XR_ANDROID_raycast
Tipo de extensão
Extensão de instância
Número de extensão registrado
464
Revisão
1
Dependências de extensão e versão
Data da última modificação
2024-10-02
Status do IP
Nenhuma reivindicação de IP conhecida.
Colaboradores
Spencer Quin, Google
Nihav Jain, Google
John Pursey, Google
Jared Finder, Google
Levana Chen, Google
Kenny Vercaemer, Google
Visão geral
Essa extensão permite que o aplicativo execute raycasts contra rastreáveis no ambiente. Os raycasts podem ser úteis para detectar objetos no ambiente com que um raio se cruzaria. Exemplo:
- Para determinar onde um objeto flutuante cairia quando lançado, use um raycast vertical.
- Para determinar para onde um usuário está olhando, use um raycast voltado para a frente.
Consultar recursos de raycast compatíveis
A função xrEnumerateRaycastSupportedTrackableTypesANDROID é definida como:
XrResult xrEnumerateRaycastSupportedTrackableTypesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t trackableTypeCapacityInput,
uint32_t* trackableTypeCountOutput,
XrTrackableTypeANDROID* trackableTypes);
Descrições dos parâmetros
instance
é a XrInstance de ondesystemId
foi extraído.systemId
é oXrSystemId
cujos tipos rastreáveis com suporte para raycasting estão sendo enumerados.trackableTypeCapacityInput
é a capacidade dotrackableTypes
ou 0 para recuperar a capacidade necessária.trackableTypeCountOutput
é um ponteiro para a contagem da matriz ou um ponteiro para a capacidade necessária casotrackableTypeCapacityInput
seja insuficiente.trackableTypes
é um ponteiro para uma matriz de XrTrackableTypeANDROID, mas pode serNULL
setrackableTypeCapacityInput
for0
.
- Consulte a seção Parâmetros de tamanho do buffer para conferir uma descrição detalhada de
como recuperar o tamanho
trackableTypes
necessário.
xrEnumerateRaycastSupportedTrackableTypesANDROID enumera os tipos rastreáveis que oferecem suporte a raycasting pela sessão atual.
Uso válido (implícito)
- A extensão
XR_ANDROID_raycast
precisa ser ativada antes de chamar xrEnumerateRaycastSupportedTrackableTypesANDROID. instance
precisa ser um identificador XrInstance válidotrackableTypeCountOutput
precisa ser um ponteiro para um valoruint32_t
- Se
trackableTypeCapacityInput
não for0
,trackableTypes
precisa ser um ponteiro para uma matriz de valorestrackableTypeCapacityInput
XrTrackableTypeANDROID
Códigos de retorno
XR_SUCCESS
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SIZE_INSUFFICIENT
XR_ERROR_SYSTEM_INVALID
XR_ERROR_FUNCTION_UNSUPPORTED
Realizar um raycast
A função xrRaycastANDROID é definida como:
XrResult xrRaycastANDROID(
XrSession session,
const XrRaycastInfoANDROID* rayInfo,
XrRaycastHitResultsANDROID* results);
Descrições dos parâmetros
session
é a XrSession que executa o raycast.rayInfo
é o XrRaycastInfoANDROID que descreve o feixe a ser enviado.results
é um ponteiro para o XrRaycastHitResultsANDROID que recebe os resultados do raycast.
O aplicativo pode executar raycasts chamando xrRaycastANDROID.
- Se um raycast cruzar mais elementos rastreáveis do que XrRaycastHitResultsANDROID::maxResults, o ambiente de execução precisa retornar os resultados de acerto mais próximos de XrRaycastHitResultsANDROID::origin do raio.
- Se um raycast cruzar um rastreável do tipo
XR_TRACKABLE_TYPE_ANDROID_PLANE
, que é absorvido por outro plano, o ambiente de execução precisa retornar o resultado do hit apenas para o plano de absorção. - O ambiente de execução precisa retornar os resultados de acertos na ordem mais próximo-mais distante de XrRaycastInfoANDROID::origin ao longo do vetor XrRaycastInfoANDROID::trajectory.
- O ambiente de execução precisa retornar
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID
se o tipo rastreável correspondente aos identificadores XrTrackableTrackerANDROID em XrRaycastInfoANDROID::trackers não for enumerado por xrEnumerateRaycastSupportedTrackableTypesANDROID.
Uso válido (implícito)
- A extensão
XR_ANDROID_raycast
precisa ser ativada antes de chamar xrRaycastANDROID. session
precisa ser um identificador XrSession válidorayInfo
precisa ser um ponteiro para uma estrutura XrRaycastInfoANDROID válida.results
precisa ser um ponteiro para uma estrutura XrRaycastHitResultsANDROID.
Códigos de retorno
XR_SUCCESS
XR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTED
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROID
XR_ERROR_VALIDATION_FAILURE
XR_ERROR_RUNTIME_FAILURE
XR_ERROR_HANDLE_INVALID
XR_ERROR_INSTANCE_LOST
XR_ERROR_SESSION_LOST
XR_ERROR_OUT_OF_MEMORY
XR_ERROR_LIMIT_REACHED
XR_ERROR_POSE_INVALID
XR_ERROR_TIME_INVALID
XR_ERROR_FEATURE_UNSUPPORTED
A estrutura XrRaycastInfoANDROID é definida como:
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;
Descrições dos participantes
type
é o XrStructureType dessa estrutura.next
éNULL
ou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no núcleo do OpenXR ou nesta extensão.maxResults
é o número máximo de resultados a serem retornados pelauint32_t
.trackerCount
é a contagem deuint32_t
da matriztrackers
.trackers
é a matriz de XrTrackableTrackerANDROID que o raio fundido deve ser testado.origin
é o XrVector3f de onde o raio é lançado.trajectory
é o XrVector3f em que o raio é direcionado.space
é o XrSpace em que o raio é lançado.time
é oXrTime
em que o raio é lançado.
A estrutura XrRaycastInfoANDROID descreve o feixe a ser transmitido.
- A matriz XrRaycastInfoANDROID::trackers pode conter rastreadores de diferentes tipos.
- A matriz XrRaycastInfoANDROID::trackers não pode conter vários
rastreadores do mesmo tipo. Caso contrário, o ambiente de execução precisa retornar
XR_ERROR_VALIDATION_FAILURE
.
Uso válido (implícito)
- A extensão
XR_ANDROID_raycast
precisa ser ativada antes de usar XrRaycastInfoANDROID. type
precisa serXR_TYPE_RAYCAST_INFO_ANDROID
next
precisa serNULL
ou um ponteiro válido para a próxima estrutura em uma cadeia de estrutura.trackers
precisa ser um ponteiro para uma matriz de identificadores válidos XrTrackableTrackerANDROID detrackerCount
.space
precisa ser um identificador XrSpace válido.- O parâmetro
trackerCount
precisa ser maior que0
space
e os elementos detrackers
precisam ter sido criados, alocados ou recuperados da mesma XrSession.
A estrutura XrRaycastHitResultsANDROID é definida como:
typedef struct XrRaycastHitResultsANDROID {
XrStructureType type;
void* next;
uint32_t resultsCapacityInput;
uint32_t resultsCountOutput;
XrRaycastHitResultANDROID* results;
} XrRaycastHitResultsANDROID;
Descrições dos participantes
type
é o XrStructureType dessa estrutura.next
éNULL
ou um ponteiro para a próxima estrutura em uma cadeia de estruturas. Nenhuma dessas estruturas é definida no núcleo do OpenXR ou nesta extensão.resultsCapacityInput
é a capacidade da matrizresults
ou 0 para indicar uma solicitação para recuperar a capacidade necessária.resultsCountOutput
é um ponteiro para a contagem deresults
gravada ou um ponteiro para a capacidade necessária casoresultsCapacityInput
seja insuficiente.results
é um ponteiro para uma matriz de estruturas XrRaycastHitResultANDROID. Ele pode serNULL
seresultsCapacityInput
for 0.- Consulte a seção Parâmetros de tamanho do buffer para conferir uma descrição detalhada de
como recuperar o tamanho
results
necessário.
O XrRaycastHitResultsANDROID contém a matriz de acertos de um raycast.
O ambiente de execução precisa definir resultsCountOutput
para ser menor ou igual a
XrRaycastInfoANDROID::maxResults.
Uso válido (implícito)
- A extensão
XR_ANDROID_raycast
precisa ser ativada antes de usar XrRaycastHitResultsANDROID. type
precisa serXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
next
precisa serNULL
ou um ponteiro válido para a próxima estrutura em uma cadeia de estrutura.results
precisa ser um ponteiro para uma matriz de estruturasresultsCapacityInput
XrRaycastHitResultANDROID-based- O parâmetro
resultsCapacityInput
precisa ser maior que0
A estrutura XrRaycastHitResultANDROID é definida como:
typedef struct XrRaycastHitResultANDROID {
XrTrackableTypeANDROID type;
XrTrackableANDROID trackable;
XrPosef pose;
} XrRaycastHitResultANDROID;
Descrições dos participantes
type
é o XrTrackableTypeANDROID do rastreável que o raycast atingiu.trackable
é oXrTrackableANDROID
que o raycast atingiu ouXR_NULL_TRACKABLE_ANDROID
se otype
rastreável foiXR_TRACKABLE_TYPE_DEPTH_ANDROID
.pose
é o XrPosef que o raycast atingiu.
O XrRaycastHitResultANDROID contém os detalhes de um hit de raycast.
O XrRaycastHitResultANDROID::pose para um acerto de plano precisa ser de modo que X e Z sejam paralelos ao plano, e o eixo Y seja normal ao plano.
Tipo de hit rastreável |
Descrição |
|
Bate em superfícies horizontais e/ou verticais para determinar a profundidade e a orientação corretas de um ponto. |
|
Usa informações de profundidade de toda a cena para determinar a profundidade e a orientação corretas de um ponto. |
Uso válido (implícito)
- A extensão
XR_ANDROID_raycast
precisa ser ativada antes de usar XrRaycastHitResultANDROID. type
precisa ser um valor válido de XrTrackableTypeANDROID
Exemplo de código para raycasting
O exemplo de código a seguir demonstra como 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]
}
Novas constantes de tipo enumerado
A enumeração XrStructureType foi ampliada com:
XR_TYPE_RAYCAST_INFO_ANDROID
XR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
Novas estruturas
Novas funções
Problemas
Histórico de versões
- Revisão 1, 02/10/2024 (Kenny Vercaemer)
- Descrição inicial da extensão