miércoles, 26 de junio de 2013

5 .-. Luces y Sombras. (II)

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

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

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