OpenGL in Visual Basic - Rotation und 3D-Objekte
von Hans Henning Klein
Übersicht
In diesem Kapitel werden wir sehen, wie sich Objekte im 3D-Raum drehen lassen und wie "echte" 3D-Objekte erstellt werden.
Abbildung 1: Rotierte Polygone im 3D-Raum
Rotation
Kommen wir nun zu echtem 3D und drehen die bisher erstellten Flächen im Raum.
Dazu ist nur ein neuer Befehl notwendig: glRotatef.
glRotatef erwartet vier Parameter. Der erste ist der Winkel, um den das Objekt gedreht werden soll. Die Parameter zwei bis vier geben an, um welche Achse(n) das Objekt gedreht werden soll. Sie entsprechen in dieser Reihenfolge der X-, Y- und Z-Achse und können nur 0 = keine Drehung oder 1 = Drehung um diese Achse sein.
Der entsprechende Code:
Public Sub Main() '--- neuer Code seit Kapitel 1 Static r3eck As GLfloat 'Winkel für das Dreieck Static r4eck As GLfloat 'Winkel für das Viereck '--- Ende neuer Code Dim frm As Form PrgRun = True 'Flag = das Programm läuft Set frm = New Form1 'Fenster für OpenGL-Ausgabe frm.ScaleMode = vbPixels 'das Fenster muß zwingend in Pixel bemessen werden If CreateGLWindow(frm, 640, 480, 16) Then 'Fenster initialisieren Do 'Endlosschleife, in der das Fenster laufend gelöscht und neu aufgebaut wird. 'Die Laufzeit dieser Schleife ist ausschlaggebend, wieviele Objekt gezeichnet werden können glClear clrColorBufferBit Or clrDepthBufferBit ' löscht das Fenster und den Tiefenpuffer glLoadIdentity 'setzt die aktuelle Modell-Matrix zurück 'ab hier zeichnen wir ein Dreieck in unser Fenster glTranslatef -1.5, 0#, -6# 'Setzt den neuen Zeichenpunkt. Ab dieser Koordinate werden nun alle Zeichenoperationen berechnet 'Das heißt wir verschieben den Punkt um 1,5 Einheiten nach Links und 6 Einheiten "in den Bildschirm" '--- neuer Code seit Kapitel 1 glRotatef r3eck, 0#, 1#, 0# 'Drehen des Dreiecks um die Y-Achse '--- Ende neuer Code glBegin bmTriangles 'Anfang eines Dreiecks glColor3f 1#, 0#, 0# 'setzt die Zeichenfarbe auf Rot glVertex3f 0#, 1#, 0# 'obere Ecke glColor3f 0#, 1#, 0# 'setzt die Zeichenfarbe auf Grün glVertex3f -1#, -1#, 0# 'untere linke Ecke glColor3f 0#, 0#, 1# 'setzt die Zeichenfarbe auf Blau glVertex3f 1#, -1#, 0# 'untere rechte Ecke glEnd 'Ende des Dreiecks '--- neuer Code seit Kapitel 1 glLoadIdentity 'setzt die aktuelle Modell-Matrix zurück 'ohne Rücksetzen würde sich das Viereck nicht nur um sich selbst sondern auch 'um das Dreieck drehen. glTranslatef 1.5, 0#, -6# 'Zeichenpunkt vor dem Drehen zurücksetzen 'da wir die gesamte Modell-Matrix zurückgesetzt haben, gehen wir nur vom Nullpunkt aus nach rechts. 'das entspricht dann dem Befehl glTranslatef 3#, 0#, 0# ohne Zurücksetzen glRotatef r4eck, 1#, 0#, 0# 'Drehen des Vierecks um die X-Achse '--- Ende neuer Code glColor3f 0.7, 0.7, 1# 'setzt die Zeichenfarbe einmal auf Hellblau für alle Ecken glBegin bmQuads 'Anfang eines Vierecks glVertex3f -1#, 1#, 0# 'linke obere Ecke glVertex3f 1#, 1#, 0# 'rechte obere Ecke glVertex3f 1#, -1#, 0# 'untere rechte Ecke glVertex3f -1#, -1#, 0# 'untere linke Ecke glEnd 'Ende des Vierecks SwapBuffers frm.hDC 'Puffer tauschen (Double Buffering) DoEvents '--- neuer Code seit Kapitel 1 'damit es eine laufende Drehung wird, ändern wir mit jedem Schleifendurchlauf den Winkel r3eck = r3eck + 0.8 r4eck = r4eck - 0.8 '--- Ende neuer Code Loop While PrgRun 'Programm nur beenden, wenn PrgRun = False 'PrgRun ist Global definiert und wird im KeyDown-Ereignis von Form1 bei drücken von Escape gesetzt. 'alles freigeben und Programm beenden If hrc <> 0 Then 'hatten wir einen Gerätekontext für OpenGL? wglMakeCurrent 0, 0 'Freigeben des Gerätekontexts wglDeleteContext (hrc) 'Freigeben des Renderingkontexts End If Unload frm Set frm = Nothing End End If End Sub
Listing 1: Rotation von Polygonen
Probieren Sie ruhig einiges aus. Sehen Sie sich an, was passiert wenn Sie um eine andere Achse drehen oder um mehrere Achsen. Ändern Sie die Schritte in denen gedreht wird und verfolgen Sie die Änderung im Tempo der Drehung.
3D-Objekte
Nachdem wir etwas Bewegung in unsere einfachen Flächen gebracht haben, erschaffen wir jetzt 3D-Objekte. Ein 3D-Objekt ist eigentlich nur eine Anzahl von Flächen, die so im Raum positioniert wurden, dass sie einen Körper ergeben. Um aus unserem Dreieck eine Pyramide zu machen, müssen wir also nur vier Dreiecke an die entsprechenden Positionen im Raum setzen. Ersetzen Sie den Code für das Dreieck durch den folgenden:
glBegin bmTriangles 'Pyramide glColor3f 1#, 0#, 0# 'setzt die Zeichenfarbe auf Rot glVertex3f 0#, 1#, 0# 'obere Ecke (Vorderansicht) glColor3f 0#, 1#, 0# 'setzt die Zeichenfarbe auf Grün glVertex3f -1#, -1#, 1# 'linke Ecke (Vorderansicht) glColor3f 0#, 0#, 1# 'setzt die Zeichenfarbe auf Blau glVertex3f 1#, -1#, 1# 'rechte Ecke (Vorderansicht) glColor3f 1#, 0#, 0# 'setzt die Zeichenfarbe auf Rot glVertex3f 0#, 1#, 0# 'obere Ecke (rechte Seite) glColor3f 0#, 0#, 1# 'setzt die Zeichenfarbe auf Blau glVertex3f 1#, -1#, 1# 'linke Ecke (rechte Seite) glColor3f 0#, 1#, 0# 'setzt die Zeichenfarbe auf Grün glVertex3f 1#, -1#, -1# 'rechte Ecke (rechte Seite) glColor3f 1#, 0#, 0# 'setzt die Zeichenfarbe auf Rot glVertex3f 0#, 1#, 0# 'obere Ecke (Rückwand) glColor3f 0#, 1#, 0# 'setzt die Zeichenfarbe auf Grün glVertex3f 1#, -1#, -1# 'linke Ecke (Rückwand) glColor3f 0#, 0#, 1# 'setzt die Zeichenfarbe auf Blau glVertex3f -1#, -1#, -1# 'rechte Ecke (Rückwand) glColor3f 1#, 0#, 0# 'setzt die Zeichenfarbe auf Rot glVertex3f 0#, 1#, 0# 'obere Ecke (linke Seite) glColor3f 0#, 0#, 1# 'setzt die Zeichenfarbe auf Blau glVertex3f -1#, -1#, -1# 'linke Ecke (linke Seite) glColor3f 0#, 1#, 0# 'setzt die Zeichenfarbe auf Grün glVertex3f -1#, -1#, 1# 'rechte Ecke (linke Seite) glEnd 'Ende der Pyramide
Listing 2: Erstellung einer Pyramide
Bei genauem Verfolgen des Quellcodes werden Sie bemerkt haben, dass unsere Pyramide keinen Boden hat. Dafür müssten wir entweder zwei weitere Dreiecke oder ein Viereck definieren.
Um aus unserem Viereck einen Würfel zu machen, müssen wir schon sechs Seiten definieren:
glBegin bmQuads 'Anfang eines Würfels glColor3f 0#, 1#, 0# 'Farbe Blau glVertex3f 1#, 1#, -1# 'Oben Rechts (Oberseite) glVertex3f -1#, 1#, -1# 'Oben Links (Oberseite) glVertex3f -1#, 1#, 1# 'Unten Links (Oberseite) glVertex3f 1#, 1#, 1# 'Unten Rechts (Oberseite) glColor3f 1#, 0.5, 0# 'Farbe Orange glVertex3f 1#, -1#, 1# 'Oben Rechts (Unterseite) glVertex3f -1#, -1#, 1# 'Oben Links (Unterseite) glVertex3f -1#, -1#, -1# 'Unten Links (Unterseite) glVertex3f 1#, -1#, -1# 'Unten Rechts (Unterseite) glColor3f 1#, 0#, 0# 'Farbe Rot glVertex3f 1#, 1#, 1# 'Oben Rechts (Vorderseite) glVertex3f -1#, 1#, 1# 'Oben Links (Vorderseite) glVertex3f -1#, -1#, 1# 'Unten Links (Vorderseite) glVertex3f 1#, -1#, 1# 'Unten Rechts (Vorderseite) glColor3f 1#, 1#, 0# 'Farbe Gelb glVertex3f 1#, -1#, -1# 'Unten Links (Rückseite) glVertex3f -1#, -1#, -1# 'Unten Rechts (Rückseite) glVertex3f -1#, 1#, -1# 'Oben Rechts (Rückseite) glVertex3f 1#, 1#, -1# 'Oben Links (Rückseite) glColor3f 0#, 0#, 1# 'Farbe Blau glVertex3f -1#, 1#, 1# 'Oben Rechts (Links) glVertex3f -1#, 1#, -1# 'Oben Links (Links) glVertex3f -1#, -1#, -1# 'Unten Links (Links) glVertex3f -1#, -1#, 1# 'Unten Rechts (Links) glColor3f 1#, 0#, 1# 'Farbe Violett glVertex3f 1#, 1#, -1# 'Oben Rechts (Rechts) glVertex3f 1#, 1#, 1# 'Oben Links (Rechts) glVertex3f 1#, -1#, 1# 'Unten Links (Rechts) glVertex3f 1#, -1#, -1# 'Unten Rechts (Rechts) glEnd 'Ende des Würfels
Listing 3: Erstellung eines Würfels
Es geht weiter
Wie Sie sehen, haben wir mit relativ wenig Mühe bereits zwei animierte 3D-Objekt erschaffen. Damit unsere Objekte nicht weiterhin bunt, aber langweilig wirken, beschäftigen wie uns in Kapitel 3 mit Texture Mapping. Damit lassen sich richtige Bilder auf den Würfel kleben.
Ihre Meinung
Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.