lunes, 24 de junio de 2013

4 .-. Renderizado y Movimiento de la Cámara. (II)

Bien la clase de hoy va a ser larga pero vamos a ver cosas en pantalla (por fin). Mi objetivo es dotar a la aplicación de una funcionalidad básica en cuanto a teclas se refiere que permitan mover la cámara, añadir luces a nuestra escena y dibujar una caja en medio.



Lo primero será establecer una posición inicial para la cámara, para eso iremos al evento LOAD del FORM1 y, escribiremos lo siguiente después de Engine.PosConfigurarDX(Dispo3D)

            PosicionCamara = New Vector3(0, 0, -2)
            Start = True


Start es una variable que controla que todo el proceso de inicio se ha completado correctamente, si start = true el Bucle comenzará a funcionar.

Recordais que, PosicionCamara es un Vector de 3 Coordenadas (X,Y,Z) pues bien de momento le vamos a decir que sus coordenadas son 0,0,-2 es decir, para que tengáis una referencia de vuestra pantalla: la X+ es hacia la derecha del monitor, la X- es hacia la izquierda. La Y+ es hacia arriba en el monitor, Y- es hacia abajo en el monitor. Z+ es hacia adentro de la pantalla y Z- es hacia afuera de la pantalla, hacia donde estáis ahora sentados.

Si coloco la cámara en Z=-2 estoy situándola en un punto entre vuestros ojos y el centro de coordenadas.

Bien, a continuación vamos a crear unas teclas para poder mover la cámara un poco, para esto tenemos que ir al evento KEYDOWN del FORM1 y dejar la instrucción SELECT que hicimos antes como esto.

 Select Case e.KeyCode
                Case Keys.Escape
                    Engine.Finalizar(Dispo3D)
                Case Keys.W
                    PosicionCamara.Z += 1
                Case Keys.S
                    PosicionCamara.Z -= 1
                Case Keys.A
                    PosicionCamara.X -= 1
                Case Keys.D
                    PosicionCamara.X += 1
                Case Keys.Q
                    PosicionCamara.Y += 1
                Case Keys.Z
                    PosicionCamara.Y -= 1
  End Select


¿Qué estamos haciendo?

Bien, al pulsar la W lo que hacemos es que le decimos al programa que queremos ir "hacia adentro de la pantalla", es decir, queremos mover la cámara en esa dirección que es la Z+ por eso le sumamos uno.
Al pulsar la S queremos hacer lo contrario, volver hacia donde estamos ahora, hacia afuera de la pantalla. La Z baja uno.
De forma similar ocurre con A y D que restan o suman en el eje de las X y con Q y Z que suman o restan en el eje Y.
Definitivamente, al pulsar las teclas simplemente cambiamos la posición de la cámara.

Vamos ahora a intentar dibujar algo para probar nuestra cámara.

Lo primero que vamos a hacer en Motor es definir un objeto de tipo Material y otro de tipo Mesh. En las declaraciones arriba de todo.

    Private MAterial As New Material()
    Private Caja As Mesh


Un material, es como su nombre indica, un tipo de objeto que va a definir como refleja la luz un determinado objeto. Una Mesh es una malla que, basicamente es una forma compuesta por muchos triángulos y, generalmente, generada con un software específico como 3Ds o Blender)

Ahora vamos a PosConfigurarDX dentro de Motor y le añadimos estas líneas hacia el final.

            MAterial.Diffuse = Color.Green            MAterial.Ambient = Color.White

            Caja = Mesh.Box(DP3, 1, 1, 1)


Con esto estamos diciendo que nuestro material reflejará la luz difusa como verde y la ambiental como el color de la luz ambiental. Por otra parte caja es una nueva Mesh de tipo Box que tiene 1 de lado, para entendernos, un dado o cubo.

La última cosa que tenemos que hacer para renderizar la caja es ir a Render, dentro de Motor y escibir para dejarlo como este:

            DP3.Clear(ClearFlags.Target, Color.Black, 1.0F, 0)
            DP3.BeginScene()
            DP3.VertexFormat = CustomVertex.PositionColored.Format
            DP3.Material = MAterial
            DP3.Transform.World = Matrix.Translation(0, 0, 0)
            Caja.DrawSubset(0)
            DP3.EndScene()
            DP3.Present()


 Aquí informamos al Device DP3 que el material que vamos a usar es "Material",  trasladamos para pintar al origen de coordenadas y, mediante DrawSubSet(0) dibujamos la caja.

Como habréis podido comprobar al ejecutar, no se ve nada. ¿Qué ocurre? Nada simplemente que no hay luz. Vamos a solventarlo de inmediato.

No hay comentarios:

Publicar un comentario