Clipping Plane: Unterschied zwischen den Versionen
Lyr (Diskussion | Beiträge) |
K (→Arten von Clipping Planes: Ebene verlinkt, Kommasetzung und Rechtschreibung) |
||
(6 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
+ | {{Excellent}} | ||
== Arten von Clipping Planes == | == 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. | + | 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 | + | Bei den Clipping Planes ist zu unterscheiden zwischen benutzerdefinierten Clipping Planes, welche mit [[glClipPlane]] gesetzt werden und dem [[Kamera]]-[[Frustum]] welches aus 6 [[Ebene]]n (Near, Far, Left, Right, Top und Bottom) besteht. |
− | == | + | == benutzerdefinierte Clipping Planes == |
+ | [[Bild:Kugel_LINE_Clip.jpg|right|framed|Eine [[gluSphere]] in Drahtgitterdarstellung welche durch eine [[glClipPlane|benutzerdefinierte Clippingplane]] geschnitten wurde.]] | ||
− | Die | + | 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 [[glVertex|Vertices]] mit der Projection [[Matrix]] erfolgen. |
== Frustum clipping == | == Frustum clipping == | ||
Zeile 24: | Zeile 26: | ||
Parallele Projektion wird üblicherweise für Darstellung von 2D Grafiken verwendet. | Parallele Projektion wird üblicherweise für Darstellung von 2D Grafiken verwendet. | ||
− | Annahme: w Komponente eines [[glVertex|Vertices]] ist immer 1. | + | Annahme: w Komponente eines [[glVertex|Vertices]] ist immer 1.<br> |
Bei der Paralellprojektion sind nach der Projektion alle sichtbaren [[glVertex|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 [[glVertex|Vertex]] durch die Division durch W nicht mehr beeinflusst. | Bei der Paralellprojektion sind nach der Projektion alle sichtbaren [[glVertex|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 [[glVertex|Vertex]] durch die Division durch W nicht mehr beeinflusst. | ||
Zeile 31: | Zeile 33: | ||
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 | + | 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, | + | *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) | ||
Zeile 45: | Zeile 47: | ||
#Punkt 1 innerhalb, Punkt 2 genau auf der Ebene und Punkt 3 ausserhalb => 1 3eck | #Punkt 1 innerhalb, Punkt 2 genau auf der Ebene und Punkt 3 ausserhalb => 1 3eck | ||
#Punkt 1 und Punkt 2 innerhalb, Punkt 3 ausserhalb => 2 3ecke | #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 | + | 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== | ==OpenGL Funktionen== |
Aktuelle Version vom 12. Oktober 2013, 18:28 Uhr
(weitere exzellente Artikel) |
Inhaltsverzeichnis
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 benutzerdefinierten Clipping Planes, welche mit glClipPlane gesetzt werden und dem Kamera-Frustum welches 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:
- Punkt 1 innerhalb, Punkt 2 und 3 ausserhalb => 1 3eck
- Punkt 1 innerhalb, Punkt 2 genau auf der Ebene und Punkt 3 ausserhalb => 1 3eck
- 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.