Ich nehme Ihr 3D-Polygon eben ist (sonst ist es nicht wirklich ein Polygon und es ist nicht gut definiert). Daher können Sie eine orthonormale 2D-Basis für diese Ebene finden. Das bedeutet, dass Sie jeden beliebigen 2D-Triangulationsalgorithmus verwenden können (Sie können viele C# -Implementierungen im Internet finden) und mit Ihrer orthonormalen Basis zu 3D zurückkehren. Auf diese Weise erhalten Sie 3D-Dreiecke und können problemlos Ihren Ray-Polygon-Schnitttest durchführen, indem Sie mehrere Ray-Triangle-Schnitttests ausführen.
Eine andere Möglichkeit besteht darin, eine Ray-Plane-Schnittpunktberechnung durchzuführen. Nimm den Schnittpunkt P, repräsentiere ihn mit 2D Koordinaten mit der obigen orthonormalen Basis. Stellen Sie außerdem wie in der vorherigen Lösung Ihr Polygon in 2D auf derselben Grundlage dar. Führen Sie dann einen 2D-Algorithmus "is point in polygon" aus und Sie erhalten Ihre Ergebnisse.
aktualisieren: Hier ist die Mathematik Sie zwei beliebige Punkte auf der Ebene p1 nehmen kann, p2 (zum Beispiel zwei der Punkte des Polygons) und nehmen Sie den Vektor u = p2 - p1. Normalisieren Sie es und es ist der erste Basisvektor. Dann nimmst du das normale N des Flugzeugs und berechne v = cross_product (u, N) und normalisierst v. Dies ist der zweite Basisvektor. Beachten Sie, dass beide Vektoren Einheitslänge haben und orthogonal zueinander sind. Sie bilden daher eine orthonormale Basis.
Definieren Sie nun p1 als Ursprung der Ebene. Dann wird die Übersetzung 2D von einem beliebigen Punkt Q auf dem Polygon (q einen der Eckpunkte des Polygons sein kann, oder jeder andere Punkt auf der Fläche des Polygons):
x = dot_product(q - p1, u)
y = dot_product(q - p1, v)
Hier x, y der Punkt des 2D-Koordinaten.
So, nachdem alles in 2D übersetzt und 2D-Algorithmen tun können Sie einen beliebigen 2D-Punkt (x, y) zurück in 3D wie folgt übersetzen:
q = p1 + x * u + y * v
hier * ist der Skalar-Vektor-Produkt (x, y sind die Skalare und u, v sind die Vektoren).
Alex.
ist es möglich, es ohne 3D-2D Orthonormal Transformation zu tun? Und gibt es einen Hinweis auf die orthonormale Transformation? Ich würde es lieben, sie zu lesen, danke! – Graviton
Ich werde die Antwort in die Nachricht selbst schreiben. Kommentare haben schlechte Formatierungsfähigkeiten :) – Alex
danke. Das ist ein schönes – Graviton