Existe-t-il un algorithme «le plus efficace» pour la détection de collision AABB vs Ray?
Je suis récemment tombé sur l'algorithme de collision Arvo AABB vs Sphere d'Arvo, et je me demande s'il existe un algorithme similaire à cet effet.
Une condition préalable à cet algorithme est que je dois avoir la possibilité d’interroger le résultat sur la distance entre l’origine du rayon et le point de collision. Cela dit, s’il existe un autre algorithme plus rapide qui ne renvoie pas la distance, alors en plus d’en afficher un qui le fait, il serait également très utile d’afficher cet algorithme.
Indiquez également quel est l'argument de retour de la fonction et comment vous l'utilisez pour renvoyer une distance ou un cas «sans collision». Par exemple, existe-t-il un paramètre de sortie pour la distance ainsi qu’une valeur de retour booléenne? ou retourne-t-il simplement un float avec la distance, vs une valeur de -1 pour aucune collision?
(Pour ceux qui ne connaissent pas: AABB = Axis Bounding Box Alignement)
la source
Réponses:
Andrew Woo, qui, avec John Amanatides, a développé l'algorithme de Raymarching (DDA) utilisé de manière omniprésente dans les traceurs de rayons, a écrit "Fast Ray-Box Intersection" (source alternative ici ), publié dans Graphics Gems, 1990, p. 395-396. Plutôt que d'être construit spécifiquement pour l'intégration via une grille (par exemple, un volume de voxel) comme DDA (voir la réponse de zacharmarz), cet algorithme est spécifiquement adapté aux mondes qui ne sont pas répartis de manière uniforme, tels que votre monde de polyhèdres typique trouvé dans la plupart des environnements 3D. Jeux.
L'approche prend en charge la 3D et effectue éventuellement le retrait de la face arrière. L'algorithme est dérivé des mêmes principes d'intégration que ceux utilisés dans les DDA, il est donc très rapide. Plus de détails peuvent être trouvés dans le volume original Graphics Gems (1990).
De nombreuses autres approches spécifiques à Ray-AABB sont disponibles sur realtimerendering.com .
EDIT: Une approche alternative, sans branche - qui serait souhaitable à la fois sur le processeur graphique et le processeur - peut être trouvée ici .
la source
Ce que j'ai utilisé précédemment dans mon raytracer:
Si cela retourne vrai, c'est intersectant. S'il renvoie faux, ce n'est pas intersection.
Si vous utilisez plusieurs fois le même rayon, vous pouvez pré-calculer
dirfrac
(division uniquement dans le test d'intersection complet). Et puis c'est vraiment rapide. Et vous avez également la longueur du rayon jusqu'à l'intersection (stockée danst
).la source
Personne n'a décrit l'algorithme ici, mais l' algorithme Graphics Gems est simplement:
En utilisant le vecteur de direction de votre rayon, déterminez quels 3 des 6 avions candidats seraient touchés en premier . Si votre vecteur de direction de rayon (non normalisé) est (-1, 1, -1), les 3 plans pouvant être touchés sont + x, -y et + z.
Trouvez la valeur t de l'intersection pour chacun des 3 plans candidats. Acceptez l'avion qui obtient la plus grande valeur t comme l'avion touché et vérifiez qu'il est dans la case . Le diagramme dans le texte montre clairement ceci:
Ma mise en oeuvre:
la source
Voici mon intersection 3D rayon / AABox que j'utilise:
la source
tnear
ettfar
?Voici une version optimisée de ce qui précède que j'utilise pour le GPU:
la source
Une des choses que vous voudrez peut-être étudier est de rastériser le recto et le verso de votre cadre de sélection dans deux mémoires tampons séparées. Rendez les valeurs x, y, z en tant que rgb (cela fonctionne mieux pour un cadre de sélection avec un coin à (0,0,0) et le contraire à (1,1,1).
Évidemment, son utilisation est limitée, mais je l’ai trouvé génial pour le rendu de volumes simples.
Pour plus de détails et code:
http://www.daimi.au.dk/~trier/?page_id=98
la source
Voici le code de ligne vs AABB que j'utilise:
la source
Cela semble similaire au code publié par zacharmarz.
J'ai obtenu ce code dans le livre "Détection de collision en temps réel" de Christer Ericson dans la section "5.3.3 Rayons ou segments se croisant contre la boîte".
la source
Je suis surpris de voir que personne n'a mentionné la méthode des dalles sans branches de Tavian
Explication complète: https://tavianator.com/fast-branchless-raybounding-box-intersections/
la source
J'ai ajouté à @zacharmarz answer pour traiter lorsque l'origine du rayon est à l'intérieur de l'AABB. Dans ce cas, tmin sera négatif et derrière le rayon de sorte que tmax est la première intersection entre le rayon et AABB.
la source