Bien vamos a jugar un poco con las luces haciendo lo siguiente, iluminar la caja del apartado anterior con tres luces diferentes, la tipo punto que es la que hemos empleado antes, la direccional y la tipo foco. Para adornarlo un poco emplearé las teclas F9, F10 y F11 del teclado para encender o apagar las luces.
F9 .-. Luz Punto.
F10 .-. Luz Dirección
F11 .-. Luz Foco o Spotlight.
Lo primero que vamos a hacer es modificar el Sub Luces de la clase Motor para crear las luces distintas. Debería quedar así.
Public Sub Luces(ByRef DP3 As Direct3D.Device)
Try
DP3.Lights(0).Position = New Vector3(-2, 0, 0)
DP3.Lights(0).Type = LightType.Point
DP3.Lights(0).Range = 2
DP3.Lights(0).Attenuation0 = 0.2
DP3.Lights(0).AmbientColor = Direct3D.ColorValue.FromArgb(Color.Red.ToArgb)
DP3.Lights(0).DiffuseColor = Direct3D.ColorValue.FromArgb(Color.Red.ToArgb)
DP3.Lights(0).Update()
DP3.Lights(1).Direction = New Vector3(2, 0, 0)
DP3.Lights(1).Type = LightType.Directional
DP3.Lights(1).AmbientColor = Direct3D.ColorValue.FromArgb(Color.Green.ToArgb)
DP3.Lights(1).DiffuseColor = Direct3D.ColorValue.FromArgb(Color.Green.ToArgb)
DP3.Lights(1).Update()
DP3.Lights(2).Type = LightType.Spot
DP3.Lights(2).Diffuse = Color.Blue
DP3.Lights(2).Ambient = Color.Blue
DP3.Lights(2).Range = 10
DP3.Lights(2).Direction = New Vector3(0, -1, 0)
DP3.Lights(2).Position = New Vector3(0, 5, 0)
DP3.Lights(2).Falloff = 1
DP3.Lights(2).InnerConeAngle = Geometry.DegreeToRadian(10)
DP3.Lights(2).OuterConeAngle = Geometry.DegreeToRadian(40)
DP3.Lights(2).Attenuation0 = 1
DP3.Lights(2).Update()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Try
DP3.Lights(0).Position = New Vector3(-2, 0, 0)
DP3.Lights(0).Type = LightType.Point
DP3.Lights(0).Range = 2
DP3.Lights(0).Attenuation0 = 0.2
DP3.Lights(0).AmbientColor = Direct3D.ColorValue.FromArgb(Color.Red.ToArgb)
DP3.Lights(0).DiffuseColor = Direct3D.ColorValue.FromArgb(Color.Red.ToArgb)
DP3.Lights(0).Update()
DP3.Lights(1).Direction = New Vector3(2, 0, 0)
DP3.Lights(1).Type = LightType.Directional
DP3.Lights(1).AmbientColor = Direct3D.ColorValue.FromArgb(Color.Green.ToArgb)
DP3.Lights(1).DiffuseColor = Direct3D.ColorValue.FromArgb(Color.Green.ToArgb)
DP3.Lights(1).Update()
DP3.Lights(2).Type = LightType.Spot
DP3.Lights(2).Diffuse = Color.Blue
DP3.Lights(2).Ambient = Color.Blue
DP3.Lights(2).Range = 10
DP3.Lights(2).Direction = New Vector3(0, -1, 0)
DP3.Lights(2).Position = New Vector3(0, 5, 0)
DP3.Lights(2).Falloff = 1
DP3.Lights(2).InnerConeAngle = Geometry.DegreeToRadian(10)
DP3.Lights(2).OuterConeAngle = Geometry.DegreeToRadian(40)
DP3.Lights(2).Attenuation0 = 1
DP3.Lights(2).Update()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Bien, la primera luz es de tipo Point (Punto) y está donde estaba antes a la izquierda, según el X- de la caja y es roja. Las luces de tipo punto irradian en todas direcciones desde su posición. Como veis le he quitado el Enabled.
La segunda luz es de tipo direccional, y este tipo de luces es como el "el mundo emitiese luz" no desde un lugar, sino en una dirección. Sería un efecto parecido a "es de día pero no veo el sol". La fuente de luz no está en un lugar y, como veis no tiene rango ni atenuación.
Por último la luz Spot o de tipo foco. Imaginad un foco de luz como los que hay en los conciertos. Tiene una posición y una dirección pero, al contrario que la luz de punto, no irradia hacia todas partes, aquí la luz tiene forma de cono, y es un cono que en realidad son dos. El cono interior y el exterior. Cada uno de ellos viene definido por un ángulo y, entre las áreas que ilumina cada cono tenemos un efecto FallOff o atenuación. Para intentar visualizarlo mejor os dejo este dibujo.
Para terminar nuestro pequeño experimento luminoso, vamos a FORM1 y, en la sección del evento KeyDown añadimos estas líneas en el select.
Case Keys.F9
If Dispo3D.Lights(0).Enabled = False Then
Dispo3D.Lights(0).Enabled = True
Dispo3D.Lights(0).Update()
Exit Sub
End If
If Dispo3D.Lights(0).Enabled = True Then
Dispo3D.Lights(0).Enabled = False
Dispo3D.Lights(0).Update()
Exit Sub
End If
Case Keys.F10
If Dispo3D.Lights(1).Enabled = False Then
Dispo3D.Lights(1).Enabled = True
Dispo3D.Lights(1).Update()
Exit Sub
End If
If Dispo3D.Lights(1).Enabled = True Then
Dispo3D.Lights(1).Enabled = False
Dispo3D.Lights(1).Update()
Exit Sub
End If
Case Keys.F11
If Dispo3D.Lights(2).Enabled = False Then
Dispo3D.Lights(2).Enabled = True
Dispo3D.Lights(2).Update()
Exit Sub
End If
If Dispo3D.Lights(2).Enabled = True Then
Dispo3D.Lights(2).Enabled = False
Dispo3D.Lights(2).Update()
Exit Sub
End If
If Dispo3D.Lights(0).Enabled = False Then
Dispo3D.Lights(0).Enabled = True
Dispo3D.Lights(0).Update()
Exit Sub
End If
If Dispo3D.Lights(0).Enabled = True Then
Dispo3D.Lights(0).Enabled = False
Dispo3D.Lights(0).Update()
Exit Sub
End If
Case Keys.F10
If Dispo3D.Lights(1).Enabled = False Then
Dispo3D.Lights(1).Enabled = True
Dispo3D.Lights(1).Update()
Exit Sub
End If
If Dispo3D.Lights(1).Enabled = True Then
Dispo3D.Lights(1).Enabled = False
Dispo3D.Lights(1).Update()
Exit Sub
End If
Case Keys.F11
If Dispo3D.Lights(2).Enabled = False Then
Dispo3D.Lights(2).Enabled = True
Dispo3D.Lights(2).Update()
Exit Sub
End If
If Dispo3D.Lights(2).Enabled = True Then
Dispo3D.Lights(2).Enabled = False
Dispo3D.Lights(2).Update()
Exit Sub
End If
Como veis al pulsar cada tecla simplemente activo la luz que le toca o bien la desactivo si ya está activada. Ahora solo queda probar el funcionamiento.
No hay comentarios:
Publicar un comentario