Perspektive

Zentralprojektion: Festgelegt durch Projektionszentrum (CoP, center of projection)

  • Parallele Geraden, die nicht parallel zur Projektionsebene verlaufen, werden auf sich schneidende Geraden abgebildet
  • Verzerrte Darstellung von Objekten im Bildraum
  • Verkleinerung dargestellter Objekte mit zunehmender Entfernung vom Projektionszentrum
  • Vermittlung realistischer Ansichten dreidimensionaler Objekte und Raumeindruck
  • Strahlensatz anwendbar

Virtuelle Kamera

View-Transformation

  • Kamerastandpunkt (look-from bzw. eye)
  • Kamerablickrichtung (look-to bzw. center)
  • Aufwรคrtsrichtung (up)
  • Transformation des 3D-Welt-Koordinatensystems in das 3D-Kamera-Koordinatensystem

  1. Translation von in den Ursprung
  2. Rotation in das Koordinatensystem รผber Orthonormalbasis (LookAt-Transformation):
  • Verwendung der inversen -Transformation
  • danach ist das Sichtvolumen (Pyramidenstumpf) im Ursprung zentriert und die Look-Richtung verlรคuft entlang der negativen -Achse

Dabei ist

Sonderfรคlle:

  • : Falls , berechne z.B. neu durch
  • : Falls , betrachte z.B. die frรผheren bzw.

Projection-Transformation

  • Projektion auf planare Sicht- oder Bildebene
  • Clipping (front / back bzw. near / far clipping pane)
    • findet vor der Rasterisierung statt
    • reduziert Rendering-Aufwand, indem Objekte nahe an oder hinter der Kamera sowie weit entfernte Objekte ignoriert werden
  • Sichtwinkel (width angle bzw. height angle)
  • Verhรคltnis von Breite und Hรถhe des Bildes (aspect ratio)

Sichtvolumen (view frustum):

  • Konisches Sichtvolument: rund, zu teuer (Lรถsen quadratischer Gleichungen)
  • Pyramidensychtvolumen: perspektivische Projektion, Clipping mit 6 Halbebenen
  • Rechtwinkliges Sichtvolumen (3D-Block): Parallelprojektion, Clipping mit 6 Halbebenen
  • allgemein: durch zwei Halbebenen abgeschnittenes Solid (Clipping)

1. Winkelรคnderung des Sichtvolumens

  • Frustum hat ร–ffnungswinkel und sollen auf skaliert werden ( in jede Richtung)
  • Dazu Skalierung in - und -Koordinaten (Tiefe bezรผglich der Kamera bleibt unverรคndert)

2. Skalierung des Sichtvolumens

  • Far-Clipping-Plane soll bei liegen
  • Uniforme Skalierung ( und ), um Proportionen zu erhalten
  • Abstand der Near-Clipping-Plane danach:

3. Perspektivische Transformation

  • Punktkoordinaten mรผssen entsprechend ihrere Tiefe perspektivisch verkรผrzt werden
  • Mittels homogenen Koordinaten: resultierende 2D-Punkte haben eine -Komponente, die bei der Umwandlung in nicht-homogene Koordinaten eine perspektivische Verkรผrzung bewirken
  • Sichtbarkeitsermittlung: meist mittels -Buffer mit Wertebereich (DirectX) oder (OpenGL) Tiefenbereich muss entsprechend abgebildet werden

Sei

Ein Punkt wird dadurch abgebildet auf , wobei bei der Umwandlung in nicht-homogene Koordinaten die ersten drei Komponenten durch geteilt werden

  • ein Punkt auf der Far-Clipping-Plane () wird dadurch final auf abgebildet
  • ein Punkt auf der Near-Clipping-Plane () auf

Gesamttransformation

  • sowohl die Teil- als auch die Gesamttransformation lassen sich als -Matrix darstellen
  • homogene Koordinaten ermรถglichen Darstellung perspektivischer Verkรผrzung
  • perspektivische Transformation ist nicht affin (sie verzerrt das Frustum zu einem Quader)

Transformation des Frustums in den Einheitswรผrfel

  • fรผr left, right, top, bottom, near, far
  • Punkte mit werden auf abgebildet
  • Punkte mit werden auf abgebildet
  • OpenGL: spiegelt die -Koordinate, sodass

Normalized Screen Coordinates / Normalized Device Coordinates (NDC)

  • Berechnung durch die Umwandlung von homogenen Clip-Koordinaten in nicht-homogene Koordinaten durch die Division mit der -Komponente
  • Normalisiert fรผr den Wertebereich

