Wie man ein ebenes Polygon auf einer Ebene in 3D-Raum projiziert
-
21-09-2019 - |
Frage
Ich möchte meine Polygon entlang eines Vektors zu einer Ebene im 3D-Raum projizieren. Ich würde vorzugsweise eine einzige Transformationsmatrix, dies zu tun, aber ich weiß nicht, wie eine Matrix dieser Art zu bauen.
Bei
- die Flugzeugparameter (ax + by + cz + d)
- die Weltkoordinaten meiner Polygon. Wie in der der Überschrift angegeben, sind alle Eckpunkte meines Polygon liegen in einer anderen Ebene.
- der Richtungsvektor, entlang welcher mein Polygon zu projizieren (zur Zeit des Polygons Ebene des Normalvektor)
Ziel -a 4x4 Transformationsmatrix, die die erforderliche Projektions ausführt,
oder
- ein Einblick darüber, wie man selbst bauen
UPDATE
Vielen Dank für die Antwort, es funktioniert wie vorgesehen.
Ein Wort der Vorsicht zu den Menschen, die dies gefunden: Wenn die Ebene der Projektion des normalen parallel zur Projektionsvektor, werden der Nenner D (fast) 0, so seltsame Dinge zu vermeiden, geschieht, eine Art von Behandlung für dieser Sonderfall erforderlich ist. Ich löste es durch Prüfen, ob D <1e-5, und wenn ja, nur übersetzen meinen Polygon entlang hte Extrusionsvektor.
Lösung
Es sei einer der Polygon-Scheitelpunkte ist (x0, y0, z0)
, und der Richtungsvektor ist (dx,dy,dz)
.
Ein Punkt auf der Linie der Projektion ist. (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)
Sie möchten den Schnittpunkt dieser Linie mit der Ebene finden, so stecken Sie es in die Ebene Gleichung ax+by+cz+d = 0
und lösen für t:
t = (-a*x0 - b*y0 - c*z0 - d) / (a*dx + b*dy + c*dz)
Und dann haben Sie Ihr Ziel Vertex. x = x0+dx*t
, etc
Da dies eine affine Transformation ist, kann es durch eine 4x4-Matrix durchgeführt werden. Sie sollten die Matrixelemente durch Schreiben der drei Gleichungen für x, y, z als Funktion von x0, y0, z0 und wobei die Koeffizienten bestimmen können.
Zum Beispiel für x:
x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx) / D
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D
Wo D = a*dx + b*dy + c*dz
ist der Nenner von oben. y und z in ähnlicher Weise arbeiten.
Ergebnismatrix:
1-a*dx/D -b*dx/D -c*dx/D -d*dx/D
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D
0 0 0 1
(Hinweis: Auf Direct3D diese Matrix umgesetzt werden soll, weil es Zeilenvektoren anstelle von Spaltenvektoren verwendet).