![]() | Um komplexe Bewegungsabläufe innerhalb einer Szenerie zu implementieren, muß es möglich sein, verschiedene Objekte mit verschiedenen Transformationsmatrizen zu versehen.
|
In OpenGL gibt es dazu Matrixstacks. Ein Matrixstack erlaubt es, die aktuelle Transformationsmatrix zu sichern, sie mit weiteren Matrizen zu verknüpfen, und danach wieder zu restaurieren. Es gibt in OpenGL drei unterschiedliche Matrixstacks. Den Modelview-, Projection- und Textur-Stack. Der Modelview-Stack beinhaltet die Transformationsmatrizen für die Geometrie, der Projection-Stack enthält die Matrizen für die Kamera und Viewportge-staltung, der Texture-Stack dient zum Manipulieren der Texturkoordinaten.
Folgende Befehle zur Manipulation der Matrixstacks stehen u.a. zu Verfügung:
glMatrixMode ( mode ) //Bestimmt, welcher Matrixstack bearbeitet wird. //ist entweder GL_MODELVIEW, GL_PROJECTION // oder GL_TEXTURE glPushMatrix() // sichert die aktuelle Matrix am Stack glPopMatrix () // holt die letzte Matrix vom Stack glLoadIdentity() // Überschreibt die aktuelle Matrix mit der // Einheitsmatrix
Folgende Befehle stehen für Transformationen zur Verfügung:
glTranslate(x, y, z) // Multipliziert die aktuelle Matrix mit einer // Translationsmatrix in Richtung (x,y,z) glRotate(angle, x, y, z ) // Multipliziert die aktuelle Matrix mit einer // Rotationsmatrix mit-Grad um den Vektor // (x, y , z); Drehung um die X-Achse um 10°: // glRotate ( 10, 1.0, 0.0, 0.0 ); Drehung um den // ersten Meridian auf der Z-Ebene=0: // glRotate( 10, 1.0, 1.0, 0.0 ); glScale(x, y, z ) // Multipliziert die aktuelle Matrix mit einer // Skalierungsmatrix
Folgende Befehle dienen zum Manipulieren des GL_PROJECTION - Stacks:
glFrustum ( left, right, bottom, top, near, far ) // Erzeugt eine perspektivische Darstellungsmatrix // und multipliziert diese mit der aktuellen // Matrix. Die vordere Clippingebene wird // definiert durch // ( left, bottom, -near) - ( right, top, -near ), // die hintere Ebene liegt bei (-far) gluPerspective ( fovy, aspect, zNear, zFar ) //Beispiel:gibt den Sichtbereich in Grad an // ( 0.0 - 180.0 ° ). ist Breite / Höhe // des Sichtfeldes, bzw. sind die // vordere bzw. hintere Clippingebene glOrtho ( left, right, bottom, top, near, far ) // Definiert eine Parallelprojektion im angegeben // Bereich glOrtho2D ( left, right, bottom, top ) // Definiert eine Parallelprojektion im angegeben // Bereich mit den z zwischen -1.0 und 1.0
glMatrixMode ( GL_PROJECTION ); glLoadIdentity(); // Einheitsmatrix laden gluPerspective ( 65.0, width/height, 1.0, 20.0 ); // Darstellung wählen glMatrixMode ( GL_MODELVIEW ); glLoadIdentity(); gltranslate ( 0.0, 0.0, -5.0 ); glPushMatrix(); glTranslatef ( -1.0, 0.0, 0.0 ); // Drehmittelpunkt des OberA. glRotatef ( w1, 0.0, 0.0, 1.0 ); // Oberarm drehen glTranslatef ( 1.0, 0.0, 0.0 ); // zurückschieben auxWireBox ( 2.0, 0.4, 1.0 ); // Oberarm zeichnen glTranslatef ( 1.0, 0.0, 0.0 ); // DrehMP für Unterarm glRotatef ( w2, 0.0, 0.0, 1.0 ); // Unterarm drehen glTranslatef ( 1.0, 0.0, 0.0 ); // Mittelpunkt des Unterarms auxWireBox ( 2.0, 0.4, 1.0 ); // Unterarm zeichnen glTranslatef ( 1.0, 0.0, 0.0 ); // neuer Drehpunkt glPushMatrix (); glRotatef ( w3, 0.0, 0.0, 1.0 ); // Finger1 drehen glTranslatef ( 0.5, 0.0, 0.0 ); auxWireBox ( 1.0, 0.2, 1.0 ); glPopMatrix(); glPushMatrix (); glRotatef ( w4, 0.0, 0.0, 1.0 ); // Finger1 drehen glTranslatef ( 0.5, 0.0, 0.0 ); auxWireBox ( 1.0, 0.2, 1.0 ); glPopMatrix(); glPopMatrix();