Cargando un modelo 3D

Antes de nada recomiendo que miréis la sección de artículos para que tengáis todo claro antes de empezar con los tutoriales de 3D.

Saludos a todos, lo prometido es deuda, y aquí vengo con el primer tutorial donde haremos algo en 3D!!

Este es muy sencillo y básico, pero fundamental para futuros proyectos, asi que vamos allá.

El archivo del modelo 3D debe tener un formato .fbx o .x .Las texturas no hacen falta añadirlas al proyecto, pero el modelo 3D sí, con esto en mente proseguimos.

Creamos un nuevo proyecto y añadimos dos nuevas variables:


public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Model miModelo;
float aspectRatio;

La variable miModelo será la que cargue el modelo, y el aspectRatio lo usaremos para dibujar en pantalla de forma proporcional a su anchura y altura.


protected override void Initialize()
{
aspectRatio = (float)graphics.PreferredBackBufferWidth /
(float)graphics.PreferredBackBufferHeight;

base.Initialize();
}

A continuación le damos el valor a aspectRatio que será el ancho de la pantalla entre el alto.

En el método loadContent cargaremos el objeto 3D que queramos pintar:


protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
miModelo = Content.Load("Models\\p1_wedge");

}

Hasta ahora todo sencillo, ¿no? Pues bien, nos falta solamente modificar el método Draw, ya que en el update no vamos a necesitar tocar nada. Como os comentaba en el artículo de la secuencia gráfica, un vértice del modelo sufre una serie de transformaciones hasta que se pinta por pantalla, pues bien, todas esas transformaciones se modelan mediante matrices, os copio el código del método Draw y os comento debajo todo lo que sucede:


//Posición del modelo
Vector3 modelPosition = Vector3.Zero;
// Posición de la cámara para la matriz de vista
Vector3 cameraPosition = new Vector3(0.0f, 0.0f, 5000.0f);

protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

// Dibujamos el modelo, puede tener múltiples mallas, asi que iteramos sobre todas.
foreach (ModelMesh mesh in miModelo.Meshes)
{
//Aquí es donde se fija la orientación de la malla, así como nuestra cámara y la proyección.
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.World = Matrix.CreateTranslation(modelPosition);
effect.View = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
aspectRatio, 1.0f, 10000.0f);
}
//Dibuja la malla, usando los valores de arriba.
mesh.Draw();
}
base.Draw(gameTime);
}
}

Como véis, fuera del método Draw defino primero la posición del modelo, y la posición de la camara en coordenadas (X,Y,Z). Una vez dentro del método Draw hacemos dos for each, si nunca antes habéis visto esta construcción es básicamente un bucle for sobre una estructura de datos, de tal forma que recorrerá todas las mallas del modelo y les aplicará el efecto que le digamos.

Aquí simplemente activamos la iluminación por defecto, creamos la matriz del Mundo, que se corresponde con la transformación de modelo del cauce gráfico, como véis la usamos para posicionar el objeto.

Después aplicamos la matriz de vista, con la posición de la cámara, la posción a donde apunta, y un vector llamado Up que lo dejaremos así.

Finalmente aplicamos la matriz de proyección, que se encarga de proyectar los puntos de la escena a un plano 2D. Los parámetros que lleva son los ángulos en radianes de la proyección, el aspectRatio, el plano cercano(near plane) y el lejano (far plane). Estos dos últimos parámetros determinan que es lo que se ve y que se queda fuera, todo aquello que no esté entre el plano cercano y el lejano no aparecerá en pantalla.

Descarga el tutorial:

LoadModel.rar (1MB) XNA GS 2.0

LoadModel.zip (1MB) XNA 3.0

LoadModel.zip (1MB) XNA 4.0

También puede interesarte:

Secuencia Gráfica

Rotar un modelo 3D

17 pensamientos en “Cargando un modelo 3D

  1. hola me gusto mucho tu tutorial… pero tengo problema cargando exportando modelos desde blender… e incluso con otros modelos… solo me sale la pantalla azul claro…ayuda

  2. Hola, he estado echando un vistazo a vuestra página y lo primero es felicitaros porque está muy bien. Con respecto a XNA me estoy centrando ahora mismo en la parte 3D. Necesito hacer un “jueguecillo” muy sencillo, simplemente mover objetos de un lugar a otro a través del ratón. Estoy un poco perdida a la hora de empezar, pues supongo que lo primero que necesito es que mis objetos estén en 3D, ¿no? ¿Cómo puedo conseguir estos objetos en 3D? Serían cosas comunes, tales como un libro, una estantería… pero no sé como conseguirlos en formatos .x o .fbx.
    Muchas gracias, un saludo

    • La mejor opción es tener a mano una copia de 3D studio o si no, algún programa similar como blender (echa un vistazo a la sección de enlaces del blog). Si no tienes conocimiento de estas herramientas, siempre puedes encontrar paginas con modelos gratuitos, como http://www.turbosquid.com/ (busca en la seccion de modelos gratis) a lo mejor no encuentras el modelo en formato .x o .fbx, existen conversores de 3d max a estos formatos para ello.

      Buena suerte!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s