Ruotare una piramide sul suo asse Y usando OpenGL

Da Gambas-it.org - Wikipedia.
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