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.

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top