XNA Game Studio 3.0
| XNA Game Studio 3.0 lección 3 Simple Animación |
|
|
|
| Escrito por Fernando | |
| Lunes, 01 de Junio de 2009 23:40 | |
![]() En esta parte de la lección vamos ha hacer una simple animación Antes de proseguir debo aclarar un par de detalles con respecto al tipo de archivo 3d con el que estén trabajando, bueno resulta que el xna no ejecuta las misma animaciones en un archivo .X que en un archivo FBX por lo que me resulta difícil la mejor manera de presentar esta parte de la lección. Los programas de 3d no suelen exportar los archivos de acuerdo a los que necesitamos así que desde el principio debemos tener muy en cuenta con que tipo de archivo vamos ha trabajar,lo recomendable es que si el modelo es estático como puede ser un edificio o algún elemento de decoración y que no tenga que ser animado lo aguáis con archivo .X por la sencilla razón de que pesan menos y esto nos ayuda a reducir el consumo de memoria, si estáis pensando hacer juegos que requieran animaciones complejas lo mejor es el FBX pero tener en cuenta que este tipo de archivo pueden llegar a pesar sobre 10mg y mas si tienen elementos de los bones o animación de skin,he querido explicar la mejor forma de exportar del 3d smax algún modelo pero creo que es mejor que lo hagan personalmente ya que depende de cada uno existe una u otra forma de adaptar dicho modelo. Empezaremos por hacer una animación de un helicóptero,el archivo de ejemplo es un modelo .X que tiene tres mallas que son HeliceP, HeliceS, Fuselaje. Proyecto simpleAnimacion 1-1 Creación de clases la es simplemente el añadir otro archivo .cs como muestra las imágenes en este caso lo vamos a llamar Helicoptero.cs. ![]() ![]() una ves que tengamos el archivo borramos su contenido y añadimos el siguiente código Código : C# using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; using Microsoft.Xna.Framework.Net; using Microsoft.Xna.Framework.Storage; namespace simpleAnimacion { public class Helicoptero { /// <summary> /// Se definen las variables /// </summary> /// variable que contendrá el modelo public Model HeliModel; /// <summary> /// En este grupo de variables se definen cada uno de los elemento dentro del modelo /// en este caso el modelo helicóptero tiene tres mallas que son /// HeliceP - HeliceS - Fuselaje /// </summary> public ModelBone heliceP; public ModelBone heliceS; public ModelBone HelicopteroP; /// <summary> /// Matrices de transformación que servirá para la modificación de cada malla dentro del modelo /// </summary> public Matrix heliceP_Trans; public Matrix heliceS_Trans; public Matrix Helicoptero_Trans; Matrix[] boneTransforms; /// <summary> /// funcion la cual carga el modelo y asigna sus valores a las variable /// </summary> public void carga(Model HelicopteroM) { HeliModel = HelicopteroM; // Seleccionamos las mallas del modelo heliceP = HeliModel.Bones["HeliceP"]; heliceS = HeliModel.Bones["HeliceS"]; HelicopteroP = HeliModel.Bones["Fuselaje"]; // copiamos los valores de transformación de cada elemento heliceP_Trans = heliceP.Transform; heliceS_Trans = heliceS.Transform; Helicoptero_Trans = HelicopteroP.Transform; boneTransforms = new Matrix[HeliModel.Bones.Count]; } /// <summary> /// Con esta función actualizaremos la posición del modelo /// y mostraremos en pantalla /// </summary> public void Draw(Matrix mundo, Matrix vista, Matrix proyeccion) { // cada ves que se actualiza la imagen esta modifica al modelo HeliModel.Root.Transform = mundo; heliceP.Transform = heliceP_Trans; heliceS.Transform = heliceS_Trans; HelicopteroP.Transform = Helicoptero_Trans; HeliModel.CopyAbsoluteBoneTransformsTo(boneTransforms); foreach (ModelMesh mesh in HeliModel.Meshes) { foreach (BasicEffect effect in mesh.Effects) { effect.World = boneTransforms[mesh.ParentBone.Index]; effect.View = vista; effect.Projection = proyeccion; effect.EnableDefaultLighting(); } mesh.Draw(); } } } } Analizado en 0.073 segundos ha 42.36 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com Una ves que tengamos esta clase en el archivo Game1.cs ira este código Código : C# namespace simpleAnimacion { public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; /// <summary> /// Bloque de variables a utilizar /// </summary> Helicoptero ModeloHeli; Matrix proyector; Matrix vista; Matrix mundo; Vector3 vistaCam; float rotarCam; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; //cargamos el modelo a presentar } protected override void Initialize() { base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); ModeloHeli = new Helicoptero(); ModeloHeli.carga(Content.Load<Model>("Modelos\\Helicoptero7")); //Colocamos la carmara vistaCam.Z = 700f; vistaCam.Y = 70f; // Modificamos manualmente las mallas de modelo helicóptero colocando en la posición correcta, // // si trabajas con archivos fbx esto no suele ser necesario ya que automáticamente se colocan es su sitio ModeloHeli.heliceP_Trans = Matrix.CreateTranslation(new Vector3(0,45,12)) * ModeloHeli.heliceP_Trans; ModeloHeli.heliceS_Trans = Matrix.CreateTranslation(new Vector3(-10, 50, 200)) * ModeloHeli.heliceS_Trans; } protected override void UnloadContent() { } protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); //Aqui transformamons las mallas en nuestro caso simplemente las giramos de forma cosnatnte //los rotores del helicoptero ModeloHeli.heliceP_Trans = Matrix.CreateRotationY(1f) * ModeloHeli.heliceP_Trans; ModeloHeli.heliceS_Trans = Matrix.CreateRotationX(1f) * ModeloHeli.heliceS_Trans; //Esta variable nos ayuda a mover la camara alrededor del helicoptero rotarCam += 0.01f; //Define la forma u aspecto en la que se mosatrara el modelo en el mundo proyector = Matrix.CreatePerspectiveFieldOfView( MathHelper.ToRadians(30.0f), graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height, 1.0f, 10000.0f); vista = Matrix.CreateLookAt(vistaCam, Vector3.Zero, Vector3.Up); mundo = Matrix.CreateRotationY(rotarCam) * Matrix.CreateRotationX(0) * Matrix.CreateRotationZ(0) * Matrix.CreateTranslation(Vector3.Zero); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); //Mostramos en pantalla nuestro modelo ModeloHeli.Draw(mundo, vista, proyector); base.Draw(gameTime); } } } Analizado en 0.068 segundos ha 47.68 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com Sencillo verdad XD bueno para mejor organización de los archivos de ejemplo se a creído conveniente separar los modelos he imágenes del código fuente para que puedan ser reutilizados así que simplemente descargarte lo que hay debajo y copia los archivos en sus respectivas carpetas |
|
| Última actualización el Martes, 02 de Junio de 2009 00:02 |
| XNA lección 2 Detectar si el mouse choca con un objeto 3d |
|
|
|
| Escrito por Fernando | |
| Viernes, 29 de Mayo de 2009 04:19 | |
|
XNA Game Studio 3.0 lección 2 En esta lección vamos ha realizar un ejercicio que consiste en detectar si el mouse choca con un objeto 3d 1-1 Primero vamos ha crear un proyecto llamado ClicObj luego importamos en nuestro contenedor un modelo 3d en nuestro caso un cubo, si a veis seguido la lección primera esto no sera difícil Xd ![]() |
|
| Última actualización el Martes, 02 de Junio de 2009 00:01 | |
| Leer mas... |
| XNA Game Studio 3.0 lección 1 Cargar modelos 3D |
|
|
|
| Escrito por Fernando | |
| Lunes, 25 de Mayo de 2009 06:17 | |
|
|
|
| Última actualización el Lunes, 01 de Junio de 2009 21:21 | |
| Leer mas... |







