Por Yolanda Martínez Treviño Vértice – todo en el espacio de 2D ó 3D se representa con puntos. Un punto se define con coordenadas en el espacio de 2D (x,y) y de 3D (x,y,z). En XNA un vértice (o punto) se representa con un vector. Vector – XNA tiene 3 tipos de vectores: ◦ Vector2 – solamente tiene los componentes x, y. ◦ Vector3 – tiene los componentes x, y, z. ◦ Vector4 – tiene 4 elementos. Gráficas 2D Gráficas 3D +x -z +y +y origen (x=0,y=0) -x +x +z -y origen (x=0,y=0,z=0) XNA utiliza un sistema de coordenadas de mano derecha (rigth-handed coordinate system) Y X Z X es positivo a la derecha y negativo a la izquierda. Y es positivo hacia arriba y negativo hacia abajo. Z es positivo hacia el usuario y negativo hacia adentro de la pantalla. Al trabajar en 3D, es necesario cargar los modelos que se van a utilizar (gráfico en 3D). Los formatos que acepta XNA son: ◦ .x ◦ .fbx En XNA una Matriz es un arreglo de 2 dimensiones de 4X4 elementos. La clase se llama Matrix. Los datos contenidos por una matriz se llaman Transformaciones. Las transformaciones más comunes son: ◦ Traslación ◦ Escalamiento ◦ Rotación ◦ Traslación Trasladar un objeto significa moverlo de posición; trasladamos un objeto moviendo cada uno de sus puntos de manera correcta a la nueva posición. ◦ Escalamiento Escalar un objeto significa hacerlo más grande o más pequeño. Esto se hace moviendo los puntos más cerca o más lejos entre ellos dependiendo si se quiere agrandar o disminuir el tamaño. ◦ Rotación Rotar un objeto es girarlo en base a algún eje. A un objeto se le puede aplicar una o varias transformaciones. Una transformación se aplica multiplicando matrices. Podemos aplicar varias matrices de transformación a un objeto multiplicando en el orden deseado. Es muy importante estar conscientes de que la multiplicación de matrices no es conmutativa, por lo que hay que usar el orden adecuado en la multiplicación. Para poder ver los objetos es necesario un grupo de matrices que en conjunto forman la cámara del juego. Estas matrices son: ◦ projection ◦ view ◦ world Projection Esta matriz se utiliza para determinar como se va a desplegar el juego en la pantalla del jugador, y en ella también configuramos que tan lejanas y cercanas sean nuestras tomas de juego. View Esta matriz se utiliza para establecer la posición de la camera, así como también, hacia donde apunta esta. World Es la matriz de estado del mundo que por lo general se inicializa en el origen de el, esto quiere decir que no contiene ninguna de las transformaciones de traslación, escalamiento o rotación. Esta matriz convierte las coordenadas de los modelos y los vértices, para que puedan ser vistos en el mundo 3D. Crear una variable para guardar el modelo: Model modelo; Cargar el modelo dentro del método LoadContent ◦ modelo = Content.Load<Model>("fighter"); Declara las variables para la cámara: ◦ private Matrix projection, view, world; Inicializa estas variables dentro de Initialize: //calculamos el espacio de la vista float aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width / (float)graphics.GraphicsDevice.Viewport.Height; //Creamos nuestra proyeccion Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, 1.0F, 10000.0F, out projection); //Posicion de la camara Vector3 cameraPosition = new Vector3(0.0F, 50.0F, 150.0F); //Direccion de la camara Vector3 cameraTarget = Vector3.Zero; //La Direccion que esta arriba del punto de vista de la cámara Vector3 cameraUpVector = Vector3.Up; //Creamos nuestra vista Matrix.CreateLookAt(ref cameraPosition, ref cameraTarget, ref cameraUpVector, out view); //Obtenemos el estado de nuestro mundo inicial world = Matrix.Identity; // Variables que representan la rotación del modelo protected float rotacionX = 0f; protected float rotacionY = 0f; protected float rotacionZ = 0f; // variables que representan la posición y // velocidad de movimiento protected float velocidad = 1.0f; protected Vector3 posicion = Vector3.Zero; private void DibujaModelo(ref Model m) { Matrix[] transforms = new Matrix[m.Bones.Count]; m.CopyAbsoluteBoneTransformsTo(transforms); foreach (ModelMesh mesh in m.Meshes) { foreach (BasicEffect be in mesh.Effects) { be.EnableDefaultLighting(); be.Projection = projection; be.View = view; be.World = world * Matrix.CreateRotationX(rotacionX) * Matrix.CreateRotationY(rotacionY) * Matrix.CreateRotationZ(rotacionZ) * Matrix.CreateTranslation(posicion); } mesh.Draw(); } } KeyboardState estado = Keyboard.GetState(); // si oprime Escape me salgo del juego if (estado.IsKeyDown(Keys.Escape)) this.Exit(); // si porime la tecla Shift del lado izquierdo hago que la // velocidad sea mayor if (estado.IsKeyDown(Keys.LeftShift)) velocidad = 4; else velocidad = 2; // Si oprime las teclas Left, Rigth, Up y Down // avanza hacia izq, der, adelante y atras if (estado.IsKeyDown(Keys.Left)) { posicion.X -= 0.1f * velocidad; } if (estado.IsKeyDown(Keys.Down)) { posicion.Z += 0.1f * velocidad; } Nota: agrega tu lo que falta // Si oprime las teclas A, D, W, S gira hacia la izq, der, frente, atras if (estado.IsKeyDown(Keys.A)) // izquierda { rotacionZ += 0.1f; } if (estado.IsKeyDown(Keys.S)) // abajo { rotacionX -= 0.1f; } Nota: agrega tu lo que falta