Chaîne de nom
XR_ANDROID_raycast
Type d'extension
Extension d'instance
Numéro d'extension enregistré
464
Révision
1
Dépendances d'extension et de version
Date de dernière modification
2024-10-02
État de l'adresse IP
Aucune revendication d'adresse IP connue.
Contributeurs
Spencer Quin, Google
Nihav Jain, Google
John Pursey, Google
Jared Finder, Google
Levana Chen, Google
Kenny Vercaemer, Google
Présentation
Cette extension permet à l'application d'effectuer des raycasts sur les éléments de suivi de l'environnement. Les raycasts peuvent être utiles pour détecter les objets de l'environnement avec lesquels un rayon intersecterait. Exemple :
- Pour déterminer où un objet flottant tomberait lorsqu'il est lâché, utilisez un rayon vertical.
- Pour déterminer où un utilisateur regarde, utilisez un rayon de projection orienté vers l'avant.
Interroger les fonctionnalités de raycast compatibles
La fonction xrEnumerateRaycastSupportedTrackableTypesANDROID est définie comme suit :
XrResult xrEnumerateRaycastSupportedTrackableTypesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t trackableTypeCapacityInput,
uint32_t* trackableTypeCountOutput,
XrTrackableTypeANDROID* trackableTypes);
Descriptions des paramètres
instanceest l'instance Xr à partir de laquellesystemIda été récupéré.systemIdest l'XrSystemIddont les types de suivi compatibles pour le raycasting sont énumérés.trackableTypeCapacityInputcorrespond à la capacité detrackableTypes, ou à 0 pour récupérer la capacité requise.trackableTypeCountOutputest un pointeur vers le nombre de l'array ou un pointeur vers la capacité requise sitrackableTypeCapacityInputest insuffisant.trackableTypesest un pointeur vers un tableau de XrTrackableTypeANDROID, mais peut êtreNULLsitrackableTypeCapacityInputest0.
- Pour obtenir une description détaillée de la récupération de la taille
trackableTypesrequise, consultez la section Paramètres de taille de la mémoire tampon.
xrEnumerateRaycastSupportedTrackableTypesANDROID énumère les types de traceurs compatibles avec le traçage par rayon de la session en cours.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_raycastdoit être activée avant d'appeler xrEnumerateRaycastSupportedTrackableTypesANDROID. instancedoit être un identifiant XrInstance valide.trackableTypeCountOutputdoit être un pointeur vers une valeuruint32_t- Si
trackableTypeCapacityInputn'est pas0,trackableTypesdoit être un pointeur vers un tableau de valeurstrackableTypeCapacityInputXrTrackableTypeANDROID.
Codes de retour
XR_SUCCESS
XR_ERROR_VALIDATION_FAILUREXR_ERROR_RUNTIME_FAILUREXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_SYSTEM_INVALIDXR_ERROR_FUNCTION_UNSUPPORTED
Effectuer un raycast
La fonction xrRaycastANDROID est définie comme suit :
XrResult xrRaycastANDROID(
XrSession session,
const XrRaycastInfoANDROID* rayInfo,
XrRaycastHitResultsANDROID* results);
Descriptions des paramètres
sessionest l'XrSession qui effectue le raycast.rayInfoest l'XrRaycastInfoANDROID qui décrit le rayon à lancer.resultsest un pointeur vers XrRaycastHitResultsANDROID, qui reçoit les résultats du raycast.
L'application peut effectuer des raycasts en appelant xrRaycastANDROID.
- Si un raycast intersecte plus de traceurs que XrRaycastHitResultsANDROID::maxResults, l'environnement d'exécution doit renvoyer les résultats des intersections les plus proches de l'origine de rayon XrRaycastHitResultsANDROID.
- Si un raycast intersecte un élément traçable de type
XR_TRACKABLE_TYPE_ANDROID_PLANE, qui est subsumé par un autre plan, l'environnement d'exécution doit renvoyer le résultat de la collision uniquement pour le plan subsumant. - L'environnement d'exécution doit renvoyer les résultats des intersections dans l'ordre des plus proches aux plus éloignées à partir de XrRaycastInfoANDROID::origin le long du vecteur XrRaycastInfoANDROID::trajectory.
- L'environnement d'exécution doit renvoyer
XR_ERROR_TRACKABLE_TYPE_NOT_SUPPORTED_ANDROIDsi le type de suivi correspondant aux poignées XrTrackableTrackerANDROID dans XrRaycastInfoANDROID::trackers n'est pas énuméré par xrEnumerateRaycastSupportedTrackableTypesANDROID.
Utilisation valide (implicite)
- L'extension doit être activée avant d'appeler xrRaycastANDROID.
XR_ANDROID_raycast sessiondoit être un identifiant XrSession valide.rayInfodoit être un pointeur vers une structure XrRaycastInfoANDROID valide.resultsdoit être un pointeur vers une structure XrRaycastHitResultsANDROID.
Codes de retour
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 structure XrRaycastInfoANDROID est définie comme suit :
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;
Descriptions des membres
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.maxResultsest le nombre maximal de résultats à renvoyer pouruint32_t.trackerCountcorrespond au nombreuint32_tdu tableautrackers.trackersest le tableau de XrTrackableTrackerANDROID contre lequel le rayon projeté doit être testé.originest le XrVector3f à partir duquel le rayon est lancé.trajectorycorrespond au XrVector3f ciblé par le rayon.spaceest l'espace Xr dans lequel le rayon est lancé.timecorrespond à l'XrTimesur lequel le rayon est lancé.
La structure XrRaycastInfoANDROID décrit le rayon à lancer.
- Le tableau XrRaycastInfoANDROID::trackers peut contenir des traceurs de différents types.
- Le tableau XrRaycastInfoANDROID::trackers ne doit pas contenir plusieurs traceurs du même type, sinon l'environnement d'exécution doit renvoyer
XR_ERROR_VALIDATION_FAILURE.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_raycastdoit être activée avant d'utiliser XrRaycastInfoANDROID. typedoit êtreXR_TYPE_RAYCAST_INFO_ANDROID.nextdoit êtreNULLou un pointeur valide vers la structure suivante d'une chaîne de structures.trackersdoit être un pointeur vers un tableau de poignées XrTrackableTrackerANDROIDtrackerCountvalides.spacedoit être un gestionnaire XrSpace valide.- Le paramètre
trackerCountdoit être supérieur à0. spaceet les éléments detrackersdoivent avoir été créés, alloués ou récupérés à partir de la même XrSession.
La structure XrRaycastHitResultsANDROID est définie comme suit :
typedef struct XrRaycastHitResultsANDROID {
XrStructureType type;
void* next;
uint32_t resultsCapacityInput;
uint32_t resultsCountOutput;
XrRaycastHitResultANDROID* results;
} XrRaycastHitResultsANDROID;
Descriptions des membres
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante d'une chaîne de structures. Aucune de ces structures n'est définie dans OpenXR de base ni dans cette extension.resultsCapacityInputcorrespond à la capacité du tableauresults, ou à 0 pour indiquer une requête visant à récupérer la capacité requise.resultsCountOutputest un pointeur vers le nombre d'resultsécrites ou un pointeur vers la capacité requise siresultsCapacityInputest insuffisant.resultsest un pointeur vers un tableau de structures XrRaycastHitResultANDROID. Il peut êtreNULLsiresultsCapacityInputest défini sur 0.- Pour obtenir une description détaillée de la récupération de la taille
resultsrequise, consultez la section Paramètres de taille de la mémoire tampon.
XrRaycastHitResultsANDROID contient le tableau des résultats d'un rayon.
L'environnement d'exécution doit définir resultsCountOutput comme inférieur ou égal à XrRaycastInfoANDROID::maxResults.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_raycastdoit être activée avant d'utiliser XrRaycastHitResultsANDROID. typedoit êtreXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID.nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures.resultsdoit être un pointeur vers un tableau de structuresresultsCapacityInputbasées sur XrRaycastHitResultANDROID.- Le paramètre
resultsCapacityInputdoit être supérieur à0.
La structure XrRaycastHitResultANDROID est définie comme suit :
typedef struct XrRaycastHitResultANDROID {
XrTrackableTypeANDROID type;
XrTrackableANDROID trackable;
XrPosef pose;
} XrRaycastHitResultANDROID;
Descriptions des membres
typecorrespond au XrTrackableTypeANDROID de l'objet trackable touché par le raycast.trackablecorrespond à l'élémentXrTrackableANDROIDque le raycast a touché, ou àXR_NULL_TRACKABLE_ANDROIDsi l'élémenttypetraçable étaitXR_TRACKABLE_TYPE_DEPTH_ANDROID.poseest l'XrPosef que le raycast a touché.
XrRaycastHitResultANDROID contient les détails d'un contact de raycast.
La XrRaycastHitResultANDROID::pose pour une collision avec un plan doit être telle que X et Z soient parallèles au plan, et que l'axe Y soit normal au plan.
Type d'appel traçable |
Description |
|
Frappe des surfaces horizontales et/ou verticales pour déterminer la profondeur et l'orientation correctes d'un point. |
|
Utilise les informations de profondeur de l'ensemble de la scène pour déterminer la profondeur et l'orientation correctes d'un point. |
Utilisation valide (implicite)
- L'extension
XR_ANDROID_raycastdoit être activée avant d'utiliser XrRaycastHitResultANDROID. typedoit être une valeur XrTrackableTypeANDROID valide.
Exemple de code pour le raycasting
L'exemple de code suivant montre comment effectuer des 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]
}
Nouvelles constantes d'énumération
L'énumération XrStructureType est étendue avec :
XR_TYPE_RAYCAST_INFO_ANDROIDXR_TYPE_RAYCAST_HIT_RESULTS_ANDROID
Nouvelles structures
Nouvelles fonctions
Problèmes
Historique des versions
- Révision 1, 02/10/2024 (Kenny Vercaemer)
- Description initiale de l'extension
OpenXR™ et le logo OpenXR sont des marques appartenant à The Khronos Group Inc. et sont enregistrés en tant que marques en Chine, dans l'Union européenne, au Japon et au Royaume-Uni.