Screen Coordinates:

  • Abbildung der NDC auf das Fenster- bzw. Bildkoordinatensystem mit Hilfe der Viewport Transformation
  • NDC werden transliert und skaliert, sodass die in den festgelegten Fensterausschnitt passen
  • OpenGL legt den Fensterausschnitt mit glViewport(x, y, width, height) fest
  • OpenGL legt den zu rendernden Tiefenbereich mit glDepthRange(z_min, z_max) fest, wobei des Tiefeninterval auf des Interval abgebildet wird (mit Bit Genauigkeit des Depth Buffers)
  • Die Fensterkoordinaten sind die Grundlage fรผr die anschlieรŸende Rasterisierung

Transformationspipeline

3D Object Coordinates

  • World Transform (Applikations-spezifisch) World Coordinates
  • Look at (Vertex Shader) Eye Coordinates
  • Projektion (Vertex Shader) Clip Coordinates NDC Coordinates
  • Viewport, Depth Range (Fragment Shader) Window Coordinates
  • Rasterisierung


Parallele Projektionen

  • Festgelegt durch Projektionsrichtung (DOP, direction of projection) | alle Projektionsstrahlen besitzen diese gleiche Richtung
  • Erhalten GrรถรŸen der parallel projizierten Objekte
  • Anwendung bei technischen Illustrationen und Ingenieurszeichnungen (z.B. Konstruktionszeichnungen von Maschinen oder Bauzeichnungen)

Hauptrisse:

  • Grundriss (top view)
  • Aufriss (front view)
  • Seitenriss (side view)

Vorteile:

  • Genaue Lรคngen- und Winkelmessungen im Bild mรถglich
  • Gleicher MaรŸstab fรผr alle Objekte im Bild

Nachteile:

  • keine (photo-)realistische Darstellung fรผr 3D-Objekte und ihre Umgebung
  • im Allgemeinen sind mehrere Ansichten notwendig, um einen Raumeindruck zu gewinnen

Transformation:

  • Ausgangspunkt bildet die Spezifikation eines rechtwinkligen Sichtvoluments mit Hilfe einer 3D-Bounding-Box:
    • es handelt sich um eine Axis-Aligned Bounding Box (AABB)
    • Sichtrichtung entlang der negativen -Achse
  • Mittels Translation und Skalierung wird die AABB in das kanonische Sichtvolumen mit einer Ausdehnung von bis abgebildet
    • Durch die Transformation werden normalized device coordinates, NDC im Bereich bestimmt


Kameramodelle

  • First-Person View: aus Sicht eines Objektes
  • Third-Person View: direkt hinter einem Objekt
  • High-Angle View: รผber einem Objekt, groรŸer Winkel nach unten
  • Wide-View: groรŸe Entfernung zur Szene, vollstรคndige Sicht, wenige Details
  • Birdโ€™s Eye View: schwebt รผber Szene

Eine direkte Kamerakontrolle durch den Nutzer mit allen Freiheitsgraden ist i. Allg. nicht effektiv fรผr die Interaktion.


Z-Buffer

Sichtbarkeitsproblem: Gegeben eine Menge von Szenenobjekten und eine Kameraspezifikation. Entscheide, welche Teile der 3D-Objekte projiziert in der Projektionsebene sichtbar sind

  • Annahme: Szenenobjekte sind opak, matt und liegen im Vakuum (z.B. nicht im Nebel)

Objektprรคzise Sichtbarkeitsalgorithmen

  • jedes Objekt wir mit allen anderen Objekten z.B. durch 2D-Polygonรผberschneidungstests mit allen anderen Objekten
  • Laufzeit bei Szenenobjekten
for(obj in sceneobjects)
{
	visibleParts = determine_visible_surfaces(obj, sceneobjects)
	render(visibleParts)
}

Bildprรคzise Sichtbarkeitsalgorithmen

  • Sichtbarkeitsermittlung im Zuge der Rasterisierung (pro Pixel)
  • Laufzeit bei Szenenobjekten und Pixeln
for(pixel in raster)
{
	color = determine_object_closest_to_camera(pixel, sceneobjects)
	set_color(pixel, color)
}

Vergleich

  • Laufzeit: Bei รผberschaubaren Anzahl von Objekten (z. B. bis zu 1000 Szenenobjekte) erscheint zunรคchst der objektprรคzise Ansatz im Vorteil, da bildprรคzise Ansรคtze mit Pixelmengen von z. B. arbeiten
    • Berechnung Verfahren der algorithmischen Geometrie besitzt numerische, robustheitsbezogene Schwรคchen und muss mit Sonderfรคllen umgehen
    • bereits kleine ร„nderungen der Kameraeinstellung kรถnnen zu groรŸen ร„nderungen bei der ermittelten sichtbaren Geometrie fรผhren
  • In der Praxis sind bildprรคzise Algorithmen fast immer im Vorteil, da die zum Einsatz kommenden Berechnungen (numerisch gesehen) wesentlich einfacher und Hardware-unterstรผtzt und hoch parallel ablaufen
  • Verlagerung der Sichtbarkeitsermittlung auf die Fragmente ermรถglichte, historisch gesehen, erst die Echtzeitcomputergrafik

