www.codeworx.org/opengl-tutorials/Tutorial4: Rotation

Lektion 4"Rotation"

- Download des Arbeitsbereiches

In dieser Lektion wird es um die sehr oft verwendete Rotation von Objekten gehen. Der Code der letzten Lektion muss nur geringfügig geändert werden um zur versprochenen Rotation zu kommen.

Zuerst werden drei neue Variablen benötigt, für jedes Objekt eine. Diese werden wie immer ganz am Anfang deklariert und enthalten den Drehwinkel des Objektes in Grad. Ist dieser zum Beispiel 0 oder 360, sieht man das Objekt genau von vorne, 180 wäre genau die "Rückseite" des Objektes. Da es sich dabei um floats handelt, kann man eine besonders hohe Drehgenauigkeit erreichen (Nicht nur 0.6, sondern auch 165,034). Aber dazu später noch mehr.

#include <windows.h> // diverse Windowsfunktionen
#include <gl\glu.h> // Damit kann Glu32 genutzt werden.
#include <gl\gl.h> // Damit kann OpenGL32 genutzt werden.
#include <gl\glaux.h> // Und das Gleiche nochmal für Glaux 
HGLRC hRC=NULL; // Der OpenGL Rendering Context
HDC hDC=NULL; // Geschützter GDI Device Context
HWND hWnd=NULL; // Verweist später auf den Windows Handle
HINSTANCE hInstance; // Die Instanz der Anwendung
bool keys[256]; // Vektor (Array) der den Status 
// einzelner Tasten enthält 
// (gedrückt/nicht gedrückt)
bool active=TRUE; // Wenn active FALSE ist, wurde das 
// Fenster vom Benutzer minimiert.
bool fullscreen=TRUE; // Läuft das Programm im Vollbildmodus 
// oder nicht?

GLfloat	rdreieck;
// Der Drehwinkel für das Dreieck
GLfloat rviereck; // Der Drehwinkel für das Viereck GLfloat rachteck;
// Der Drehwinkel für das Achteck (...)

int DrawGLScene(GLvoid) 
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
  // Die vorherige Szene wird vom Bildschirm gelöscht, 
  // damit die neuen nicht einfach über die alten    
  // Objekte gezeichnet werden

  glLoadIdentity(); 
  // modelview-Matrix wird zurückgesetzt  

  glTranslatef(-1.5f,0.0f,-6.0f)
  // Auf der X-Achse 1.5 Punkte zurück (Nach links)
  // Auf der Z-Achse 6 Punkte zurück (In den Bildschirm hinnein.)

  // Der Zeichner hat jetzt die Position:
  // (-3.5f,0.0f,-9.0f) 
  // (Vorher (0.0f, 0.0f, 0.0f))
glRotatef(Drehwinkel, x-Achse, Y-Achse, Z-Achse;) muss in dieser Form aufgerufen werden. Um das Objekt nur um die X-Achse zu drehen, muss für "X-Achse" der Wert 1.0f übergeben werden, auch Kombiantionen aus verschiedenen Achsedrehungen sind möglich. Einfachrumprobieren ;)
  glRotatef(rdreieck,0.0f,1.0f,0.0f);
  // Das Dreieck soll um die Y-Achse rotiert werden
glBegin(GL_TRIANGLES); // Ein Dreieck soll gezeichnet werden glColor3f(0.0f,0.0f,1.0f); // es soll soll blau werden glVertex3f( 0.0f, 1.0f, 0.0f); // Die obere Ecke des Dreiecks glVertex3f(-1.0f,-1.0f, 0.0f); // unten links glVertex3f( 1.0f,-1.0f, 0.0f); // unten rechts glEnd(); // Zeichenaktion beenden glLoadIdentity(); // zurücksetzen
glLoadIdentity() muss aufgerufen werden, damit sich die vorherige Rotation nicht mehr auf die nächsten Objekte auswirkt. Es wird also nicht nur der Zeichner, sondern auch die Rotation zurückgesetzt.

glTranslatef(-0.5f,0.0f,-9.0f);
// 5 Einheiten nach links, 9 Einheiten "in" den Schirm
glRotatef(rviereck,1.0f,0.0f,0.0f); // Das Viereck soll um die X-Achse rotiert werden

glBegin(GL_QUADS); // Ein Viereck zeichnen
glColor3f(1.0f,0.0f,0.0f); // es soll rot werden
glVertex3f(-1.0f, 1.0f, 0.0f); // oben links
glVertex3f( 1.0f, 1.0f, 0.0f); // oben rechts
glVertex3f( 1.0f,-1.0f, 0.0f); // unten rechts
glVertex3f(-1.0f,-1.0f, 0.0f); // unten links
glEnd(); // Zeichenaktion
glLoadIdentity(); // zurücksetzen

glTranslatef(3.0f,0.0f,-9.0f);
// 3 Einheiten nach rechts, 9 Einheiten "in" den Schirm

glRotatef(rachteck,0.0f,0.0f,1.0f); // Das Achteck soll um die Z-Achse rotiert werden
glBegin(GL_POLYGON); // Ein Polygon (in diesem Falle ein Achteck.) // jede Ecke bekommt eine andere Farbe glColor3f(1.0f,0.0f,0.0f); // rot glVertex3f(-0.5f, 1.5f, 0.0f); // obere Ecke links glVertex3f( 0.5f, 1.5f, 0.0f); // obere Ecke rechts glColor3f(0.0f,0.0f,1.0f); // blau glVertex3f( 1.5f, 0.5f, 0.0f); // rechte Ecke oben glVertex3f( 1.5f,-0.5f, 0.0f); // rechte Ecke unten glColor3f(0.0f,1.0f,0.0f); // grün glVertex3f( 0.5f,-1.5f, 0.0f); // untere Ecke rechts glVertex3f(-0.5f,-1.5f, 0.0f); // untere Ecke links glColor3f(1.0f,1.0f,0.0f); // gelb glVertex3f(-1.5f,-0.5f, 0.0f); // linke Ecke unten glVertex3f(-1.5f, 0.5f, 0.0f); // linke Ecke oben glEnd(); // Zeichenaktion beenden

Damit sich die Objekte auch die ganze Zeit über drehen muss ihr Drehwinkel bei jedem Durchgang (Frame) verändern. Dies wird in den nächsten Zeilen getan. (Um die Drehgeschwindigkeit zu verändern oder in die entgegengesetzte Richtung drehen zu lassen, können die Werte oder Vorzeichen geändert werden.)
  rdreieck -= 0.4f; 
  // Der Drehwinkel des Dreiecks soll bei 
  // jedem Durchgang um 0,4f verringert werden.

rviereck += 0.7f; // Der Drehwinkel des Vierecks soll bei // jedem Durchgang um 0,7f erhöht werden.
rachteck += 0.56f;
// Der Drehwinkel des Achtecks soll bei // jedem Durchgang um 0,56f erhöht werden werden.
return TRUE; // Alles hat geklappt }

Und auch ein neuer Name muss her ;)

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
  (...) gekürzt

   if (!CreateGLWindow("Opengl Tutorial 3 - Rotation - 
                        www.codeworx.org",640,480,16,fullscreen))
     {
       return 0; // Falls ein Fehler auftrat, beenden
     }

  (...)
 

Auch ein Arbeitsbereich ist wieder verfügbar. In der nächsten Lektion werden 3D-Objekte gezeichnet.