Projektion = Abbildung von 3D-Objekten in 2D-Bildebene
Klassifikation von Kameramodellen
perspektivische Projektion
Parallelprojektion
einfachstes Modell der perspektivischen Abbildung
ähnlich menschlichem Auge
Schärfentiefe nimmt bei größerer Öffnung ab
Computergrafik verwendet idealisiertes Lochkameramodell mit unendlich kleinem Loch
Tiefenunschärfe kann nicht direkt simuliert werden
imaginäre BIldebene liegt vor Projektionszentrum
Abbildungsmatrix:
bei OpenGL zeigt die Kamera in negative z-Richtung, daher:
Nearplane und Farplane verlaufen parallel zur Bildebene und begrenzen darzustellenden Bereich in z-Koordinate
Für darzustellenden Bereich ist vor allem der Öffnungswinkel
Für Projektion von Kamerakoordinatensystem in Bildebene ist GL_PROJECTION-Matrix verantwortlich
Aktivierung durch glMatrixMode(GL_PROJECTION);
Erzeugen von Projektionsmatrix durch gluPerspective(fovy, aspect, near, far);
Beispiel: Dolly Zoom / Vertigo Effekt
Translation der Kamera in z-Richtung und Ausgleich durch Veränderung der Brennweite
Transformationsmatrizen ergeben sich durch Basisvektoren (Linearkombination)
In OpenGL werden alle Transformationen zu GL_MODELVIEW-Matrix zusammengefasst, außer Projektionsmatrix
Damit beschreibt GL_MODELVIEW die Transformation aus lokalem Koordinatensystem in Kamerakoordinatensystem.
Die GL_PROJECTION-Matrix
Definition in OpenGL durch gluLookAt(eyex, eyey, eyez, refx, refy, refz, upx, upy, upz);
in OpenGL-Pipeline vor perspektivischer Division,
daher Prüfungsbereich
Die Division für geclippte Koordinaten wird damit eingespart.
Koordinaten aus Bereich
Befehl: glViewport(int ix, int iy, int width, int height)
glViewport(0, 0, 1920, 1080)
für FHDIn perspektivischer Ansicht werden parallele Linien im 3D-Raum in der 2D-Projektion nicht zwingend parallel dargestellt.
Schnittpunkte in 2D werden als Fluchtpunkte bezeichnet
Entsprechend der Anzahl an Fluchtpunkten werden Projektionen als 1-, 2- oder 3-Punktperspektive bezeichnet.
OpenGL-Implementierung für Tiefentests
glEnable(GL_DEPTH_TEST)
Wenn inaktiv: Primitive werden in der Reihenfolge ihres Pipelinedurchlaufs gezeichnet und verdecken somit ggf. vorher gezeichnete.
Wenn aktiv: Primitive, die näher an der Kamera liegen verdecken weiter entfernte.
nach perspektivischer Division (Normalized device coordinates) haben weiter entfernte Punkte größere z-Koordinaten
Depth-Buffer hält analog zum Framebuffers (Farbinformationen) die Tiefeninformationen pro Pixel
wird mit z-Wert der Far-Ebene initialisiert:
glClear(GL_DEPTH_BUFFER_BIT)
Tiefenwert wird pixelweise vom Rasterisierer aus transformierten Vertex-Daten interpoliert
Pixel (in Frame- und Depth-Buffer) werden in OpenGL-Pipeline während der Per-Fragment Operations geschrieben.
Wenn Tiefenwert für Pixel kleiner ist, werden der bestehende und der entsprechende Farbwert überschrieben, ansonsten bleiben die bestehenden unverändert.