Ruotare un cubo sui suoi assi X e Y usando OpenGL

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca

Mostreremo un possibile codice, usando OpenGL, con il quale verrà disegnato un cubo che ruota in 3D attorno ai suoi assi X e Y.

E' necessario attivare una GLArea, un Timer, il Componente grafico per la compatibilità con OpenGL (ad esempio: gb.gui.qt.opengl), nonché i Componenti:

  • gb.opengl
  • gb.opengl.glu
' Variabile globale per tenere traccia dell'angolo di rotazione:
Private angle As Float


Public Sub Form_Open()

 With Me
   .Center
   .W = 640
   .H = 640
 End With

 With GLArea1
   .X = 0
   .Y = 0
   .W = Me.W
   .H = Me.H
 End With

' Imposta e avvia il timer per animare la rotazione (circa 60 FPS):
 Timer1.Delay = 16
 Timer1.Start

End


Public Sub Timer1_Timer()

' Incrementa l'angolo per la rotazione:
 angle += 1
 If angle >= 360 Then angle = 0
' Chiede il ridisegno → chiamerà "GLArea1_Draw()":
 GLArea1.Refresh

End

 
Public Sub GLArea1_Resize()   ' Evento chiamato quando GLArea viene ridimensionato (es. all'apertura)

' Ottiene larghezza e altezza dell'area di rendering:
 Dim w As Integer = GLArea1.W
 Dim h As Integer = GLArea1.H

' Evita divisione per zero:
 If h = 0 Then h = 1

' Imposta la viewport OpenGL (l'intera area disponibile):
 GL.Viewport(0, 0, w, h)

' Configura la proiezione prospettica (campo visivo, rapporto larghezza/altezza, piani di clipping):
 GL.MatrixMode(GL.PROJECTION)
 GL.LoadIdentity()
 GLU.Perspective(45.0, w / h, 1.0, 100.0)

' Torna alla modalità model-view per il disegno della scena:
 GL.MatrixMode(GL.MODELVIEW)

End


Public Sub GLArea1_Draw()   ' Evento dove viene disegnata la scena 3D (è il cuore del rendering)

' Pulisce il buffer colore e profondità:
 GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT)

' Abilita il test di profondità per corretto disegno 3D:
 GL.Enable(GL.DEPTH_TEST)

' Imposta il colore di sfondo (grigio/blu chiaro):
 GL.ClearColor(0.1, 0.1, 0.1, 1.0)

' Reset della matrice di trasformazione:
 GL.LoadIdentity()

' Allontana la camera per vedere l'intero cubo:
 GL.Translatef(0.0, 0.0, -8.0)

' Applica una rotazione del cubo attorno a X e Y:
 GL.Rotatef(angle, 1.0, 1.0, 0.0)

' Disegna il cubo colorato:
 DrawCube()

' Assicura che il rendering venga eseguito subito:
 GL.Flush()

End


Private Procedure DrawCube()   ' Procedura che disegna un cubo a sei facce, ciascuna con un colore diverso:

' Vertici del cubo (8 in totale):
 Dim vertices As Float[][] = [[-1.0, -1.0, -1.0], [1.0, -1.0, -1.0], [1.0, 1.0, -1.0], [-1.0, 1.0, -1.0],
                              [-1.0, -1.0, 1.0], [1.0, -1.0, 1.0], [1.0, 1.0, 1.0], [-1.0, 1.0, 1.0]]

' Indici dei vertici che compongono le 6 facce del cubo:
 Dim faces As Integer[][] = [[0, 1, 2, 3],  ' retro
                             [1, 5, 6, 2],  ' destra
                             [5, 4, 7, 6],  ' fronte
                             [4, 0, 3, 7],  ' sinistra
                             [3, 2, 6, 7],  ' alto
                             [0, 4, 5, 1]]  ' basso

' Colori diversi per ogni faccia del cubo:
 Dim colors As Float[][] = [[1.0, 0.0, 0.0],  ' rosso
                            [0.0, 1.0, 0.0],   ' verde
                            [0.0, 0.0, 1.0],   ' blu
                            [1.0, 1.0, 0.0],   ' giallo
                            [1.0, 0.0, 1.0],   ' magenta
                            [0.0, 1.0, 1.0]]   ' ciano

' Ciclo per disegnare ciascuna delle sei facce:
 Dim i, j As Integer

 For i = 0 To 5
' Imposta il colore della faccia:
   GL.Color3f(colors[i][0], colors[i][1], colors[i][2])
' Inizio disegno di un quadrilatero:
   GL.Begin(GL.QUADS)
' Disegna i quattro vertici della faccia corrente:
   For j = 0 To 3
     GL.Vertex3f(vertices[faces[i][j]][0], vertices[faces[i][j]][1], vertices[faces[i][j]][2])
   Next
   GL.End
 Next

End