Ruotare un triangolo intorno alla propria altezza usando OpenGL
Vai alla navigazione
Vai alla ricerca
Mostreremo un possibile codice, usando OpenGL, con il quale verrà disegnato un triangolo isoscele con base orizzontale che ruota in 3D intorno alla propria altezza.
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
Private angle As Float Public Sub Form_Open() With Me .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight) .Arrangement = Arrange.Fill End With Timer1.Delay = 8 Timer1.Start End Public Sub Timer1_Timer() ' Angolo di rotazione (maggiore è il valore, più velocemente appare ruotare): angle += 2 If angle >= 360 Then angle = 0 GLArea1.Refresh End Public Sub GLArea1_Resize() ' Ottiene la larghezza (w) e l’altezza (h) correnti della GLArea1: Dim w As Integer = GLArea1.Width Dim h As Integer = GLArea1.Height ' Evita divisione per zero nella Perspective() (nel caso l'altezza sia 0): If h = 0 Then h = 1 ' Imposta la finestra di disegno OpenGL: da (0,0) (angolo in basso a sinistra) fino a (w,h): GL.Viewport(0, 0, w, h) ' Seleziona la matrice di proiezione, usata per impostare la prospettiva 3D: GL.MatrixMode(GL.PROJECTION) ' Azzera la matrice di proiezione (equivalente a "resetta" la camera): GL.LoadIdentity() ' Applica una proiezione prospettica. ' 45° di campo visivo verticale; ' w / h: rapporto tra larghezza e altezza ' 0.1: distanza minima visibile(near plane) ' 100.0: distanza massima visibile(far plane) GLU.Perspective(45.0, w / h, 0.1, 100.0) ' Torna alla matrice di modellazione, usata per posizionare oggetti e camera: GL.MatrixMode(GL.MODELVIEW) ' Azzera anche la matrice di modellazione, preparando per un nuovo frame: GL.LoadIdentity() End Public Sub GLArea1_Draw() ' Impostazione della scena ' Imposta il colore di sfondo: nero opaco (RGBA: 0,0,0,1): GL.ClearColor(0.0, 0.0, 0.0, 1.0) ' Pulisce:il buffer dei colori (schermo) e il depth buffer (z-buffer, profondità): GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT) ' Abilita il confronto di profondità per il corretto disegno in 3D: GL.Enable(GL.DEPTH_TEST) ' Camera ' Azzera la matrice di modellazione: GL.LoadIdentity() ' Sposta la camera indietro di 6 unità lungo Z, per vedere gli oggetti: GL.Translatef(0.0, 0.0, -6.0) ' Ruota il triangolo attorno all’asse Y, di un angolo variabile (angle): GL.Rotatef(angle, 0.0, 1.0, 0.0) ' Luce ' Abilita il sistema di illuminazione base di OpenGL, usando la luce 0: GL.Enable(GL.LIGHTING) GL.Enable(GL.LIGHT0) ' Crea un array che definisce la posizione della luce 0: Dim lightPos As Float[] = [2.0, 2.0, 2.0, 0.0] ' Applica la posizione alla luce LIGHT0: GL.Lightfv(GL.LIGHT0, GL.POSITION, lightPos) ' Materiale ' Definisce il colore diffuso del materiale: un azzurro chiaro: Dim mat_diff As Float[] = [0.4, 0.7, 1.0, 1.0] ' Applica quel colore a entrambi i lati del triangolo: GL.Materialfv(GL.FRONT_AND_BACK, GL.DIFFUSE, mat_diff) ' Triangolo semplice ' Inizia il disegno di un triangolo: GL.Begin(GL.TRIANGLES) ' Imposta la normale della superficie (per la luce): qui punta verso lo spettatore (asse Z+): GL.Normal3f(0.0, 0.0, 1.0) ' I tre vertici del triangolo. ' Si disegna un triangolo isoscele con base orizzontale: GL.Vertex3f(-1.0, -1.0, 0.0) GL.Vertex3f(1.0, -1.0, 0.0) GL.Vertex3f(0.0, 1.0, 0.0) GL.End() ' Disattiva il sistema di luci per disegni successivi (se ce ne sono): GL.Disable(GL.LIGHTING) ' Forza l’esecuzione immediata di tutti i comandi di rendering in coda: GL.Flush End