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),

HERRAMIENTAS

En esta dirección podrán encortar el XNA con todo lo que hace falta, simplemente descargarte lo que hay en la pagina he instalarlo con eso empezaremos a trabajar

Pack XNA

Los programas básicos para la creación de juegos son editores gráficos y en nuestro caso moldeadores 3d, aunque existen muchos solo utilizaremos

Adobe Photoshop


3ds Max

si utilizas otro tipo de programas se intentara ir acoplando ha ellos lógicamente.

Una ves que tengas instalado el Xna al abrirlo nos encontraremos con un entorno de trabajo parecido a la imagen



Ahora bamos a crear un nuevo proyecto nos sadra algo como esto.



NOTA

Antes que nada vamos ha trastear un poquito el c# xna, primero como veras existen varias opciones Windows Game ·(3.0), Xbox360 , etc etc, de momento se va ha trabajar sobre windows lo de la xbox y zune lo dejaremos para mas adelante, primero porque no todos tenemos una Xbox para ir probando y segundo porque una ves hecho el juego se puede exportar fácilmente a este tipo de maquina, un ves que sepamos el funcionamiento del programa.




Primer Juego: aunque parezca increíble podéis hacer un juego ya simas simplemente selecciona Platformer ponle de nombre que quieras ,se te abrirá una serie de archivos, ahora para correr el juego presiona F5 o has clic sobre el botón iniciar depurador que es una flecha verde, con eso ya tienes el primer juego de plataforma , si quieres modificar los modelos puedes hacerlo, no importa si lo dañas puedes volver a crea un nuevo proyecto y lo tendrás todo restaurado.

Primera lección


Bueno si ya has visto un poco el programa vamos a empezar, primero vamos ha crear herramientas básicas que nos harán falta luego las iremos acoplando a cualquier proyecto que realicemos, en este caso iniciaremos con la importación de modelos 3d hacia el xna estos pequeños ejercicios son muy importantes que lo vayan haciendo desde el principio, pues luego se tiene que ir programado de forma que al final se utilicen funciones pre diseñadas que ahorran significativamente la programación.

Para este ejercicio van a necesitar algunos modelos de prueba aquí les dejo un par de ellos (Descarga archivo de ejemplo), si queréis pueden crear sus propios objetos en 3d simplemente tienen que exportarlo a .fbx que sera el tipo de modelo con el que iremos trabajando, también lo pueden hacer con modelos de tipo .X,

1-1 Crear Proyecto

Creamos un nuevo proyecto con el nombre GaleriaDeModelos seleccionamos Windows Game ·(3.0) por lo general cuando crear un nuevo proyecto vació te tiene que aparecer de esta forma a la derecha tenemos los archivos en el panel Explorador de soluciones aquí se guardaran todos los archivos necesarios para nuestro proyecto.



IMPORTANTE


Normalmente por regla los programadores intentan reducir al máximo las expresiones cuando tratan de referirse a cierto tipo de acciones , si se encuentran con expresiones que no entendéis preguntar en el foro se les explicara detenidamente, un ejemplo de este tipo de excreciones serian algo así :: crear un nuevo proyecto con el nombre xxxx, luego crea una clase con el nombre xxxEfecto, importa al contenedor un modelo xxxTal, crea un objeto de clase tal (que no es lo mismo que crear un modelo tal ) ejecutar , depura , etc etc , este tipo de excreciones serán muy comunes y espero que os familiaricéis ya que son muy importantes y ahorran mucho tiempo, mas que todo nos ayudan a la compresión del flujo de trabajo, como ya dije no dejes de preguntar en el foro así podre ir ampliando y mejorando los tutoriales para que no les complique la vida entenderlos,

 

1.-2 Importación Archivos externos al contenedor

Para trabajar con archivos externos tenemos que incluirlos en el proyecto que realizar la siguiente acción ,seleccionamos la carpeta Content damos al clic derecho Agregar->Nueva Carpeta le ponemos de nombre Modelos,en la carpeta Modelos volvemos a dar clic derecho Agregar -> Elemento existente y nuestros modelos previamente descargados o los que tengan.













 

Explico porque razón incluyo todo el contenido y luego excluyo algunos archivos, es muy simple los modelos tiene texturas, dichas texturas se guardan en la misma carpeta donde esta el modelo, al dar incluir todos los archivos seleccionados se copian de forma física en las cartetas creadas a través del xna, pero si las incluyes dentro del proyecto directamente tira error, ahora el excluir del archivo no el lo mismo que eliminar si eliminas lo haces de forma física, si excluyes los mantiene en la carpeta pero no se muestran dentro del proyecto.

1-3 Insertar código de importación

