Hoihoi! (muss mich nur wieder mal melden, sonst verstaubt mein Profil noch
)
Eins vorweg: es geht nicht ums Programmieren, sonder um die Theorie dahinter.
Ich bin gerade dabei (arbeitsbedingt) CorelDraw mit einem 3D-Modus auszustatten. Dafür habe ich mir eine kleine vba-Test-Engine zusammengebastelt, welche die grundlegenden Operationen beherscht:
- Erstellung von Translations-, Skalierungs- und Rotationsmatrizen
- Vektor in homogene 1x4 Matrix umwandeln
- Matrixaddition und -multiplikation
Ich habe im Internet zahlreiche Referenzen gefunden, die mir diese Engine möglich machten.
Zu Probezwecken wandle ich die Koordinaten eines Würfels in einzelne homogene Matrizen um. Diese werden dann nacheinander mit der View- und Rotationsmatrix multipliziert. Aus den 1x4-Ergebnis-Matrizen der Eckpunkte nehm ich mir die x und y Koordinaten raus, an denen ich dann in CorelDraw die Punkte einzeichne. Die Matrizen der Würfel-Punkte sowie die Matrix der View bleiben immer gleich. Die Rotationsmatrix wird je nachdem, um welche Achse gedreht werden soll, mit 1 Grad Plus/Minus erzeugt. Funktioniert eigentlich auch ganz gut. Nur bei mir rotiert der Würfel. Ich möchte aber, dass sich die Camera/View um den Würfel bewegt. Ich habe leider immer noch nicht genau verstanden, in welcher Reihenfolge die Matrizen zu multiplizieren sind, um gewisse Ergebnisse (wie eben das Rotieren der View) zu erziehlen. Zudem bin ich mir nicht sicher, ob meine Methode zum Rückkonvertieren von 3D zu 2D einwandfrei ist.
Wenn mir bitte die 3D-Profis unter euch die Theorie zu:
- Reihenfolge Multiplikation Projektionsmatrizen
- Konvertieren 3D-Matrix zu 2D-Vektor
erklären, oder mir gute Internetseiten/Referenzen empfehlen könnten, wäre ich sehr dankbar. Bitte wenn möglich ohne Mathematik-Kauderwelsch wie auf Wikipedia (de.wikipedia.org/wiki/Projektionsmatrix). Sprache wäre gleich, solange: de, en, it;
Ich möchte die Theorie dahinter verstehen, nicht, wie ich es umsetzen muss.
ps: sorry, wusste nicht wo ich dieses Thema am Besten hinpacken sollte: andere Programmiersprachen, Smalltalk, (Expertenrunde ist nur GM bezogen). Einfach verschieben, wenns nicht passt.
) Eins vorweg: es geht nicht ums Programmieren, sonder um die Theorie dahinter.
Ich bin gerade dabei (arbeitsbedingt) CorelDraw mit einem 3D-Modus auszustatten. Dafür habe ich mir eine kleine vba-Test-Engine zusammengebastelt, welche die grundlegenden Operationen beherscht:
- Erstellung von Translations-, Skalierungs- und Rotationsmatrizen
- Vektor in homogene 1x4 Matrix umwandeln
- Matrixaddition und -multiplikation
Ich habe im Internet zahlreiche Referenzen gefunden, die mir diese Engine möglich machten.
Zu Probezwecken wandle ich die Koordinaten eines Würfels in einzelne homogene Matrizen um. Diese werden dann nacheinander mit der View- und Rotationsmatrix multipliziert. Aus den 1x4-Ergebnis-Matrizen der Eckpunkte nehm ich mir die x und y Koordinaten raus, an denen ich dann in CorelDraw die Punkte einzeichne. Die Matrizen der Würfel-Punkte sowie die Matrix der View bleiben immer gleich. Die Rotationsmatrix wird je nachdem, um welche Achse gedreht werden soll, mit 1 Grad Plus/Minus erzeugt. Funktioniert eigentlich auch ganz gut. Nur bei mir rotiert der Würfel. Ich möchte aber, dass sich die Camera/View um den Würfel bewegt. Ich habe leider immer noch nicht genau verstanden, in welcher Reihenfolge die Matrizen zu multiplizieren sind, um gewisse Ergebnisse (wie eben das Rotieren der View) zu erziehlen. Zudem bin ich mir nicht sicher, ob meine Methode zum Rückkonvertieren von 3D zu 2D einwandfrei ist.
Wenn mir bitte die 3D-Profis unter euch die Theorie zu:
- Reihenfolge Multiplikation Projektionsmatrizen
- Konvertieren 3D-Matrix zu 2D-Vektor
erklären, oder mir gute Internetseiten/Referenzen empfehlen könnten, wäre ich sehr dankbar. Bitte wenn möglich ohne Mathematik-Kauderwelsch wie auf Wikipedia (de.wikipedia.org/wiki/Projektionsmatrix). Sprache wäre gleich, solange: de, en, it;
Ich möchte die Theorie dahinter verstehen, nicht, wie ich es umsetzen muss.
ps: sorry, wusste nicht wo ich dieses Thema am Besten hinpacken sollte: andere Programmiersprachen, Smalltalk, (Expertenrunde ist nur GM bezogen). Einfach verschieben, wenns nicht passt.
"Es gibt nie ein glückliches Ende, denn es endet nichts." - Schmendrick


). Zum Start meiner Engine generiere ich mir eine View-Matrix, die einzelnen Matrizen für die Objektpunkte und eine Default-Rotations-Matrix. Eine Welt-Matrix hab ich mir mal gespart, da das Objekt in der Welt ja nicht geändert wird. Mit jeder Änderung des Betrachtungswinkels wird die Rotations-Matrix erneuert. Dann multipliziere ich die View-Matrix mit der Rotations-Matrix und ersetze damit die alte View-Matrix. Diese neue View-Matrix multipliziere ich dann mit den einzelnen Punkten des Würfels. Der Würfel rotiert einwandfrei, nur sieht man auch ganz deutlich, dass dieser um seine Achsen rotiert, und nicht um die Achse der View.
und ihre Orientierung
. Letztere ist eine Rotationsmatrix, die wie folgt zu interpretieren ist. Rotationsmatrizen sind ja bekanntlich orthogonale Matrizen, d.h. ihre Spaltenvektoren haben die Länge 1 und stehen jeweils senkrecht aufeinander. Der erste Spaltenvektor zeige dabei von der Blickrichtung der Kamera aus gesehen nach links, der zweite nach oben und der dritte in Blickrichtung. Durch p und O ist die Kamera also vollständig beschrieben. Will man die Kamera verschieben, muss man nur p verändern, will man sie drehen, multipliziert man einfach eine entsprechende Rotationsmatrix auf O.
wissen, welche Koordinaten er bezüglich der oben beschriebenen Kamera auf dem Bildschirm hat, geht man wie folgt vor. Man sucht einen Vektor
, sodass
gilt. Umgestellt erhält man
, da die Inverse einer orthogonalen Matrix gleich ihrer transponierten ist. Hat man nun den Vektor
berechnet, so ist
der gesuchte Punkt auf dem Bildschirm, wobei (0,0) dem Mittelpunkt des Bildschirms entspricht. Man beachte, dass sich der Punkt x hinter der Kamera befindet, also nicht sichtbar ist, falls
gilt. Je nach Aufnahmewinkel der Kamera muss man den Punkt auf dem Bildschirm noch skalieren. Hat man beispielsweise horizontal einen Aufnahmewinkel von 90° gewählt (also je 45° nach links und rechts), so entspricht die x-Koordinate 1 dem linken Bildschirmrand und -1 dem rechten Bildschirmrand.


von der Kamera aus gesehen nach links. Dies entspricht dem x in der Grafik unten. Um genau zu sein zeigt er in der Grafik nach rechts. Es ist eigentlich auch völlig egal ob nach links oder rechts, man sollte sich nur auf eine Richtung festlegen. Je nach dem kehrt sich dann die Bildschirmkoordinate in x-Richtung um. Der zweite Spaltenvektor
zeigt nach oben, was in der Grafik dem y entspricht. Auch hier könnte man den Vektor auch nach unten zeigen lassen, womit sich die y-Koordinate am Bildschirm umkehrt. Der letzte Spaltenvektor
zeigt in Blickrichtung (Bildschirm z-Achse), entspricht also dem z in der Grafik.
