Weltkoordinaten zu Pixelkoordinaten

blurry333

Well-Known Member
#1
Hallo,

habe einen Punkt (3,4,5 ) z.B. und möchte den auf mein Pixelraster projeziieren. Wie geh ich da vor.
Warum brauche ich denn insgesamt 3 Koordinatensysteme. Welt,Kamera und Bildkoordinatensystem.
Sagen wir die Kamera hat eine Brennweite f = 15 . Soweit ich das versteh muss ich jetzt das Welt in das Kamerasystem verschieben. Wieso eigentlich. Geht da nicht Information verloren ? Wenn der Weltpunkt schräg auf die Kamera trifft dann wird er doch ganz anders projeziiert. Vielleicht kennt sich jemand damit aus.
 

Firefall

Well-Known Member
c-b Experte
#2
Also zuerst mal hast du deine Modelle von was auch immer. Die sind normalerweise um den Nullpunkt herum definiert, stehen also quasi alle an derselben Stelle. Die musst du erstmal in deiner Welt placieren, indem du sie entsprechend vom Nullpunkt verschiebst, rotierst, vielleicht auch skalierst oder gar verzerrst. Gut. Als nächstes willst du deine Objekte von einem bestimmten Ort aus sehen (der Kamera). Die Kamera schaut dabei in eine fixe Richtung (stell dir vor, deine Augen wären die Kamera). Wenn du jetzt was bestimmtes anschauen willst, musst du die Welt so verschieben und rotieren, dass die Kamera den gewünschten Ausschnitt sieht. Die Kamera steht also prinzipiell immer am gleichen Ort, stattdessen verschiebt sich die Welt um sie herum. Das ist dann aber immer noch eine 3D-Welt, und die willst du auf deinem 2D-Monitor darstellen. Also brauchst du eine Projektion, welche die Ansicht deines 3D-Modells auf zwei Dimensionen quetscht. Natürlich geht in diesem letzten Schritt Information verloren - aber nur für die Anzeige. Deine Welt ist natürlich immer noch im Speicher vorhanden und wird dann für das nächste Bild erneut transformiert und projeziert.

Die ganzen Transformationen lassen sich als Matrizen darstellen. Die Transformation ist dann eine Matrix-Vektor Multiplikation (jeder Punkt des Modells ist ein Vektor). Du hast insgesamt drei solche Matrizen (Model, View und Projection). Nenn wir die mal A, B und C. Wenn dein Punkt x ist, dann machst du im Prinzip C(B(Ax)), wendest also die Matrizen der Reihe nach an (erst A * x, dann B * das Ergebnis davon, dann C * das Ergebnis davon). Da Matrixmultiplikation assoziativ ist, ist das aber dasselbe wie (ABC)x. ABC ist dabei ein Produkt aus drei Matrizen und selbst auch wieder eine Matrix - die sogenannte Model-View-Projection Matrix (MVP). Die kannst du berechnen und dann für jeden deiner Punkte benutzen - so musst du pro Punkt nur mit einer Matrix multiplizieren anstatt mit dreien, was schneller geht.

Die Matrizen sind übrigens in der Regel 4 x 4, also eine Dimension zu viel. Die Punkte sind somit prinzipiell in einem 4D-Raum, werden aber quasi implizit auf drei Dimensionen projeziert während dem ganzen Vorgang. Der Grund dafür ist, dass man Verschiebungen (Translation) im 3D-Raum nur in einem passend definierten 4D-Raum als Matrixmultiplikation darstellen kann.
 
Oben