Das lokale Koordinatensystem ist das Koordinatensystem, in dem ein Objekt modelliert wird. Beispielsweise bezieht sich das Indexed Face Set immer auf die lokalen Koordinaten.

Model Matrizen

$M$

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.

Die Weltkoordinaten beschreiben die Koordinaten, die aus den lokalen Koordinaten mehrerer Objekte transformiert wurden.

Viewmatrix

$V$

Die Viewmatrix ist eine Matrix, die genutzt wird um Punkte aus den Weltkoordinaten in den View Space zu überführen. Sie ist wie folgt definiert:

Wobei die Eyespace-Matrix ist.

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.

Projektions-Matrix

$P$

Hinführung

Anmerkungen

  • 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:

  1. Wir sind im Eyespace schon passend skaliert / orientiert
  2. 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:

  1. ist eine konstante Skalierung, unabhängig der Position. Das brauchen wir nicht.
  1. 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.
  1. 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.

${\Delta}$

Dehomo-genisierung

$H(\dots)$

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 .

Window Transform

$W$

Rasterisierung

Die Viewport Coordinates bestimmen, wo auf dem Bildschirm das Bild gerendert werden soll.

Gegeben sind dafür die Breite und Höhe des Viewports, sowie den Abstand zum Nullpunkt .

Zur Umrechnung von NDC nutzt man die Matrix , die sich wie folgt berechnet:

$ [[\square]]$

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 .

Mathematische Bestimmung

Ein Punkt ist links von einer Kante , wenn:

Dabei ist die Normale nach links.

Beispiel

Gebeben:

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

???

Problemstellung

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.

Wann wird geclippt?

Generell wird nach der perspektivischen Projektion und vor der Dehomogenisierung geclippt.