Z-Buffer-Algorithmus

  • hardware-unterstรผtzt
  • 2D-Raster, dessen Werte Tiefenwerte enthalten
  • Tiefe ist der Abstand von der Near-Clipping-Plane zu einem sichtbaren Fragment in normalisierten Gerรคtekoordinaten
  • Z-Buffer ist Teil des Framebuffers, d.h. fรผr jedes Pixel wird neben den Farbwerten auch der Tiefenwert abgelegt
  • Z-Buffer besitzen i. Allg. 16โ€“32 Bits Genauigkeit, d.h. das Tiefenwerteinterval wird durch den Integerbereich dargestellt

Ablauf:

  • Z-Buffer wird mit einem Hintegrundwert (z.B. ) initialisiert
  • Fรผr jedes Objekt:
    • Rasterisiere Objekt (Zerlegung in Fragmente)
    • Fรผr jedes Fragment, berechne Z-Wert
    • Falls der Z-Wert kleiner ist als der aktuelle Tiefenwert an der korrespondierenden Fragmentposition im Z-Buffer:
      • Schreibe den Z-Wert in den Z-Buffer (Aktualisierung)
      • รœbertrage Fragmentfarbe in den Color-Buffer
    • Andernfalls ignoriere Fragment und lasse Wert im Z-Buffer unverรคndert (Fragment liegt hinter einem weiter vorne liegenden, bereits gezeichneten Fragment)

Problem der Tiefenwert-Verteilung:

  • Near-Clipping-Plane-Distanz und Far-Clipping-Plane-Distanz mรผssen geeignet gewรคhlt werden, soll die Tiefengenauigkeit optimal verteilt sein
  • Zu nahe Near-Clipping-Plane fรผhrt zu hoher Tiefengenauigkeit in unmittelbarer Nรคhe der Kamera; Genauigkeit wird aber i. Allg. auf mittlerer Distanz benรถtigt
  • Bei zu geringer Tiefengenauigkeit: Z-fighting (z-flickering), d.h. Bildartefakte bei nahestehenden Objekten
  • Exakte Wahl der Near-Clipping-Plane notwendig!

Depth-Peeling

  • arbeitet mit zweitem Z-Buffer
  • ermรถglicht schrittweise Rendering bei รœberlagerung transparenter Objekte

Abblรคttern der Oberflรคche:

  • Extrahieren der Fragmente, die dem Betrachter am nรคchsten sind (Fragmente mit geringstem Z-Wert) im ersten Rendering-Durchlauf
  • Extrahieren der nรคchst-tieferen Fragmente in jedem weiteren Rendering-Durchlauf
  • Der -te Rendering-Durchlauf liefert die Fragmente zur -ten Tiefenebene
  • Schrittweise Verfeinerung

Algorithmus: 1. Pass

  1. Rendere die Szene mit Tiefentest
  2. Regulรคres Tiefenbild mit Z-Buffer 1 entsteht
  3. Color-Buffer wird als Layer 1 in einer Textur gespeichert

2. Pass

  1. Rendere die Szene mit folgendem Tiefentest: verwerfe Fragmente, die eine geringere oder gleiche Tiefe haben als gegenwรคrtig im Z-Buffer 1
  2. Tiefenbild der Fragment in der zweiten โ€žEbeneโ€œ entsteht im Z-Buffer 2
  3. Color-Buffer wird als Layer 2 in einer Textur gespeichert

3. Pass

  1. Tausche Rolle von Z-Buffer 1 und Z-Buffer 2
  2. Verfahren wie in Pass 2

Letzter Pass: Kombiniere Layer 1 bis im Color-Buffer (screen-aligned textures)

Bewertung des Depth-Peelings

Vorteile:

  • Keine Vorsortierung der Szenenobjekte erforderlich (Auswertung der Objekte in beliebiger Reihenfolge)
  • Nicht auf polygonale Geometrien beschrรคnkt (alle raterisierbaren Objekte wie Kurven, Fraktale, etc. mรถglich)
  • Einfache Implementierung
  • Hardware-Unterstรผtzung selbst mit low-cost Hardware
  • Optimal in die Rendering-Pipeline einbaubar
  • Separate Speicherung des Z-Buffer-Inhalts (โ€žTiefenbildโ€œ) ermรถglicht Speicherung von Bildern mit Tiefeninformation

Nachteile:

  • Unnรถtige Rasterisierung von nicht-sichtbarer Szenengeometrie
  • Beschrรคnkte numerische Genauigkeit des Z-Buffers
  • Nichtlineare Verteilung der Tiefengenauigkeit
  • Zusรคtzlicher Z-Buffer als Ressource notwendig

Nichtplanare Projektionen einmal รผberfliegen?