Abre el archivo Game1.cs dentro ya lleva código, y si veis puesto el nombre que sugerí arriba el archivo tendrá una linea de cogido como esta namespace GaleriaDeModelos, esta linea es muy importarte ya que le dice al programa en que proyecto esta trabajando si fata dicha linea o se ha cambiado tirara el siguiente error ,

 

Error 1 No se puede encontrar el tipo o el nombre de espacio de nombres 'Game1' (¿falta una directiva using o una referencia de ensamblado?)


 

Aquí les dejo el código limpio sin comentarios en ingles para que solo vean el código puro y donde boya ha ir incrustando las nuevas lineas de código y los comentarios de cada una de ella, mas adelante solo iré poniendo el código y ustedes verán los cambios que se hacen en cada una de ellas,

 


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 GaleriaDeModelos
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            base.Initialize();
        }
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
        }
        protected override void UnloadContent()
        {
 
        }
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
 
            base.Update(gameTime);
        }
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            base.Draw(gameTime);
        }
    }
}
 
Analizado en 0.036 segundos ha 40.06 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com


Si has creado el proyecto con otro nombre remplaza esta linea namespace GaleriaDeModelo por el nombre de tu proyecto, aunque recomiendo que no lo hagas y crees un nuevo proyecto que ya lleve el nombre GaleriaDeModelo así sera mas fácil ya que tengo que crear nuevos archivos y va hacer necesario que lleve este nombre,

 

Como ya tenemos nuestros modelos en el Explorador de Soluciones los vamos llamar al xna de esta forma.

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 GaleriaDeModelos
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        /// <summary>
        /// Zona De variables :
        /// Aqui se defina todas las variables que utilizaremos en este archivo
        /// </summary>
        // Creamos una variable que contendrá el modelo que vamos ha mostrar 
 
        Model PrimerModelo;
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            base.Initialize();
        }
        protected override void LoadContent()
        {
            //En esta área se cargan todos los archivo externos necesarios como audio, 3d, img, xml, text,fx etc,etc
            //Cargaremos nuestro Modelo en este caso el soldado dude
            PrimerModelo = Content.Load<Model>("Modelos\\dude");
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
        }
        protected override void UnloadContent()
        {
 
        }
        protected override void Update(GameTime gameTime)
 
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            base.Update(gameTime);
        }
        //Ahora creamos una función que nos permita ver el modelo en pantalla 
        //también dicha función se pueden añadir efectos de trasformación iluminación etc,etc
        private void VerModelo(Model m)
        {
            // Esta variable os ayuda a definir el aspecto del modelo al ser renderizado  
            float AspectoDeRadio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;          
            foreach (ModelMesh mesh in m.Meshes)
            {
                Matrix[] boneTransforms = new Matrix[m.Bones.Count];
 
                m.CopyAbsoluteBoneTransformsTo(boneTransforms);   
 
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.EnableDefaultLighting();
                    //Modificamos el aspecto de nuestro modelo aplicando ciertos efectos 
                    //También se define la forma en que va hacer presentado en que posición o rotación
                    effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),AspectoDeRadio, 1.0f, 10000.0f);
                    effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 100.0f), new Vector3(0.0f,0.0f,0.0f), Vector3.Up);
                    effect.World = Matrix.CreateRotationY(0.0f)+Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);
                }
                mesh.Draw(); 
            }
 
        }
 
 
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);  
            //Ejecutamos la función que hemos creado previamente dándole como parámetro el modelo que queremos renderizar
            VerModelo(PrimerModelo);   
           base.Draw(gameTime);
        }
 
 
Analizado en 0.056 segundos ha 63.89 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com


Si lo avíes hecho bien el resultad es el siguiente



El modelo se nos muestra entre cortado la explicación de esto es por que dicho modelo tiene su pivot en los pies al ser cargado el xna coloca dicho pivot en X=0, Y=0, Z=0 , el objetivo que tiene la cámara del xna también se ubica en esas coordenadas a no ser que le digas lo contrario.

Ahora vamos ha centrarlo frente de la cámara esto se puede hacer de muchas formas tanto moviendo el propio modelo, la cámara o el objetivo de dicha cámara para centrarlo el código sera así.

 

Código : C#
 
                     effect.EnableDefaultLighting();
                    //Modificamos el aspecto de nuestro modelo aplicando ciertos efectos 
                    //También se define la forma en que va hacer presentado en que posición o rotación
                    effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),AspectoDeRadio, 1.0f, 10000.0f);
                    effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 30.0f, 150.0f), new Vector3(0.0f,30.0f,0.0f), Vector3.Up);
                    effect.World = Matrix.CreateRotationY(0.0f)+Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);
 
Analizado en 0.083 segundos ha 7.43 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com



