XNA Game Studio 3.0

XNA Game Studio 3.0 lección 3 Simple Animación PDF Imprimir E-mail
1
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

 

Descargar Archivos Nesesarios:

 

  • Codigo Fuente

  • Modelo Helicoptero7

  • Ú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 PDF Imprimir E-mail
    1
    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 PDF Imprimir E-mail
    1
    Escrito por Fernando   
    Lunes, 25 de Mayo de 2009 06:17



    Hola amigos mi nombre es Fernando así que hoy empezaremos con lo que espero sea un proyecto en conjunto para la creación de vídeo juegos en 3d con el programa XNA Game Studio 3.0 de microsoft, en estos días se irán colocando tutoriales básicos he iremos aumentando el nivel hasta terminar un juego en 3d, las sugerencias de que tipo de juego se tiene que crear están abiertas y podéis exponerlas en el foro, Lo que si por favor evitar hacer sugerencias generalizadas la idea de todo esto es aprender a desarrollar un trabajo que sirva ha todo el mundo y no para una sola persona,

    Antes de continuar y esto es muy importante que se sepa un juego no lo hace una persona ""NORMALMENTE"" lo crean varios, pero eso no implica que sea así necesariamente, si quieres crear algo , y esto no solo para hacer juegos, lo primero es la paciencia y el saber estudiar mas no preguntar , Como ya e dicho antes lo que se va exponer aquí tendrán un nivel muy básico hasta llegar a un nivel mayor donde lógicamente tendrán que irse acostumbrando a la forma de trabajar para no retrasar los proyectos expuestos, (no es por nada pero llevo mucho tiempo creando tutoriales aunque de otro tipo,algunos bien con preguntas que se han expuesto en miles de foros, espero que aquí no sea el caso y poder hacer nuestro juego con la gente que realmente le interese y sepa utilizar el google si hace falta XDXD),

    Última actualización el Lunes, 01 de Junio de 2009 21:21
    Leer mas...
     
       

    Articulos Relacionados XNA