Die Community zu .NET und Classic VB.
Menü

OpenGL in Visual Basic - Rotation und 3D-Objekte

 von 

Ü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.

Beispielprojekt  

Beispielprojekt zum Tutorial [194559 Bytes]

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.