Frustum

Aus DGL Wiki
Version vom 1. Oktober 2005, 19:18 Uhr von Luketheduke (Diskussion | Beiträge) (Viewing Frustum Detection)

Wechseln zu: Navigation, Suche

Was ist ein Frustum?

Frustum (dt. Stumpf) oder häufig auch als "viewing frustum" bezeichnet, steht im Bereich der 3D-Grafik für einen Körper, dessen Inhalt in irgendeiner Form auf den Bildschirm projeziert wird. Fast immer ist die Projektionsebene (^= Bildschirm) eine Randebene des Frustums. Das menschliche Auge projeziert ein perspektivisches Frustum auf die Netzhaut: Mit steigender Entfernung wird ein Objekt direkt proportional kleiner.

Frustum.jpg

Um beim menschlichen Auge zu bleiben: Das grüne Viereck stellt die Projektionsebene, also die Netzhaut dar. Alles was weiter links davon liegt, wird durch die Linse auf die Netzhaut projeziert und wird damit sichtbar, wenn es nicht von einem anderen Objekt verdeckt wird. Das Viewing Frustum ist dann der Pyramidenstumpf, der sich links der grünen Ebene ins unendliche erstreckt..

OpenGl Frustum

Perspektivisches Frustum

Ein perspektivisches Frustum ist dem unseres Auges sehr ähnlich. Als Projektionsebene dient hier jedoch nicht die Netzhaut, sondern der Bildschirm. Alles was vor dem Bildschirm liegt, wird nicht angezeigt => wird von der Near Clipping Plane zum Betrachter hin abgeschnitten. Selbiges gilt für alles was über, unter, rechts und links des Frustums liegt und auch für alles, was sich hinter der Far Clipping Plane befindet (Im Bild durch die rote Ebene dargestellt). Um ein perspektivisches Frustum in OpenGl zu definieren wählt man zuerst die Projektionsmatrix an, läd die Identitätsmatrix und benutzt gluPerspective oder glFrustum, um den Sichtkegel zu definieren:

 //Projektionsmatrix zurücksetzen
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 //Perspektivische Darstellung
 gluPerspective(60.0,ClientWidth/ClientHeight,NearClipping,FarClipping);
 glMatrixMode(GL_MODELVIEW);

Orthogonales Frustum

Ein orthogonales Frustum erzeugt ein gänzlich anderes Bild unserer Umgebung. Gleich große Objekte werden, wenn sie parallel liegen auch immer gleich groß angezeigt. Ihre Positionierung im Raum hat auf ihre Grösse dagegen keinen Einfluss. Genauso wie das perspektivische Frustum, wird auch das orthogonale von 6 Ebenen (links, rechts, oben, unten, vorne, hinten) eingegrenzt.

Diese Art der Darstellung wird meist verwendet, wenn man Dinge isometrisch oder 2-Dimensional anzeigen möchte oder eine der für CAD Programme typsichen Seitenansichten gefragt ist. Um ein solches Frustum in OpenGl einzusetzen kann man die Funktionen glOrtho und gluOrtho2D verwenden:

 //Projektionsmatrix zurücksetzen
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 //Perspektivische Darstellung
 gluOrtho2D(0, 639, 0, 479);
 glMatrixMode(GL_MODELVIEW);

Viewing Frustum Detection

Viewing Frustum Detection bezeichnet ein Verfahren, bei dem die 6 das Frustum begrenzenden Ebenen aus der Projektionsmatrix extrahiert werden und deren genaue Postion in der Szene dann mithilfe der Modelviewmatrix bestimmt wird. Jedem grösserem Objekt in der Szene wird zu anfang ein einfacher, umschliesender Körper (Kugeln, Würfel/Quader, etc.) zugeordnet. Daraufhin wird geprüft, ob diesesr einfache Körper im durch die Ebenen beschriebenen Frustum liegt (hierfür gibt es je nach Körper mehr oder weniger einfache Testmöglichkeiten) und wenn ja dann wird das zugehörige Objekt gerendert, anderenfalls nicht. Das führt bei Betrachterpositionen inmitten der Szene zu einer höheren Bildrate, da grössere Polygonmengen von vornherein ausgeschlossen werden können und so für alle Ausgeschlossenen alle weiteren Berechnungen entfallen.