explico esta linea Matrix.CreateLookAt(new Vector3(0.0f, 30.0f, 150.0f), new Vector3(0.0f,30.0f,0.0f), Vector3.Up);

esta Matrix es la que seria la cámara en forma de código por decirlo de alguna manera

new Vector3(0.0f, 30.0f, 150.0f) con este vector le decimos donde tiene que ubicarse la cámara dentro de los tres ejes X Y Z (No explico lo de los vectores tridimensionales porque ya hay mucha información en Internet ) el segundo vector new Vector3(0.0f,30.0f,0.0f) es el que controla en objetivo de la camara al igual que el vector de cámara este se mueve en los ejes tridimensionales, por ultimo esta en Vector3.Up este vector es similar al los otros dos pero con la diferencia que este no se desplaza sino que gira la cámara en su propio eje es decir que si pones Vector3..Left la cámara girara a la izquierda de este modo veras al personaje de lado,

1-4 Efectos simples

En la imagen de arriba nuestro modelo se muestra con un aspecto un tanto blanquecino esto es muy común debido a la iluminación global , el xna permite trabajar con archivos fx los cuales pueden realzar notablemente la calidad de nuestros modelos haciéndolos aun mas impactantes,pero este tema lo reservo para delante puesto que es mas complejo y largo así que simplemente utilizaremos los Fx que ya tiene el xna por defecto y rescatados del propio modelo, solo vamos a utilizar SpecularPower esta variable ayuda aumenta el color de la imagen si el valor es muy alto puede parecer que dico modelo tenga un aspecto de plástico nosotros lo vamos a dejar en 5 y el resultado sera este

 

Código : C#
 
                    effect.EnableDefaultLighting();
                    //Modificamos el aspecto de nuestro modelo aplicando ciertos efectos 
                    //También se define la forma en que va hacer presentado en que posición o rotación
                    effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),AspectoDeRadio, 1.0f, 10000.0f);
                    effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 30.0f, 150.0f), new Vector3(0.0f,30.0f,0.0f), Vector3.Up);
                    effect.World = Matrix.CreateRotationY(0.0f)+Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);
                    effect.SpecularPower = 5;
 
Analizado en 0.094 segundos ha 7.07 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com





 

Para finalizar con esta parte de la lección vamos ha hacer que nuestro personaje rote, antes que nada aclaro,no es lo mismo rotar el modelo que el mundo o la cámara, en nuestro caso rotaremos el mundo ya que solo lo compone el propio modelo

primero definimos la variable que tomara el valor float para para enviarlo a la Matrix.CreateRotationY,e la zona de variables colocamos lo siguiente



Código : C#
 
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        /// <summary>
        /// Zona De variables : 
        /// Aquí se defina todas las variables que utilizaremos en este archivo 
        /// </summary>
        // Creamos una variable que contendrá el modelo que vamos ha mostrar 
        Model PrimerModelo;
        float varRotacionY;&nbsp;
 
Analizado en 0.098 segundos ha 3.84 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com


luego entre la funcion Update

Código : C#
 
&nbsp;protected override void Update(GameTime gameTime)
 
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            base.Update(gameTime);
            varRotacionY += 0.01f;
 
        }
 
Analizado en 0.172 segundos ha 1.56 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com


Y por ultimo en la función VerModelo

 

Código : C#
 
 
               {
                    effect.EnableDefaultLighting();
                    //Modificamos el aspecto de nuestro modelo aplicando ciertos efectos 
                    //También se define la forma en que va hacer presentado en que posición o rotación
                    effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),AspectoDeRadio, 1.0f, 10000.0f);
                    effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 30.0f, 150.0f), new Vector3(0.0f,30.0f,0.0f), Vector3.Up);
                    effect.World = Matrix.CreateRotationY(varRotacionY) * boneTransforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(0.0f, 0.0f, 0.0f);
                    effect.SpecularPower = 5;
                }
 
Analizado en 0.098 segundos ha 7.67 KB/s, GeSHi 1.0.8.2-- CFX.GHCode Programado Por Crea-Flash.com


Espero que le haya gustado esta introducción al xna lo que tengo que dejar claro que de momento no voy ha dejar archivos de ejemplo por dos sencillas razones primero porque de esta formar les obligo ha hacer los ejercicios paso a paso personalmente creo que es la mejor manera de aprender que ver un proyecto ya acabado o empezado, y lo segundo porque conforme se baya avanzando se ira modificando los tutoriales y corrigiendo errores de esta manera evitaremos tener archivos basura que luego ni siquiera miraremos,
Última actualización el Lunes, 01 de Junio de 2009 21:21
 

Articulos Relacionados XNA