| XNA Game Studio 3.0 lección 1 Cargar modelos 3D |
|
|
|
| Escrito por Fernando |
| Lunes, 25 de Mayo de 2009 06:17 |
|
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. 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;
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# 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 |














