Schnellste Weg, um zu berechnen, Punkt-zu-Dreieck-Distanz in 3D?
Eine naheliegende Methode zur Berechnung des minimalen Abstand von einem Punkt zu einem 3D-Dreieck ist auf den Punkt auf die Ebene des Dreiecks, ermitteln die barycentric Koordinaten des resultierenden Punkt, und verwenden Sie Sie, um zu bestimmen, ob der projizierte Punkt liegt innerhalb des Dreiecks. Wenn nicht, klemmt Ihr die barycentric Koordinaten im Bereich [0,1], und das gibt dir den nächsten Punkt liegt innerhalb des Dreiecks.
Gibt es eine Möglichkeit zur Beschleunigung oder Vereinfachung es irgendwie?
- Die Klemmung der barycentric coordinates nicht geben die orthogonale Projektion auf die nächstgelegene Kante und daher nicht den richtigen Abstand, wenn Sie einen Punkt am Rand (ohne Eckpunkte) am nächsten ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es unterschiedliche Ansätze zu finden, den Abstand zwischen einem Punkt P0 zu einem Dreieck P1,P2,P3.
Die 3D-Methode.
Projekt der Punkt auf der Ebene des Dreiecks, und verwenden Sie barycentric coordinates oder einige andere Mittel zu finden, den nächsten Punkt im Dreieck. Der Abstand ist in der üblichen Weise.
Die 2D-Methode. Anwenden einer translation/rotation um die Punkte so, daß P1 ist der Ursprung, P2 auf der z-Achse, P3 in der yz-Ebene. Projektion ist der Punkt P0 ist trivial, (Vernachlässigung der x-Koordinate). Dies führt zu einem 2D-problem. Mithilfe des edge-Gleichung ist es möglich zu bestimmen, die am nächsten Eckpunkt oder Kante des Dreiecks. Die Berechnung der Entfernung ist dann easy-peasy.
Diese Papier vergleicht die Leistung der beiden mit der 2D-Methode zu gewinnen.
Vorausgesetzt, Sie verwenden eine der bekannten schnellen algorithmen, die einzige Möglichkeit es zu beschleunigen ist, wenn Sie tun eine Menge von Messungen, die auf eine Menge von Dreiecken. In diesem Fall können Sie halten eine Menge von Mengen vorausberechnete in "edge" oder "gewundene" Strukturen. Statt der Speicherung der 3 Punkte, die Sie speichern meshes bestehend aus edge-Strukturen. Die Projektion wird dann sehr schnell und barycentric tests können codiert werden, so dass Sie Zweig-berechenbare.
Der Schlüssel ist es, nur halten Sie alles im cache. Prozessoren können tun, MUL und DIV, die in fast 1 Uhr Zyklus so Speicher ist in der Regel der Engpass.
Bedenken Sie auch, das schreiben der algo in SSE3 oder etwas ähnliches (wie Mono-SIMD-Unterstützung). Es ist Arbeit, aber Sie können in der Regel tun, ein paar Dreiecke in einer Zeit, wenn Sie denken, hart genug, um es.
Werde ich versuchen zu finden, einige Beiträge zum Thema, aber möchten Sie vielleicht, um Google nach "Ray Mesh-Kreuzung". Das bringt die tolle Arbeit, die aus den 80er und 90er Jahren, wenn die Menschen arbeiteten hart an der Optimierung dieses Zeug.