Ruotare un cubo sui suoi assi X e Y usando OpenGL
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