xna 11 - 3d

Anuncio
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
Descargar