Lektion 3"Farben und Formen"
- Download des Arbeitsbereiches
In dieser Lektion wird es um drei wichtige Grundformen gehen, Dreiecke, Vierecke
und Polygone. Und da es ziemlich eintönig ohne wäre, kommt auch gleich
etwas Farbe ins Spiel ;)
In diesem und in allen weiteren Tutorials dieser Reiher wird der Quelltext
der ersten Lektion das Grundgerüst bilden. Jetzt wird besonders die Prozedur
DrawGLScene() erweitert werden, in der alle auf dem Bildschirm letztendlich
sichtbaren Formen und Farben stehen. Die betreffenden Zeilen des letzten Tutorials
können einfach durch die neuen ersetzt werden.
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
Um eine Form am Koordinatenursprung (0.0f, 0.0f, 0.0f) (Die "Kreuzung"
der drei Achsen) ausgeben zu können, wird mit Hilfe von glLoadIdentity()
auf diesen Punkt zurückgesetzt, der genau in der Mitte des Fensters liegt.
(Das Koordinatensystem in OpenGL wird im Glossar
erläutert)
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.)
Mit glTranslatef() läßt sich der Zeichner bewegen. Wenn der Zeichner
vorher die Position (1.0f, 2.0f, 3.0f) hatte und jetzt glTranslatef(-1.5f,0.0f,-5.0f);
aufgerufen wird, ist die Position des Zeichners danach (-0.5, 2.0f, -2.0f).
// Der Zeichner hat jetzt die Position:
// (-3.5f,0.0f,-9.0f)
// (Vorher (0.0f, 0.0f, 0.0f))
Mit GL_TRIANGLES wird jetzt ein Dreieck ausgegeben. Dabei müssen die Koordinten
nacheinander angegeben werden. Die übergebenen Werte sind wieder Koordinaten.
Allerdings relativ zu den Koordinaten des Zeichners. (Das häufig und auch
in OpenGL verwendete RGB-Farbmodell wird im Glossar
erläutert)
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
Die Farbe Blau gilt für alle folgenden Punkte, bis eine andere defeniert
wird.
Damit ein Stück weiter die nächste Form gezeichnet werden kann, muss
der Zeichner ein Stück verschoben werden
glTranslatef(3.0f,0.0f,0.0f);
// 3 Einheiten entlang der X-Achse nach rechts bewegen
GL_QUADS zeichnet ein Viereck auf den Bildschirm. Dazu müssen wieder alle
benötigten Koordinaten übergeben 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 beenden
Damit das folgende Ploygon auch genug Platz hat, wird wieder um einige Schritte
verschoben.
glTranslatef(3.5f,0.0f,0.0f);
// 3.5 Einheiten entlang der X-Achse nach rechts bewegen
Ein Polygon kann (theoretisch) unendlich viele Ecken haben, diese müssen
der Reihenfolge nach übergeben werden. Jede Ecke hat jetzt eine eigene Farbe
zugewiesen bekommen, die sich dann in der Mitte mischen.
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
return TRUE; // Alles hat geklappt
}
Da die ganze Sache noch einen neuen Namen braucht, wird dieser noch schnell
geändert.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
(...) gekürzt
if (!CreateGLWindow("Opengl Tutorial 2 - Farben und Formen -
www.codeworx.org",640,480,16,fullscreen))
{
return 0; // Falls ein Fehler auftrat, beenden
}
(...)
So schnell lassen sich recht einfache 2D-Grafiken auf den Schirm bringen! Um
noch etwas Bewegung in das Ganze zu bringen, wird in der nächsten
Lektion die Rotation besprochen. Natürlich sit die Sache auch als Arbeitsbereiches
verfügbar.