1.4 Importera Model

XNA stödjer .fbx och .x format av modeller. Dessa kan man skapa i bl.a. Autodesk Maya, Blender och 3d studio max och sedan med hjälp av en FBX-Exporter plugin exportera modellen till ett fbx format som XNA gärna tar emot.

För denna artikel så tänkte jag ladda ner en färdig FBX, om ni vill så får ni skapa er egen modell eller ladda ner någon färdig. Det finns att hämta överallt på nätet.

Det jag tänkte använda finns att hämta hos Microsoft:
http://go.microsoft.com/fwlink/?LinkId=149817&clcid=0x409

Ladda ner filen och kopiera de 2 mapparna som ligger i Content (Models,Textures).
Lägg dessa två i ditt projekts contentfolder.



Vi ska nu arbeta i Game1.cs, bara för att visa hur man gör. För att lägga in Modellen så skapar vi en global Model som får heta ship och sedan en global Matrix som vi ska använda för att manipulera skeppet på enklast sätt.

Model ship;
Matrix shipWorld = Matrix.Identity


Vi initierar vår Model i LoadContent()

protected override void LoadContent()
{

ship = Content.Load<Model>("Models//p1_wedge");
min3dAxel.LoadContent();
spriteBatch = new SpriteBatch(GraphicsDevice);
}

Nu scrollar vi ner till Draw, där vi ska rita ut modellen. Eftersom modellen är extremt stor i skala så måste vi ändra storlek på den och sedan lägga in info om hur den ska se ut framför kameran. En modell kan bestå av en eller ett flertal Meshes. Mer om meshes hittar ni på:
http://en.wikipedia.org/wiki/Polygon_mesh

Och varje mesh har sin egna effect som måste initieras. Så i vår draw så initerar vi effecten i varje mesh i modellen och sedan kör en Draw på meshen. Eftersom varje modell kan bestå av flera meshes så skriver vi såhär:

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


float aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;
foreach (ModelMesh mesh in ship.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.World = Matrix.CreateScale(0.001f) * shipWorld;
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10000.0f);
effect.View = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 3.0f), Vector3.Zero, Vector3.Up);
effect.EnableDefaultLighting();
}
mesh.Draw();
}

base.Draw(gameTime);
}

Notera att vi slänger in vår globala shipWorld efter att vi har ändrat skala på 3d objektet. Eftersom den nu är Matrix.Identity så kommer den inte göra någon skillnad. Men när vi senare ändrar värden på shipWorld så kommer skeppet att manipuleras. Så vi går upp till Update metoden och pillar lite med vår shipWorld. Vi skriver till:

protected override void Update(GameTime gameTime)
{

min3dAxel.worldMatrix *= Matrix.CreateRotationY(0.05f);

shipWorld *= Matrix.CreateRotationY(0.05f);

base.Update(gameTime);
}

Du kanske anar vad denna rad kommer att göra med vårt skepp... i hope you do ;)

Dra en F5!


Nice...

Nu kan du fritt pilla med shipWorld för att få den att röra på sig, rotera och ändra skala. Vill du lägga till keyboard kontroller och kunna snurra på skeppet med höger och vänsterpilarna så ser det ut såhär:

protected override void Update(GameTime gameTime)
{

min3dAxel.worldMatrix *= Matrix.CreateRotationY(0.05f);

KeyboardState keyboard = Keyboard.GetState();
if (keyboard.IsKeyDown(Keys.Left))
{
shipWorld *= Matrix.CreateRotationY(0.05f);
}
if (keyboard.IsKeyDown(Keys.Right))
{
shipWorld *= Matrix.CreateRotationY(-0.05f);
}

base.Update(gameTime);
}



GL Hf!

Kommentarer

Kommentera inlägget här:

Namn:
Kom ihåg mig?

E-postadress: (publiceras ej)

URL/Bloggadress:

Kommentar:

Trackback
RSS 2.0