Clipping Plane: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(benutzerdefinierte Clipping Planes)
(Perspektivische Projektion)
Zeile 31: Zeile 31:
 
Perspektivische Projektion wird üblicherweise für die Darstellung von 3D Szenen verwendet.
 
Perspektivische Projektion wird üblicherweise für die Darstellung von 3D Szenen verwendet.
  
Hier sind die Anforderungen schon etwas höher. Zum einen dürfen hier die Bedienungen -w <= z <= w nicht zutreffen wenn der Punkt ausserhalb der [[Frustum]] lieget und zum anderen muss z nach der Division durch w einen Wert im Bereich [-1|1] erhalten. Um dies zu gewährleisten bringt die Projection [[Matrix]] die sichtbaren Koordinaten auf folgende Bereiche:
+
Hier sind die Anforderungen schon etwas höher. Zum einen dürfen hier die Bedingungen -w <= z <= w nicht zutreffen wenn der Punkt ausserhalb der [[Frustum]] liegt und zum anderen muss z nach der Division durch w einen Wert im Bereich [-1|1] erhalten. Um dies zu gewährleisten bringt die Projection [[Matrix]] die sichtbaren Koordinaten auf folgende Bereiche:
*x und y = [-far|far] (wenn die Punkte auf der Far Plane liegen, ansonnsten ein entsprechend kleinerer Bereich bis hin zu [-near|near] auf der Near Plane)
+
*x und y = [-far|far] (wenn die Punkte auf der Far Plane liegen, ansonsten ein entsprechend kleinerer Bereich bis hin zu [-near|near] auf der Near Plane)
 
*z = [-near|far]
 
*z = [-near|far]
 
*w = [near|far] (= vorheriger negativer z Wert)
 
*w = [near|far] (= vorheriger negativer z Wert)

Version vom 2. Mai 2005, 21:14 Uhr

Arten von Clipping Planes

Clippen nennt man das wegschneiden von Teilen die nicht am Ausgabebild sichtbar sind. Dies wird für jedes Primitiv (Punkt, Linie oder 3eck) durchgeführt bevor es weiter zum Rasterizer geschickt wird. Bei den Clipping Planes ist zu unterscheiden zwischen benutzer definierten Clipping Planes welche mit glClipPlane gesetzt werden und der Kamera Frustum welche aus 6 Ebenen (Near, Far, Left, Right, Top und Bottom) besteht.

benutzerdefinierte Clipping Planes

Die benutzerdefinierten Clipping Planes werden im Modelspace angegeben, das heißt sie werden beim Erstellen mit der aktuellen (inversen) Modelview Matrix multipliziert. Das clippen an den Benutzerdefinierten Clipping Planes muss aus diesem Grund auch vor der Multiplikation der Vertices mit der Projection Matrix erfolgen.

Frustum clipping

Hingegen zu der weit verbreiteten Theorie des kanonischen Sichtkörpers, wo die gesamte Szene in einen standardisierten Quader (x=[-1|1], y=[-1|1] und z=[0|1]) gebracht wird, sieht die Praxis in OpenGL (wohl primär aus performance Gründen) anders aus. Hier gilt ein Vertex als sichtbar wenn folgende Bedienungen erfüllt werden:

-w <= x <= w

-w <= y <= w

-w <= z <= w

Hier sollte man noch wissen, dass in OpenGL direkt nach dem Clippen der (x,y,z) Teil des Vertices durch w dividiert wird um bei der perspektivischen Projektion den Tiefeneffekt zu erzielen. Würde diese Division vor dem Frustum Clipping statt finden, so wäre die Z-Componente einer Kante nicht mehr linear und die Schnittpunktberechnung mit der Clipping Plane würde zu einem etwas komplexerem Problem anwachsen.

Parallel Projektion

Parallele Projektion wird üblicherweise für Darstellung von 2D Grafiken verwendet.

Annahme: w Komponente eines Vertices ist immer 1.
Bei der Paralellprojektion sind nach der Projektion alle sichtbaren Vertices im Bereich ([-1|1],[-1|1],[-1|1],1). Hier wird also nicht viel mehr gemacht als den sichtbaren Bereich auf einen Standard-Würfel zu scalen und die Theorie des Kanonischen Sichtkörpers wird hier über Umwege auch in der Praxis durchgeführt. Da die W-Komponente immer 1 ist, wird der Vertex durch die Division durch W nicht mehr beeinflusst.

Perspektivische Projektion

Perspektivische Projektion wird üblicherweise für die Darstellung von 3D Szenen verwendet.

Hier sind die Anforderungen schon etwas höher. Zum einen dürfen hier die Bedingungen -w <= z <= w nicht zutreffen wenn der Punkt ausserhalb der Frustum liegt und zum anderen muss z nach der Division durch w einen Wert im Bereich [-1|1] erhalten. Um dies zu gewährleisten bringt die Projection Matrix die sichtbaren Koordinaten auf folgende Bereiche:

  • x und y = [-far|far] (wenn die Punkte auf der Far Plane liegen, ansonsten ein entsprechend kleinerer Bereich bis hin zu [-near|near] auf der Near Plane)
  • z = [-near|far]
  • w = [near|far] (= vorheriger negativer z Wert)

Die Projection Matrix transformiert die Frustum also in eine standard-Frustum die oben genannte Eigenschaften besitzt. Hier ist auch schön zu sehen was passiert wenn nun z durch w dividert wird: z/w = [-1|1] Zudem erklärt diese Division auch die charakteristische, nicht lineare Z-Buffer Einteilung.

Clipping Vorgang

Hier geht es darum, das 3eck an einer Ebene abzuschneiden, wodurch aus einem 3eck plötzlich 2 werden können. Es gibt nur 3 Fälle zu beachten wenn das 3eck die Ebene schneidet:

  1. Punkt 1 innerhalb, Punkt 2 und 3 ausserhalb => 1 3eck
  2. Punkt 1 innerhalb, Punkt 2 genau auf der Ebene und Punkt 3 ausserhalb => 1 3eck
  3. Punkt 1 und Punkt 2 innerhalb, Punkt 3 ausserhalb => 2 3ecke

Speziell bei der Frustum kann es vorkommen, das ein 3eck am Schluss in bis zu 4 kleinere 3ecke zerlegt wird wenn es beispielsweise in einer Ecke des sichtbaren Bereiches ist. Da jedoch jede Ebene getrennt behandelt werden kann stellen solche Spezialfälle kein Problem für den Algorithmus dar.

OpenGL Funktionen

glOrtho definiert durch eine parallele Projektion durch Near, Far, Left, Right, Top und Bottom Wert.

glFrustum definiert eine perspektivische Projektion, ebenfalls durch Near, Far, Left, Right, Top und Bottom Wert nur das hier Left, Right, Top und Bottom für die Near Plane angegeben werden. Für die Far Plane ergeben sie sich dadurch automatisch.

Der Funktion gluPerspective werden mit dem 3. und 4. Parameter die Entfernungen der beiden Ebenen übergeben. Zusammen mit den ersten beiden Parametern (Field of View und Seitenverhältnis) erzeugt gluPerspective eine Frustum. gluPerspective verwendet glFrustum und ist somit nur eine etwas Anwenderfreundlicherere Variante von glFrustum

Mit der Funktion glClipPlane können benutzerdefinierte Clipping Planes erstellt werden.