La façon la plus rapide pour calculer le point de triangle distance en 3D?
Une évidence, la méthode de calcul de la distance minimale d'un point à une 3D triangle a pour projet le point sur le plan de la triangle, déterminer les coordonnées barycentriques du point résultant, et de les utiliser pour déterminer si le point projeté se trouve dans le triangle. Si non, pince à ses coordonnées barycentriques d'être dans l'intervalle [0,1], et qui vous donne le point le plus proche qui se trouve à l'intérieur du triangle.
Est-il un moyen pour accélérer le processus ou de simplifier quelque peu?
Serrage les coordonnées barycentriques ne donne pas la projection orthogonale de la bordure la plus proche et, par conséquent, pas à la bonne distance si un point sur les bords (sans les sommets) est la plus proche.
OriginalL'auteur batty | 2010-05-27
Vous devez vous connecter pour publier un commentaire.
Il existe différentes approches pour trouver la distance d'un point P0 à un triangle P1,P2,P3.
La méthode 3D.
Projet le point sur le plan de la triangle et utiliser les coordonnées barycentriques ou d'un autre moyen de trouver le point le plus proche dans le triangle. La distance est trouvé dans la manière habituelle.
2D par la méthode. Appliquer une translation/rotation pour les points de sorte que P1 est sur l'origine, la P2 est sur l'axe des z, P3 dans le plan yz. La Projection est le point P0 est trivial (la négligence de la coordonnée x). Il en résulte un problème 2D. À l'aide de la pointe équation, il est possible de déterminer le sommet le plus proche ou le bord du triangle. Calcul de la distance est alors facile comme bonjour.
Ce papier compare les performances des deux, avec la 2D méthode gagnante.
OriginalL'auteur Il-Bhima
En supposant que vous êtes en utilisant un des algorithmes rapides, le seul moyen de l'accélérer, c'est quand que vous faites beaucoup de mesures sur un grand nombre de triangles. Dans ce cas, vous pouvez garder beaucoup de quantités précalculées dans "edge" ou "remontage" des structures. Au lieu de stocker les 3 points, vous pouvez stocker des maillages composés de bord structures. Projection devient alors très rapide et barycentriques tests peuvent être codées de sorte qu'ils sont branche-prévisible.
La vraie clé est de garder tout en mémoire cache. Les transformateurs peuvent faire MUL et DIV dans près de 1 cycle d'horloge ainsi, la mémoire est généralement le goulot d'étranglement.
Aussi, envisager d'écrire l'algo en SSE3 ou quelque chose de semblable (comme De Mono SIMD soutien). C'est un travail, mais vous pouvez généralement faire une couple de triangles à un moment si vous pensez assez dur à ce sujet.
Je vais essayer de trouver quelques articles sur le sujet, mais vous pouvez Google pour "Ray Maillage Intersection". Que va apporter l'excellent travail depuis les années 80 et 90, quand les gens ont travaillé dur sur l'optimisation de ce genre de choses.
OriginalL'auteur Frank Krueger
Je vais conduire avec mes résultats de test.
Le cas de test de code et la mise en œuvre est en C#
La mise en œuvre du code est délicat comme j'ai un certain nombre de classes du framework. J'espère que vous pouvez traiter cette pseudo-code et sortez de l'algorithme. Le raw types de vecteurs sont de https://www.nuget.org/packages/System.DoubleNumerics/.
Noter que certaines propriétés du Triangle peut être mis en cache pour améliorer les performances.
Noter que pour le retour au point le plus proche ne nécessite pas de racines carrées et ne nécessite pas de transformer le problème de la 2D.
L'algorithme d'abord rapidement teste si le point de test est plus proche d'un point de fin de la région. Si cela n'est pas concluant, il teste ensuite le bord externe des régions, un par un. Si les tests échouent, alors le point est à l'intérieur du triangle. Notez que pour les sélectionnés au hasard des points de mesure à partir du triangle, il est plus probable que le point le plus proche sera un point d'angle du triangle.
Et de la structure du bord
Et le plan de la structure
Pouvez-vous décrire comment vous faites votre retour Triplan.Projet( p ); ? J'ai essayer avec votre code de retour (Vector3.ProjectOnPlane(p, TriNorm));, mais il ne fonctionne pas bien
Ok, considère l'ajout de cette fonction dans l'Avion struct:
public Vector3 Project(Vector3 randomPointInPlane, Vector3 normalPlane, Vector3 pointToProject) { Vector3 v = pointToProject - randomPointInPlane; Vector3 d = Vector3.Project(v, normalPlane.normalized); Vector3 projectedPoint = pointToProject - d; return (projectedPoint); }
OriginalL'auteur bradgonesurfing