OpenGl Kamera für Anfänger

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

Boris1993

Betreff: OpenGl Kamera für Anfänger

BeitragDi, Apr 10, 2012 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Liebe Community

Hier eine einfache OpenGl Kamera von mir in BMax geschrieben
Dieser Code soll Anfängern mit BlitzMax und OpenGL helfen.
Da ich selbst noch ein Anfänger bin sind auch Verbesserungsvorschläge erwünscht Smile

Code: [AUSKLAPPEN]

Strict

'-----Variablen-----
Const b:Int = 800                  'Breite des Fensters
Const h:Int = 600                  'Höhe des Fensters
Global mxs:Float                  'MausXGeschwindigkeit
Global mys:Float                  'MausYGeschwindigkeit

'-----Initialisierung-----
GLGraphics b, h                  'OpenGL Grafikfenster
glEnable GL_DEPTH_TEST               'Ermöglicht Tiefentest
glMatrixMode GL_PROJECTION            'Wählt Projektionsmatrix
glLoadIdentity()                  'Setzt Projektionsmatrix zurück
gluPerspective 45.0, b/h, 0.1, 1000      'Setzt Perspektive in der Matrix      
glMatrixMode GL_MODELVIEW            'Wählt Modellansicht Matrix
glLoadIdentity()                  'Setzt Modellansicht Matrix zurück

HideMouse()                     'Versteckt den Mauszeiger

'-----Types-----
Type KameraT
   Field x:Float               'X-Koordinate der Kamera
   Field y:Float               'Y-Koordinate der Kamera
   Field z:Float               'Z-Koordinate der Kamera
   Field pitch:Float               'Drehwinkel der Kamera auf der X-Achse
   Field yaw:Float               'Drehwinkel der Kamera auf der Y-Achse
   Field roll:Float               'Drehwinkel der Kamera auf der Z-Achse
   
   'Funktion zur Steuerung der Kamera
   Method Steuerung()            
      yaw:+mxs/10               'Mausbewegung wird auf den Kamerawinkel übertragen
      If yaw< 0 yaw:+360         'Zurücksetzen des Wertes 0 Grad unterschritten wird
      If yaw >360 yaw:-360         'Zurücksetzen des Wertes wenn 360 Grad überschritten wird
      pitch:+mys/10            
      If pitch< 0 pitch:+360         
      If pitch >360 pitch:-360      
      
      If KeyDown(KEY_W) Then         
         x:+Cos(yaw+90)/6         'Berechnung der Bewegungsrichtung anhand des Yaw Winkels
         z:+Sin(yaw+90)/6
      End If
      If KeyDown(KEY_S) Then
         x:-Cos(yaw+90)/6
         z:-Sin(yaw+90)/6
      End If
      If KeyDown(KEY_D) Then
         x:-Cos(yaw)/6
         z:-Sin(yaw)/6
      EndIf
      If KeyDown(KEY_A) Then
         x:+Cos(yaw)/6
         z:+Sin(yaw)/6
      End If
   EndMethod
   
   'Funktion zum updaten der Kameramatrix
   Method update()
      glloadidentity                           
      glrotatef cam.pitch, 1.0, 0.0, 0.0         'Rotation wird auf die Perspektivmatrix übertragen
      glrotatef cam.yaw, 0.0, 1.0, 0.0
      glrotatef cam.roll, 0.0, 0.0, 1.0
      gltranslatef cam.x, cam.y, cam.z         'Bewegung wird auf die Perspektivmatrix übertragen
   End Method
End Type
Global cam:KameraT = New KameraT

'-----Hauptschleife-----
While Not KeyHit(KEY_ESCAPE)
   glClear GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT   'Löscht Farb- und Tiefenbuffer
   
   cam.Steuerung()
   cam.update()
   
   'Würfel wird erstellt und um 10 Einheiten vor die Kamera verschoben
   gltranslatef 0, 0,-10
   
   glBegin GL_QUADS   
      'Vorderseite
      glColor3f   1.0, 0.0, 0.0            'Farbe des Quads wird Festgelegt
      glVertex3f -1.0, 1.0, 1.0            'Quad Vertices werden erstellt
      glVertex3f  1.0, 1.0, 1.0
      glVertex3f  1.0,-1.0, 1.0
      glVertex3f -1.0,-1.0, 1.0
      'Rückseite
      glColor3f   0.0, 1.0, 0.0
      glVertex3f -1.0, 1.0,-1.0
      glVertex3f  1.0, 1.0,-1.0
      glVertex3f  1.0,-1.0,-1.0
      glVertex3f -1.0,-1.0,-1.0
      'Oberseite
      glColor3f   0.0, 0.0, 1.0         
      glVertex3f -1.0, 1.0,-1.0
      glVertex3f  1.0, 1.0,-1.0
      glVertex3f  1.0, 1.0, 1.0
      glVertex3f -1.0, 1.0, 1.0
      'Unterseite
      glColor3f   1.0, 1.0, 0.0
      glVertex3f -1.0,-1.0,-1.0
      glVertex3f  1.0,-1.0,-1.0
      glVertex3f  1.0,-1.0, 1.0
      glVertex3f -1.0,-1.0, 1.0
      'Rechte Seite
      glColor3f   1.0, 0.0, 1.0
      glVertex3f  1.0, 1.0,-1.0
      glVertex3f  1.0, 1.0, 1.0
      glVertex3f  1.0,-1.0, 1.0
      glVertex3f  1.0,-1.0,-1.0
      'Linke Seite
      glColor3f   0.0, 1.0, 1.0
      glVertex3f -1.0, 1.0,-1.0
      glVertex3f -1.0, 1.0, 1.0
      glVertex3f -1.0,-1.0, 1.0
      glVertex3f -1.0,-1.0,-1.0
         
   glEnd
   
   'Mausgeschwindigkeit der x- und y-Achse wird an Variablen übergeben
   'und der Mauszeiger in die Mitte des Bildschirms gerückt
   mxs = MouseXSpeed()
   mys = MouseYSpeed()
   MoveMouse 400,300
   MouseXSpeed()      'damit durch Movemouse der Wert nicht verschluckt wird
   MouseYSpeed()
   
   'Textausgabe im Fenster der Die Kameraposition und Drehung anzeigt
   glcolor3f 1.0, 1.0, 1.0
   GLDrawText "X: "+cam.x+", Y: "+cam.y+", Z: "+cam.z, 20, 20
   GLDrawText "Pitch: "+cam.pitch+", Yaw: "+cam.yaw+", Roll: "+cam.roll, 20, 36
   GLDrawText "Steuerung mit Maus und WASD", 20, 68
   
   Flip
Wend

End




LG und viel Spaß mit dem Code Very Happy
 

Shaman

BeitragMi, Apr 11, 2012 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
sieht für mich sehr ordentlich und in Ordnung aus.
Vielleicht kannst du noch Methoden hinzufügen, mit denen du die Kamera direkt drehen/bewegen kannst.
 

Boris1993

BeitragDi, Apr 17, 2012 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
was meinst du mit direkt drehen/bewegen shaman?
 

Shaman

BeitragDi, Apr 17, 2012 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
In der Methode "Steuerung" bewegst/drehst du die Kamera durch direkten Zugriff auf die Variablen.
Eine Möglichkeit währe es, nicht auf die Variablen direkt zuzugreifen, sondern über Methoden, wie
rotate(pitch, yaw, roll), move(x,y,z), ... .
Damit könnte man die Kamera dann z.B. auch per Skript steuern.
Dadurch könnte es ein guter Ausgangspunkt für OpenGL Spiele/Engines werden, die sich selbst die von grund auf bauen wollen

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group