Das lokale Koordinatensystem ist das Koordinatensystem, in dem ein Objekt modelliert wird. Beispielsweise bezieht sich das Indexed Face Set immer auf die lokalen Koordinaten.
Die Model Transformation ist eine Transformationsmatrix, die an jedem Objekt hängt und definiert, wie dieses Objekt in die Weltkoordinaten platziert, orientiert und skaliert werden soll.
Der Eyespace (auch View Space, deutsch Aug(en)-Koordinaten) ist ein Koordinatensystem, bei dem die Kamera der Nullpunkt ist und alles andere relativ zur Kamera platziert ist. Mit der Viewmatrix lassen sich Punkte vom Worldspace in den Eyespace überführen.
Wir rechnen hier in 2D, das ganze läuft aber analog in 3D ab.
Für das einfachere Rechnen ist die Sehrichtung entlang der positiven y-Achse (statt in 3D entlang der negativen z-Achse).
Homogene Koordinaten
Ausgangslage sind Punkte im Eyespace. Die Idee: Wie jede Transformation lässt sich Perspektivische Projektion auch durch eine Matrix ausdrücken. In homogener Schreibweise sieht eine Matrix so aus:
Wegfall der linearen und Translationsmatrix
Wir können uns erschließen:
Wir sind im Eyespace schon passend skaliert / orientiert
Wir sind auch passend positioniert
Damit ist der Effekt von soweit:
Dehomogenisiert wäre das dann:
Homogene Werte
Wir sehen, wir haben eine Division. Zur Erinnerung an unsere Mission: und sollen kleiner werden, wenn die Entfernung größer wird. Wie machen wir das? Indem wir durch die Entfernung teilen. Das haben wir genau hier erreicht.
Weiter können wir uns erschließen:
ist eine konstante Skalierung, unabhängig der Position. Das brauchen wir nicht.
bezieht sich auf den -Wert, dementsprechend würden Dinge kleiner werden, je weiter oben sie sind. So funktioniert die Realität nicht, dinge werden nicht kleiner, je weiter oben sie sind.
Dementsprechend bleibt nur übrig, was sich genau auf , also die Distanz zur Kamera bezieht. muss also definiert sein, wir nehmen der Einfachheit halber mal .
Übrig bleibt die Matrix:
Erhaltung der Tiefenwerte
Dehomogenisiert wäre der Effekt soweit dann:
Problem damit: Bei der Transformation geht die Tiefe (-Achsenwerte) verloren. Deswegen könnten wir dann nicht mehr entscheiden, ob ein Vertex vor oder hinter einem anderen liegt. Lösung: Man kann die Tiefe erhalten, indem man setzt:
Wenn man jetzt nämlich einen Punkt transformiert:
Sieht man, dass nicht mehr konstant ist, sondern eine monoton steigende Funktion. Das ist wichtig, denn monoton steigende Funktionen behalten die Ordnung bei. Das heißt, Dinge, die bisher näher als andere waren, sind nach der Transformation immer noch näher als andere. Zwar sind die Werte nicht mehr linear, aber sie reichen trotzdem um zu bestimmen, welche Dinge vor anderen sind.
Es bleibt also die Transformationsmatrix:
Beispiel
Gegeben sind folgende Punkte im Eyespace:
Die transformierten Punkte sind dann:
3D
Die Projektion in 3D läuft analog ab, mit der Änderung dass wir jetzt in die negative -Achse schauen. Hinzu kommt die Transformation in den NDC:
Dementsprechend verläuft die Transformation wie folgt:
Auch hier beziehen wir die Z-Achse wieder mit ein, sodass sie in Sichtrichtung (negatives z) monoton steigend ist.
Die Normalized Device Coordinates (NDC) werden verwendet, um Szenen vom Viewspace in den Wertebereich zu bringen, mit dem die Grafikkarte rechnen kann.
Vorgehen
Erst schneiden wir alle - und -Werte ab, die außerhalb unseres Viewport () liegen. Die -Achse wird auch getrimmt (). Anschließend normalisieren wir die Werte auf .
Das Signed-Distance-Rasterisierungsverfahren ist der quasi-Standard zum Rasterisieren von Dreiecken.
Voraussetzungen
Die Verticies der Dreiecke sind gegen den Uhrzeigersinn angeordnet. Dies entspricht auch dem Standard in der Mathematik.
Grundidee
Wir malen ein Pixel an, wenn dessen Mittelpunkt im Dreieck liegt. Zum bestimmen, ob ein Punkt in einem Dreieck liegt, geht man die Vektoren des Dreiecks ab. Wenn ein Punkt links von jedem der Vektoren des Dreiecks liegt, dann ist er innerhalb des Dreiecks.
Beispiel
Der Punkt ist innerhalb des Dreiecks, denn er ist links von jedem der Dreiecksvektoren , und .
Der Punkt ist nicht innerhalb des Dreiecks. Er ist zwar links von den Vektoren und , aber nicht links vom Vektor .
Der Punkt wäre links von , wenn das Ergebnis positiv wäre. Es ist aber negativ, deswegen ist nicht links von .
Algorithmisch
Wendet man diese Regel für alle 3 Kanten des Dreiecks an, kann man bestimmen, ob ein Punkt im Dreieck ist.
Optimierung
Bounding Box, die das Dreieck so enganliegend umschließt wie möglich
Notizen aus der VL
Signed-Distance Rasterisierungsverfahren
Standard
Dreiecke rotieren standardmäßig in der Mathematik gegen den Uhrzeigersinn.
Idee des Algorithmus: Man geht die Vektoren des Dreiecks ab. Wenn bei jedem der 3 Vektoren der Punkt links von dem Vektor ist, dann ist er innerhalb. Ist der Punkt nicht an allen Vektoren links, ist er außerhalb.
Idee (tafel): Wir gehen den (konvexen) Polygonzug entlang und prüfen, ob der gegebene Punkt immer auf der Seite “nach innen” ist. Heißt: Polygonzug -> gerichtete Kanten:
algorithmisch:
Oft hilft es Richtungen zu Normalisieren:
“Die Richtung von a nach b ist der Vektor b-a geteilt durch seine Länge (=> normalisiert)”
Aus einer Richtung in 2D kann direkt eine orthogonale Richtung, eine Normale, abgedeckt werden:
“Die Normale von einer Richtung.”
Man tauscht die Komponenten und bei einer streut man ein negatives Vorzeichen rein
Skalarprodukt
Wir haben 2 Vektoren 𝕣, dann ist das Skalarprodukt (in der Computergrafik so geschrieben, “bracket notation”), alternativ , aus der Grundschule eher bekannt
Auch gut zu Wissen: .
Dementsprechend ist das Skalarprodukt von 2 orthogonalen Richtungen = 0.
=> Wann ist der Punkt p links von der Kante b-c ?
Wenn
Also wenn ist, dann ist p links von der Kante.
Performance Optimierung
-> Bounding Box, die das Dreieck so enganliegend umschließt wie möglich
Bei der perspektivischen Projektion in 3D schauen wir in Richtung der negativen z-Achse. Um die Informationen zu erhalten, welche Dinge vor anderen liegen, wird z auf eine monoton steigende Funktion überführt.
Problem hierbei: Die Funktion ist zwar im Sichtbereich monoton steigend, ändert aber für positive z (hinter der Kamera) ihre Richtung:
Beispielhafter Plot für und
So würde alles was hinter der Kamera ist vor die Kamera transformiert werden.
Um das zu verhindern, wendet man Clipping an.
Vorgehen
Beim Clipping schneidet man Verticies ab, die außerhalb des Frustums liegen.