Creare con OpenGL un ambiente virtuale 3D: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| (2 versioni intermedie di uno stesso utente non sono mostrate) | |||
| Riga 2: | Riga 2: | ||
Di seguito vediamo alcuni esempi di codice. | Di seguito vediamo alcuni esempi di codice. | ||
<BR>E' necessario attivare una ''GLArea'', un ''Timer'' (laddove previsto nel codice), il Componente grafico per la compatibilità con OpenGL (ad esempio: ''gb.gui.qt.opengl''), nonché i Componenti: | |||
* gb.opengl | |||
* gb.opengl.glu | |||
===Codice essenziale per creare una stanza 3D=== | ===Codice essenziale per creare una stanza 3D=== | ||
| Riga 49: | Riga 52: | ||
' ''Variando Y, l'osservatore si muove verticalmente rispetto alla stanza virtuale;'' | ' ''Variando Y, l'osservatore si muove verticalmente rispetto alla stanza virtuale;'' | ||
' ''Variando Z, l'osservatore si avvicina o si allontana rispetto alla stanza virtuale.''</font> | ' ''Variando Z, l'osservatore si avvicina o si allontana rispetto alla stanza virtuale.''</font> | ||
<FONT Color=gray>' ''L'osservatore posto nel punto (0.0, 0.0, 0.0) è posto sul margine iniziale della stanza, centralmente e sul pavimento.'' | <FONT Color=gray>' ''L'osservatore posto nel punto (0.0, 0.0, 0.0) è posto sul margine iniziale (apertura) della stanza, centralmente e sul pavimento.'' | ||
' '''''Qui trasliamo tutto indietro e leggermente in basso''':''</font> | ' '''''Qui trasliamo tutto indietro e leggermente in basso''':''</font> | ||
GL.Translatef(0.0, -1.0, -4.0) | GL.Translatef(0.0, -1.0, -4.0) | ||
| Riga 61: | Riga 64: | ||
Private | Private Procedure DrawRoom() <FONT Color=gray>' ''Costruisce le pareti, il pavimento e il soffitto della stanza virtuale''</font> | ||
<FONT Color=gray>' ''Parete posteriore:''</font> | <FONT Color=gray>' ''Parete posteriore:''</font> | ||
GL.Color3f(0.5, 0.5, 0.9) | GL.Color3f(0.5, 0.5, 0.9) | ||
GL.Begin(GL.QUADS) | GL.Begin(GL.QUADS) | ||
GL.Vertex3f(-3.0, -2.0, -6.0) | |||
GL.Vertex3f(3.0, -2.0, -6.0) | |||
GL.Vertex3f(3.0, 2.0, -6.0) | |||
GL.Vertex3f(-3.0, 2.0, -6.0) | |||
GL.End | GL.End | ||
| Riga 75: | Riga 78: | ||
GL.Color3f(0.6, 0.4, 0.4) | GL.Color3f(0.6, 0.4, 0.4) | ||
GL.Begin(GL.QUADS) | GL.Begin(GL.QUADS) | ||
GL.Vertex3f(3.0, -2.0, -6.0) | |||
GL.Vertex3f(3.0, -2.0, 0.0) | |||
GL.Vertex3f(3.0, 2.0, 0.0) | |||
GL.Vertex3f(3.0, 2.0, -6.0) | |||
GL.End | GL.End | ||
| Riga 84: | Riga 87: | ||
GL.Color3f(0.4, 0.6, 0.4) | GL.Color3f(0.4, 0.6, 0.4) | ||
GL.Begin(GL.QUADS) | GL.Begin(GL.QUADS) | ||
GL.Vertex3f(-3.0, -2.0, 0.0) | |||
GL.Vertex3f(-3.0, -2.0, -6.0) | |||
GL.Vertex3f(-3.0, 2.0, -6.0) | |||
GL.Vertex3f(-3.0, 2.0, 0.0) | |||
GL.End | GL.End | ||
| Riga 93: | Riga 96: | ||
GL.Color3f(0.7, 0.7, 0.7) | GL.Color3f(0.7, 0.7, 0.7) | ||
GL.Begin(GL.QUADS) | GL.Begin(GL.QUADS) | ||
GL.Vertex3f(-3.0, -2.0, 0.0) | |||
GL.Vertex3f(3.0, -2.0, 0.0) | |||
GL.Vertex3f(3.0, -2.0, -6.0) | |||
GL.Vertex3f(-3.0, -2.0, -6.0) | |||
GL.End | GL.End | ||
| Riga 102: | Riga 105: | ||
GL.Color3f(0.3, 0.3, 0.3) | GL.Color3f(0.3, 0.3, 0.3) | ||
GL.Begin(GL.QUADS) | GL.Begin(GL.QUADS) | ||
GL.Vertex3f(-3.0, 2.0, 0.0) | |||
GL.Vertex3f(3.0, 2.0, 0.0) | |||
GL.Vertex3f(3.0, 2.0, -6.0) | |||
GL.Vertex3f(-3.0, 2.0, -6.0) | |||
GL.End | GL.End | ||
| Riga 111: | Riga 114: | ||
===Far roteare la stanza virtuale=== | |||
In quest'altro esempio l'osservatore sarà posto al centro della stanza che ruoterà intorno a esso. | |||
<FONT Color= | La stanza virtuale avrà le seguenti caratteristiche: | ||
* ''Larghezza'': da x = -3.0 a x = +3.0 → centro orizzontale a x = 0.0 | |||
* ''Altezza'': da y = 0.0(pavimento)a y = 3.0 | |||
* ''Profondità'': da z = 0.0 (apertura) a z = -6.0 (parete di fondo) | |||
Private angleY As Float <FONT Color=gray>' ''Angolo di rotazione attorno all’asse Y'''</font> | |||
Private posX As Float <FONT Color=gray>' ''Posizione orizzontale (X)''</font> | |||
Private posZ As Float = 3.0 <FONT Color=gray>' ''Posizione in profondità (Z)''</font> | |||
Public Sub Form_Open() | |||
With Me | |||
.x = 0 | |||
.y = 0 | |||
.W = Screen.AvailableWidth | |||
.H = Screen.AvailableHeight | |||
.Arrangement = Arrange.Fill | |||
End With | |||
<FONT Color=gray>' ''Timer per l'animazione (rotazione dello sguardo):''</font> | |||
Timer1.Delay = 16 | |||
Timer1.Start | |||
End | |||
Public Sub Timer1_Timer() | |||
angleY += 0.5 | |||
If angleY > 360 Then angleY -= 360 | |||
GLArea1.Refresh | |||
End | |||
Public Sub GLArea1_Resize() | |||
Dim w As Integer = GLArea1.W | |||
Dim h As Integer = GLArea1.H | |||
If h = 0 Then h = 1 | |||
GL.Viewport(0, 0, w, h) | |||
GL.MatrixMode(GL.PROJECTION) | |||
GL.LoadIdentity() | |||
GLU.Perspective(60.0, w / h, 0.1, 100.0) | |||
GL.MatrixMode(GL.MODELVIEW) | |||
End | |||
Public Sub GLArea1_Draw() | |||
GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT) | |||
GL.Enable(GL.DEPTH_TEST) | |||
GL.ClearColor(0.1, 0.1, 0.15, 1.0) | |||
GL.LoadIdentity() | |||
<FONT Color=gray>' ''Ruota lo sguardo prima di muovere l'osservatore:''</font> | |||
GL.Rotatef(angleY, 0.0, 1.0, 0.0) | |||
<FONT Color=gray>' ''Posiziona l'osservatore al centro della stanza.:''</font> | |||
<FONT Color=B22222>' ''(aumentando il 1° argomento (X), l'osservatore si sposta a sinistra nella stanza) | |||
' ''(aumentando il 2° argomento (Y), l'osservatore si sposta in alto nella stanza) | |||
' ''(aumentando il 3° argomento (Z), l'osservatore si sposta in avanti nella stanza).''</font> | |||
GL.Translatef(0.0, -1.5, 3.0) <FONT Color=gray>' ''y = -altezza occhi, z = entra o esce dalla stanza.''</font> | |||
<FONT Color=gray>' ''Disegna la stanza intorno all’osservatore:''</font> | |||
DrawRoom() | |||
GL.Flush | |||
End | |||
Private Procedure DrawRoom() <FONT Color=gray>' ''Costruisce le pareti, il pavimento e il soffitto della stanza virtuale''</font> | |||
<FONT Color=gray>' ''Parete posteriore:''</font> | |||
GL.Color3f(0.5, 0.5, 0.9) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 0.0, -6.0) | |||
GL.Vertex3f(3.0, 0.0, -6.0) | |||
GL.Vertex3f(3.0, 3.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, -6.0) | |||
GL.End | |||
<FONT Color=gray>' ''Parete destra:''</font> | |||
GL.Color3f(0.6, 0.4, 0.4) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(3.0, 0.0, -6.0) | |||
GL.Vertex3f(3.0, 0.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, -6.0) | |||
GL.End | |||
<FONT Color=gray>' ''Parete sinistra:''</font> | |||
GL.Color3f(0.4, 0.6, 0.4) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 0.0, 0.0) | |||
GL.Vertex3f(-3.0, 0.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, 0.0) | |||
GL.End | |||
<FONT Color=gray>' ''Pavimento:''</font> | |||
GL.Color3f(0.7, 0.7, 0.7) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 0.0, 0.0) | |||
GL.Vertex3f(3.0, 0.0, 0.0) | |||
GL.Vertex3f(3.0, 0.0, -6.0) | |||
GL.Vertex3f(-3.0, 0.0, -6.0) | |||
GL.End | |||
<FONT Color=gray>' ''Soffitto (opzionale):''</font> | |||
GL.Color3f(0.8, 0.8, 0.0) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 3.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, -6.0) | |||
GL.End | |||
End | |||
===Consentire lo spostamento arbitrario dell'osservatore all'interno della stanza virtuale=== | |||
In quest'altro esempio l'osservatore avrà la possibilità di muoversi all'interno della stanza usando alcuni tasti della tastiera: | |||
* "W" → spostamento in avanti; | |||
* "S" → spostamento in dietro; | |||
* "A" → rotazione in senso antiorario; | |||
* "D" → rotazione in senso orario; | |||
Private angleY As Float <FONT Color=gray>' ''Angolo di rotazione attorno all’asse Y''</font> | |||
Private posX As Float <FONT Color=gray>' ''Posizione orizzontale (X)''</font> | |||
Private posZ As Float = 3.0 <FONT Color=gray>' ''Posizione in profondità (Z)''</font> | |||
Public Sub Form_Open() | |||
With Me | |||
.x = 0 | |||
.y = 0 | |||
.W = Screen.AvailableWidth | |||
.H = Screen.AvailableHeight | |||
.Arrangement = Arrange.Fill | |||
End With | |||
End | |||
Public Sub GLArea1_Resize() | |||
Dim w As Integer = GLArea1.W | |||
Dim h As Integer = GLArea1.H | |||
If h = 0 Then h = 1 | |||
GL.Viewport(0, 0, w, h) | |||
GL.MatrixMode(GL.PROJECTION) | |||
GL.LoadIdentity() | |||
GLU.Perspective(60.0, w / h, 0.1, 100.0) | |||
GL.MatrixMode(GL.MODELVIEW) | |||
End | |||
Public Sub GLArea1_Draw() | |||
GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT) | |||
GL.Enable(GL.DEPTH_TEST) | |||
GL.ClearColor(0.1, 0.1, 0.15, 1.0) | |||
GL.LoadIdentity() | |||
<FONT Color=gray>' ''Applica la rotazione:''</font> | |||
GL.Rotatef(angleY, 0.0, 1.0, 0.0) | |||
<FONT Color=gray>' ''Posiziona l'osservatore al centro della stanza.:''</font> | |||
<FONT Color=B22222>' ''(aumentando il 1° argomento (X), l'osservatore si sposta a sinistra nella stanza) | |||
' ''(aumentando il 2° argomento (Y), l'osservatore si sposta in alto nella stanza) | |||
' ''(aumentando il 3° argomento (Z), l'osservatore si sposta in avanti nella stanza).''</font> | |||
GL.Translatef(-posX, -1.5, posZ) <FONT Color=gray>' ''y = -altezza occhi, z = entra o esce dalla stanza.''</font> | |||
<FONT Color=gray>' ''Disegna la stanza intorno all’osservatore:''</font> | |||
DrawRoom() | |||
GL.Flush | |||
End | |||
Private Procedure DrawRoom() <FONT Color=gray>' ''Costruisce le pareti, il pavimento e il soffitto della stanza virtuale''</font> | |||
<FONT Color=gray>' ''Parete posteriore:''</font> | |||
GL.Color3f(0.5, 0.5, 0.9) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 0.0, -6.0) | |||
GL.Vertex3f(3.0, 0.0, -6.0) | |||
GL.Vertex3f(3.0, 3.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, -6.0) | |||
GL.End | |||
<FONT Color=gray>' ''Parete destra:''</font> | |||
GL.Color3f(0.6, 0.4, 0.4) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(3.0, 0.0, -6.0) | |||
GL.Vertex3f(3.0, 0.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, -6.0) | |||
GL.End | |||
<FONT Color=gray>' ''Parete sinistra:''</font> | |||
GL.Color3f(0.4, 0.6, 0.4) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 0.0, 0.0) | |||
GL.Vertex3f(-3.0, 0.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, 0.0) | |||
GL.End | |||
<FONT Color=gray>' ''Pavimento:''</font> | |||
GL.Color3f(0.7, 0.7, 0.7) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 0.0, 0.0) | |||
GL.Vertex3f(3.0, 0.0, 0.0) | |||
GL.Vertex3f(3.0, 0.0, -6.0) | |||
GL.Vertex3f(-3.0, 0.0, -6.0) | |||
GL.End | |||
<FONT Color=gray>' ''Soffitto (opzionale):''</font> | |||
GL.Color3f(0.8, 0.8, 0.0) | |||
GL.Begin(GL.QUADS) | |||
GL.Vertex3f(-3.0, 3.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, 0.0) | |||
GL.Vertex3f(3.0, 3.0, -6.0) | |||
GL.Vertex3f(-3.0, 3.0, -6.0) | |||
GL.End | |||
End | |||
Public Sub Form_KeyPress() | |||
Dim stepSize As Float = 0.1 | |||
Select Case Key.Code | |||
Case Key["W"] <FONT Color=gray>' ''Sposta in avanti l'osservatore''</font> | |||
posX += Sin(Rad(angleY)) * stepSize | |||
posZ += stepSize | |||
Case Key["S"] <FONT Color=gray>' ''Sposta indietro l'osservatore''</font> | |||
posX -= Sin(Rad(angleY)) * stepSize | |||
posZ -= stepSize | |||
Case Key["A"] <FONT Color=gray>' ''Ruota l'osservatore in senso antiorario''</font> | |||
angleY -= 1 | |||
Case Key["D"] <FONT Color=gray>' ''Ruota l'osservatore in senso orario''</font> | |||
angleY += 1 | |||
End Select | |||
GLArea1.Refresh | |||
End | |||
Versione attuale delle 06:16, 19 lug 2025
Le risorse di OpenGL consentono anche di creare ambienti virtuali 3D, come ad esempio delle stanze e altri scenari all'interno dei quali l'osservatore è apparentemente inserito ed è in grado di muoversi e di agire.
Di seguito vediamo alcuni esempi di codice.
E' necessario attivare una GLArea, un Timer (laddove previsto nel codice), il Componente grafico per la compatibilità con OpenGL (ad esempio: gb.gui.qt.opengl), nonché i Componenti:
- gb.opengl
- gb.opengl.glu
Codice essenziale per creare una stanza 3D
Public Sub Form_Open() With Me .x = 0 .y = 0 .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With End Public Sub GLArea1_Resize() ' Imposta la proiezione prospettica Dim w As Integer = GLArea1.W Dim h As Integer = GLArea1.H If h = 0 Then h = 1 GL.Viewport(0, 0, w, h) GL.MatrixMode(GL.PROJECTION) GL.LoadIdentity() GLU.Perspective(60.0, w / h, 0.1, 100.0) GL.MatrixMode(GL.MODELVIEW) End Public Sub GLArea1_Draw() ' Disegna la scena fissa (visuale rispetto alla stanza) GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT) GL.Enable(GL.DEPTH_TEST) ' Colore di sfondo: GL.ClearColor(0.2, 0.2, 0.25, 1.0) ' Ripristina la trasformazione base: GL.LoadIdentity() ' Posiziona la scena rispetto all'osservatore nel punto definito da X, Y, Z. ' Variando X, l'osservatore si muove lateralmente rispetto alla stanza virtuale; ' Variando Y, l'osservatore si muove verticalmente rispetto alla stanza virtuale; ' Variando Z, l'osservatore si avvicina o si allontana rispetto alla stanza virtuale. ' L'osservatore posto nel punto (0.0, 0.0, 0.0) è posto sul margine iniziale (apertura) della stanza, centralmente e sul pavimento. ' Qui trasliamo tutto indietro e leggermente in basso: GL.Translatef(0.0, -1.0, -4.0) ' Disegna la stanza: DrawRoom() GL.Flush End Private Procedure DrawRoom() ' Costruisce le pareti, il pavimento e il soffitto della stanza virtuale ' Parete posteriore: GL.Color3f(0.5, 0.5, 0.9) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, -2.0, -6.0) GL.Vertex3f(3.0, -2.0, -6.0) GL.Vertex3f(3.0, 2.0, -6.0) GL.Vertex3f(-3.0, 2.0, -6.0) GL.End ' Parete destra: GL.Color3f(0.6, 0.4, 0.4) GL.Begin(GL.QUADS) GL.Vertex3f(3.0, -2.0, -6.0) GL.Vertex3f(3.0, -2.0, 0.0) GL.Vertex3f(3.0, 2.0, 0.0) GL.Vertex3f(3.0, 2.0, -6.0) GL.End ' Parete sinistra: GL.Color3f(0.4, 0.6, 0.4) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, -2.0, 0.0) GL.Vertex3f(-3.0, -2.0, -6.0) GL.Vertex3f(-3.0, 2.0, -6.0) GL.Vertex3f(-3.0, 2.0, 0.0) GL.End ' Pavimento: GL.Color3f(0.7, 0.7, 0.7) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, -2.0, 0.0) GL.Vertex3f(3.0, -2.0, 0.0) GL.Vertex3f(3.0, -2.0, -6.0) GL.Vertex3f(-3.0, -2.0, -6.0) GL.End ' (Facoltativo) Soffitto: GL.Color3f(0.3, 0.3, 0.3) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, 2.0, 0.0) GL.Vertex3f(3.0, 2.0, 0.0) GL.Vertex3f(3.0, 2.0, -6.0) GL.Vertex3f(-3.0, 2.0, -6.0) GL.End End
Far roteare la stanza virtuale
In quest'altro esempio l'osservatore sarà posto al centro della stanza che ruoterà intorno a esso.
La stanza virtuale avrà le seguenti caratteristiche:
- Larghezza: da x = -3.0 a x = +3.0 → centro orizzontale a x = 0.0
- Altezza: da y = 0.0(pavimento)a y = 3.0
- Profondità: da z = 0.0 (apertura) a z = -6.0 (parete di fondo)
Private angleY As Float ' Angolo di rotazione attorno all’asse Y' Private posX As Float ' Posizione orizzontale (X) Private posZ As Float = 3.0 ' Posizione in profondità (Z) Public Sub Form_Open() With Me .x = 0 .y = 0 .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With ' Timer per l'animazione (rotazione dello sguardo): Timer1.Delay = 16 Timer1.Start End Public Sub Timer1_Timer() angleY += 0.5 If angleY > 360 Then angleY -= 360 GLArea1.Refresh End Public Sub GLArea1_Resize() Dim w As Integer = GLArea1.W Dim h As Integer = GLArea1.H If h = 0 Then h = 1 GL.Viewport(0, 0, w, h) GL.MatrixMode(GL.PROJECTION) GL.LoadIdentity() GLU.Perspective(60.0, w / h, 0.1, 100.0) GL.MatrixMode(GL.MODELVIEW) End Public Sub GLArea1_Draw() GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT) GL.Enable(GL.DEPTH_TEST) GL.ClearColor(0.1, 0.1, 0.15, 1.0) GL.LoadIdentity() ' Ruota lo sguardo prima di muovere l'osservatore: GL.Rotatef(angleY, 0.0, 1.0, 0.0) ' Posiziona l'osservatore al centro della stanza.: ' (aumentando il 1° argomento (X), l'osservatore si sposta a sinistra nella stanza) ' (aumentando il 2° argomento (Y), l'osservatore si sposta in alto nella stanza) ' (aumentando il 3° argomento (Z), l'osservatore si sposta in avanti nella stanza). GL.Translatef(0.0, -1.5, 3.0) ' y = -altezza occhi, z = entra o esce dalla stanza. ' Disegna la stanza intorno all’osservatore: DrawRoom() GL.Flush End Private Procedure DrawRoom() ' Costruisce le pareti, il pavimento e il soffitto della stanza virtuale ' Parete posteriore: GL.Color3f(0.5, 0.5, 0.9) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, 0.0, -6.0) GL.Vertex3f(3.0, 0.0, -6.0) GL.Vertex3f(3.0, 3.0, -6.0) GL.Vertex3f(-3.0, 3.0, -6.0) GL.End ' Parete destra: GL.Color3f(0.6, 0.4, 0.4) GL.Begin(GL.QUADS) GL.Vertex3f(3.0, 0.0, -6.0) GL.Vertex3f(3.0, 0.0, 0.0) GL.Vertex3f(3.0, 3.0, 0.0) GL.Vertex3f(3.0, 3.0, -6.0) GL.End ' Parete sinistra: GL.Color3f(0.4, 0.6, 0.4) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, 0.0, 0.0) GL.Vertex3f(-3.0, 0.0, -6.0) GL.Vertex3f(-3.0, 3.0, -6.0) GL.Vertex3f(-3.0, 3.0, 0.0) GL.End ' Pavimento: GL.Color3f(0.7, 0.7, 0.7) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, 0.0, 0.0) GL.Vertex3f(3.0, 0.0, 0.0) GL.Vertex3f(3.0, 0.0, -6.0) GL.Vertex3f(-3.0, 0.0, -6.0) GL.End ' Soffitto (opzionale): GL.Color3f(0.8, 0.8, 0.0) GL.Begin(GL.QUADS) GL.Vertex3f(-3.0, 3.0, 0.0) GL.Vertex3f(3.0, 3.0, 0.0) GL.Vertex3f(3.0, 3.0, -6.0) GL.Vertex3f(-3.0, 3.0, -6.0) GL.End End
Consentire lo spostamento arbitrario dell'osservatore all'interno della stanza virtuale
In quest'altro esempio l'osservatore avrà la possibilità di muoversi all'interno della stanza usando alcuni tasti della tastiera:
- "W" → spostamento in avanti;
- "S" → spostamento in dietro;
- "A" → rotazione in senso antiorario;
- "D" → rotazione in senso orario;
Private angleY As Float ' Angolo di rotazione attorno all’asse Y
Private posX As Float ' Posizione orizzontale (X)
Private posZ As Float = 3.0 ' Posizione in profondità (Z)
Public Sub Form_Open()
With Me
.x = 0
.y = 0
.W = Screen.AvailableWidth
.H = Screen.AvailableHeight
.Arrangement = Arrange.Fill
End With
End
Public Sub GLArea1_Resize()
Dim w As Integer = GLArea1.W
Dim h As Integer = GLArea1.H
If h = 0 Then h = 1
GL.Viewport(0, 0, w, h)
GL.MatrixMode(GL.PROJECTION)
GL.LoadIdentity()
GLU.Perspective(60.0, w / h, 0.1, 100.0)
GL.MatrixMode(GL.MODELVIEW)
End
Public Sub GLArea1_Draw()
GL.Clear(GL.COLOR_BUFFER_BIT Or GL.DEPTH_BUFFER_BIT)
GL.Enable(GL.DEPTH_TEST)
GL.ClearColor(0.1, 0.1, 0.15, 1.0)
GL.LoadIdentity()
' Applica la rotazione:
GL.Rotatef(angleY, 0.0, 1.0, 0.0)
' Posiziona l'osservatore al centro della stanza.:
' (aumentando il 1° argomento (X), l'osservatore si sposta a sinistra nella stanza)
' (aumentando il 2° argomento (Y), l'osservatore si sposta in alto nella stanza)
' (aumentando il 3° argomento (Z), l'osservatore si sposta in avanti nella stanza).
GL.Translatef(-posX, -1.5, posZ) ' y = -altezza occhi, z = entra o esce dalla stanza.
' Disegna la stanza intorno all’osservatore:
DrawRoom()
GL.Flush
End
Private Procedure DrawRoom() ' Costruisce le pareti, il pavimento e il soffitto della stanza virtuale
' Parete posteriore:
GL.Color3f(0.5, 0.5, 0.9)
GL.Begin(GL.QUADS)
GL.Vertex3f(-3.0, 0.0, -6.0)
GL.Vertex3f(3.0, 0.0, -6.0)
GL.Vertex3f(3.0, 3.0, -6.0)
GL.Vertex3f(-3.0, 3.0, -6.0)
GL.End
' Parete destra:
GL.Color3f(0.6, 0.4, 0.4)
GL.Begin(GL.QUADS)
GL.Vertex3f(3.0, 0.0, -6.0)
GL.Vertex3f(3.0, 0.0, 0.0)
GL.Vertex3f(3.0, 3.0, 0.0)
GL.Vertex3f(3.0, 3.0, -6.0)
GL.End
' Parete sinistra:
GL.Color3f(0.4, 0.6, 0.4)
GL.Begin(GL.QUADS)
GL.Vertex3f(-3.0, 0.0, 0.0)
GL.Vertex3f(-3.0, 0.0, -6.0)
GL.Vertex3f(-3.0, 3.0, -6.0)
GL.Vertex3f(-3.0, 3.0, 0.0)
GL.End
' Pavimento:
GL.Color3f(0.7, 0.7, 0.7)
GL.Begin(GL.QUADS)
GL.Vertex3f(-3.0, 0.0, 0.0)
GL.Vertex3f(3.0, 0.0, 0.0)
GL.Vertex3f(3.0, 0.0, -6.0)
GL.Vertex3f(-3.0, 0.0, -6.0)
GL.End
' Soffitto (opzionale):
GL.Color3f(0.8, 0.8, 0.0)
GL.Begin(GL.QUADS)
GL.Vertex3f(-3.0, 3.0, 0.0)
GL.Vertex3f(3.0, 3.0, 0.0)
GL.Vertex3f(3.0, 3.0, -6.0)
GL.Vertex3f(-3.0, 3.0, -6.0)
GL.End
End
Public Sub Form_KeyPress()
Dim stepSize As Float = 0.1
Select Case Key.Code
Case Key["W"] ' Sposta in avanti l'osservatore
posX += Sin(Rad(angleY)) * stepSize
posZ += stepSize
Case Key["S"] ' Sposta indietro l'osservatore
posX -= Sin(Rad(angleY)) * stepSize
posZ -= stepSize
Case Key["A"] ' Ruota l'osservatore in senso antiorario
angleY -= 1
Case Key["D"] ' Ruota l'osservatore in senso orario
angleY += 1
End Select
GLArea1.Refresh
End