Ruotare una piramide sul suo asse Y usando OpenGL
Vai alla navigazione
Vai alla ricerca
Mostreremo un possibile codice, usando OpenGL, con il quale verrà disegnata una piramide con tre facce che ruota in 3D attorno al suo asse verticale centrale (asse 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
Private angle As Float ' Angolo di rotazione della piramide
Public Sub Form_Open()
With Me
.Title = "Piramide a 3 Facce - Rotazione Asse Y"
.Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)
.Arrangement = Arrange.Fill
End With
Timer1.Delay = 16 ' ~60 FPS
Timer1.Start()
End
Public Sub GLArea1_Draw()
' Pulisce il buffer del colore e della profondità (Z-buffer):
GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT)
' Abilita il test di profondità (necessario per disegnare correttamente gli oggetti 3D sovrapposti):
GL.Enable(GL.DEPTH_TEST)
' Imposta la proiezione prospettica:
GL.MatrixMode(GL.PROJECTION)
GL.LoadIdentity()
' FOV 45°, rapporto larghezza/altezza, clip-near = 0.1, clip-far = 100:
Glu.Perspective(45.0, GLArea1.Width / GLArea1.Height, 0.1, 100.0)
' Passa alla modalità MODELVIEW per trasformazioni e disegno: modellazione:
GL.MatrixMode(GL.MODELVIEW)
GL.LoadIdentity()
' Allontana la "telecamera" (ossia l'osservatore) per vedere la scena:
GL.Translatef(0.0, 0.0, -6.0)
' Ruota la piramide intorno all'asse Y (in senso orario):
GL.Rotatef(-angle, 0.0, 1.0, 0.0)
' Inizio disegno triangoli, ossia le facce della piramide):
GL.Begin(GL.TRIANGLES)
' Coordinata del vertice superiore della piramide:
Dim topX As Float = 0.0
Dim topY As Float = 1.0
Dim topZ As Float = 0.0
' Raggio del cerchio base (piano XZ):
Dim r As Float = 1.0
Dim i As Integer
' Ciclo per disegnare 3 facce triangolari:
For i = 0 To 2
' Angoli per due vertici consecutivi sulla base circolare:
Dim angle1 As Float = (i * 2 * Pi) / 3
Dim angle2 As Float = ((i + 1) * 2 * Pi) / 3
' Coordinate dei vertici della base:
Dim x1 As Float = r * Cos(angle1)
Dim z1 As Float = r * Sin(angle1)
Dim x2 As Float = r * Cos(angle2)
Dim z2 As Float = r * Sin(angle2)
' Imposta un colore diverso per ogni faccia triangolare:
Select Case i
Case 0
GL.Color3f(1.0, 0.0, 0.0) ' Rosso
Case 1
GL.Color3f(0.0, 1.0, 0.0) ' Verde
Case 2
GL.Color3f(0.0, 0.0, 1.0) ' Blu
End Select
' Disegna il triangolo (faccia della piramide):
GL.Vertex3f(topX, topY, topZ)
GL.Vertex3f(x1, -1.0, z1)
GL.Vertex3f(x2, -1.0, z2)
Next
' Fine disegno triangoli:
GL.End()
' Forza l'esecuzione immediata dei comandi OpenGL:
GL.Flush()
End
Public Sub Timer1_Timer()
' Incrementa l'angolo di rotazione:
angle += 1.0
If angle >= 360.0 Then angle = 0
' Richiede il ridisegno della scena:
GLArea1.Refresh()
End