xna l03–models, basic effect and animation

Post on 14-May-2015

307 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Mohammad Shakermohammadshaker.com

@ZGTRShaker2011, 2012, 2013, 2014

XNA Game DevelopmentL03 – Models, BasicEffect and Animation

Using 3D Models

Using 3D Models Why using models?!

Some 3D Modeling Programs

• 3D Max

• Maya

• Blender

• Wings3D

• Google SketchUp

• … etc

Using 3D Models - Loading the Model

• Global Scope

private Model model; Initialize

LoadContent

UnloadContent

Update

Draw

Game1

Using 3D Models - Loading the Model

• Global Scope

• LoadContent()

private Model model;

model = Content.Load<Model>("Ship");

Initialize

LoadContent

UnloadContent

Update

Draw

Game1

Using 3D Models - Drawing the Model

• Must set appropriate matrices

private Matrix world = Matrix.CreateTranslation(new Vector3(0, 0, 0));

private Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 10),

new Vector3(0, 0, 0),

Vector3.UnitY);

private Matrix projection = Matrix.CreatePerspectiveFieldOfView(

MathHelper.ToRadians(45),

800f / 480f,

0.1f,

100f);

Using 3D Models

• DrawModel() and Draw()

private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection)

{

foreach (ModelMesh mesh in model.Meshes)

{

foreach (BasicEffect effect in mesh.Effects)

{

effect.World = world;

effect.View = view;

effect.Projection = projection;

}

mesh.Draw();

}

}

protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Initialize

LoadContent

UnloadContent

Update

Draw

Game1

Using 3D Models

• DrawModel() and Draw()

private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection)

{

foreach (ModelMesh mesh in model.Meshes)

{

foreach (BasicEffect effect in mesh.Effects)

{

effect.World = world;

effect.View = view;

effect.Projection = projection;

}

mesh.Draw();

}

}

protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Initialize

LoadContent

UnloadContent

Update

Draw

Game1

Using 3D Models

• “App-Using3DModels”

BasicEffect

BasicEffect

• Effects in XNA

– An effect is simply a method of designating how an object should be rendered on the screen.

– In the past (graphics API)

• tell the graphics card everything it needed to know

– HLSL

– It can be quite a bit of work to create a complete effect from scratch

• XNA guys delivered to us the “BasicEffect” class

BasicEffect

protected override void Draw(GameTime gameTime){

GraphicsDevice.Clear(Color.CornflowerBlue);

basicEffect.World = world;basicEffect.View = view;basicEffect.Projection = projection;basicEffect.VertexColorEnabled = true;

foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes){

pass.Apply(); GraphicsDevice.DrawUserPrimitives<> …

}base.Draw(gameTime);

}

BasicEffect

protected override void Draw(GameTime gameTime){

GraphicsDevice.Clear(Color.CornflowerBlue);

basicEffect.World = world;basicEffect.View = view;basicEffect.Projection = projection;basicEffect.VertexColorEnabled = true;

foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes){

pass.Apply(); GraphicsDevice.DrawUserPrimitives<> …

}base.Draw(gameTime);

}

BasicEffect

protected override void Draw(GameTime gameTime){

GraphicsDevice.Clear(Color.CornflowerBlue);

basicEffect.World = world;basicEffect.View = view;basicEffect.Projection = projection;basicEffect.VertexColorEnabled = true;

foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes){

pass.Apply(); GraphicsDevice.DrawUserPrimitives<> …

}base.Draw(gameTime);

}

BasicEffect

private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection) {

foreach (ModelMesh mesh in model.Meshes)

{

foreach (BasicEffect effect in mesh.Effects)

{

effect.World = world;

effect.View = view;

effect.Projection = projection;

}

mesh.Draw();

}

}

BasicEffect

• Changing BasicEffect Texture

effect.Texture = otherTexture; // otherTexture is of the type "Texture2D"

BasicEffect

• Changing BasicEffect Texture

effect.Texture = otherTexture; // otherTexture is of the type "Texture2D"

BasicEffect

• Not using Texture!

effect.Texture = otherTexture; // otherTexture is of the type "Texture2D"

Lighting

Lighting

• Diffuse Light

– Diffuse light is the basic kind of light. This is the kind of light that lights an object we are

viewing, for the most part. The intensity of the light mostly comes from the angle the surface

makes with the light itself, so surfaces that face away from the light don't aren't bright at all,

while surfaces that face the light are lit up pretty well.

Lighting

• Specular Light

– Specular light (or specular highlights) are the shiny spots that appear when an object is

somewhat reflective. This light is based on how reflective the surface is, as well as the angle

that is being made between the light source, the surface, and the viewer.

Lighting

• Ambient Light

– Ambient light is light that doesn't come from any particular light source, but instead is kind of

"background light" that comes from all over. In the real world, there is always a small amount

of ambient light, and in our game, we will want to add a little bit to make our objects look

more realistic.

Lighting

• Emissive Light

– Emissive light is light that is coming from the surface itself. In games, however, emissive light

doesn't automatically light up nearby objects, so it often doesn't have the same effect that we

would like, but it still has its uses.

Lighting with the BasicEffect Class

• Default Lighting

effect.EnableDefaultLighting();

Lighting with the BasicEffect Class

• Default Lighting

• Custom Lighting

effect.EnableDefaultLighting();

Lighting with the BasicEffect Class

• Default Lighting

• Custom Lighting

effect.EnableDefaultLighting();

effect.LightingEnabled = true; // turn on the lighting subsystem.

effect.DirectionalLight0.DiffuseColor = new Vector3(0.5f, 0, 0); // a red light

effect.DirectionalLight0.Direction = new Vector3(1, 0, 0); // coming along the x-axis

effect.DirectionalLight0.SpecularColor = new Vector3(0, 1, 0); // with green highlights

Lighting with the BasicEffect Class

• Default Lighting

• Custom Lighting

effect.EnableDefaultLighting();

effect.LightingEnabled = true; // turn on the lighting subsystem.

effect.DirectionalLight0.DiffuseColor = new Vector3(0.5f, 0, 0); // a red light

effect.DirectionalLight0.Direction = new Vector3(1, 0, 0); // coming along the x-axis

effect.DirectionalLight0.SpecularColor = new Vector3(0, 1, 0); // with green highlights

R G B

Lighting with the BasicEffect Class

• Default Lighting

• Custom Lighting

effect.EnableDefaultLighting();

effect.LightingEnabled = true; // turn on the lighting subsystem.

effect.DirectionalLight0.DiffuseColor = new Vector3(0.5f, 0, 0); // a red light

effect.DirectionalLight0.Direction = new Vector3(1, 0, 0); // coming along the x-axis

effect.DirectionalLight0.SpecularColor = new Vector3(0, 1, 0); // with green highlights

R G BX Y Z

Lighting with the BasicEffect Class

• Default Lighting

• Custom Lighting

effect.EnableDefaultLighting();

effect.LightingEnabled = true; // turn on the lighting subsystem.

effect.DirectionalLight0.DiffuseColor = new Vector3(0.5f, 0, 0); // a red light

effect.DirectionalLight0.Direction = new Vector3(1, 0, 0); // coming along the x-axis

effect.DirectionalLight0.SpecularColor = new Vector3(0, 1, 0); // with green highlights

R G BX Y Z

R G B

Lighting with the BasicEffect Class

• You can turn individual lights on and off with

• you can set the effect's ambient light color

effect.DirectionalLight0.Enabled = false;

effect.AmbientLightColor = new Vector3(0.2f, 0.2f, 0.2f);

effect.EmissiveColor = new Vector3(1, 0, 0);

Lighting with the BasicEffect Class

• “App2-BasicEffectLighting”

BasicEffect FogWhy using fog?

BasicEffect FogWhy using fog?

For instance; Can be used to hide a close far-clipping plane

BasicEffect Fog

• Rendering Fog with the BasicEffect Class

effect.FogEnabled = true;

effect.FogColor = Color.CornflowerBlue.ToVector3();

effect.FogStart = 9.75f;

effect.FogEnd = 10.25f;

BasicEffect Fog

• Rendering Fog with the BasicEffect Class

effect.FogEnabled = true;

effect.FogColor = Color.CornflowerBlue.ToVector3();

effect.FogStart = 9.75f;

effect.FogEnd = 10.25f;

3D Animation

Basic Matrices

Basic Matrices

Basic Matrices

Basic Matrices

Basic Matrices

Basic Matrices

3D Animation

• Create a Place to Store the Position

private Vector3 position;

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

LoadContent() Update() Draw()

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

LoadContent() Update() Draw()

3D Animation

• Now we want to move the Model

– “Attaching position vector with our model”

world = Matrix.CreateTranslation(position);

3D Animation

• Now we want to move the Model

– “Attaching position vector with our model”

world = Matrix.CreateTranslation(position);

3D Animation

• Now we want to move the Model

– “Attaching position vector with our model”

world = Matrix.CreateTranslation(position);

3D Animation

• Now we want to move the Model

– “Attaching position vector with our model”

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

3D Animation

3D Animation

3D Animation

3D Animation

3D Animation

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

3D Animation

3D Animation

3D Animation

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

position= new Vector3(0, 0, 0);

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

private float angle;

position= new Vector3(0, 0, 0);

angle = 0;

position += new Vector3(0, 0.01f, 0);

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

private float angle;

position= new Vector3(0, 0, 0);

angle = 0;

position += new Vector3(0, 0.01f, 0);

angle += 0.03f;

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

private float angle;

position= new Vector3(0, 0, 0);

angle = 0;

position += new Vector3(0, 0.01f, 0);

angle += 0.03f;

world = Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

private float angle;

position= new Vector3(0, 0, 0);

angle = 0;

position += new Vector3(0, 0.01f, 0);

angle += 0.03f;

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position);

3D Animation

• Create a Place to Store the Position

• Initialize the Position

• Creating animation/ Updating Position!

private Vector3 position;

private float angle;

position= new Vector3(0, 0, 0);

angle = 0;

position += new Vector3(0, 0.01f, 0);

angle += 0.03f;

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position);

3D Animation

3D Animation

• “App1-Animation”

Mesh-by-Mesh Animation

Mesh-by-Mesh Animation What’s that?

Mesh-by-Mesh Animation

• Firing Up!

– Setup

• We will first need to acquire a model that has different parts that will allow us to do the movements

that we want

• Our "Helicopter" model included in appendix

Mesh-by-Mesh Animation

• Adding global variables

private Model helicopterModel;

private float mainRotorAngle = 0;

private float tailRotorAngle = 0;

private Vector3 location = new Vector3(0, 0, 0);

private float angle = 0f;

private Matrix world = Matrix.CreateTranslation(new Vector3(0, 0, 0));

private Matrix view = Matrix.CreateLookAt(new Vector3(10, 10, 10),

new Vector3(0, 0, 0),

Vector3.UnitY);

private Matrix projection = Matrix.CreatePerspectiveFieldOfView(

MathHelper.ToRadians(45),

800f / 600f, 0.1f, 100f);

Mesh-by-Mesh Animation

• Adding global variables

private Model helicopterModel;

private float mainRotorAngle = 0;

private float tailRotorAngle = 0;

private Vector3 location = new Vector3(0, 0, 0);

private float angle = 0f;

private Matrix world = Matrix.CreateTranslation(new Vector3(0, 0, 0));

private Matrix view = Matrix.CreateLookAt(new Vector3(10, 10, 10),

new Vector3(0, 0, 0),

Vector3.UnitY);

private Matrix projection = Matrix.CreatePerspectiveFieldOfView(

MathHelper.ToRadians(45),

800f / 600f, 0.1f, 100f);

Mesh-by-Mesh Animation

• Adding global variables

private Model helicopterModel;

private float mainRotorAngle = 0;

private float tailRotorAngle = 0;

private Vector3 location = new Vector3(0, 0, 0);

private float angle = 0f;

private Matrix world = Matrix.CreateTranslation(new Vector3(0, 0, 0));

private Matrix view = Matrix.CreateLookAt(new Vector3(10, 10, 10),

new Vector3(0, 0, 0),

Vector3.UnitY);

private Matrix projection = Matrix.CreatePerspectiveFieldOfView(

MathHelper.ToRadians(45),

800f / 600f, 0.1f, 100f);

Mesh-by-Mesh Animation

• Adding global variables

private Model helicopterModel;

private float mainRotorAngle = 0;

private float tailRotorAngle = 0;

private Vector3 location = new Vector3(0, 0, 0);

private float angle = 0f;

private Matrix world = Matrix.CreateTranslation(new Vector3(0, 0, 0));

private Matrix view = Matrix.CreateLookAt(new Vector3(10, 10, 10),

new Vector3(0, 0, 0),

Vector3.UnitY);

private Matrix projection = Matrix.CreatePerspectiveFieldOfView(

MathHelper.ToRadians(45),

800f / 600f, 0.1f, 100f);

Mesh-by-Mesh Animation

• Adding global variables

private Model helicopterModel;

private float mainRotorAngle = 0;

private float tailRotorAngle = 0;

private Vector3 location = new Vector3(0, 0, 0);

private float angle = 0f;

private Matrix world = Matrix.CreateTranslation(new Vector3(0, 0, 0));

private Matrix view = Matrix.CreateLookAt(new Vector3(10, 10, 10),

new Vector3(0, 0, 0),

Vector3.UnitY);

private Matrix projection = Matrix.CreatePerspectiveFieldOfView(

MathHelper.ToRadians(45),

800f / 600f, 0.1f, 100f);

Mesh-by-Mesh Animation

• Loading the model in LoadContent() method

• Updating the angles and location of the Helicopter model in Update()method

helicopterModel = Content.Load<Model>("Helicopter");

tailRotorAngle -= 0.15f;

mainRotorAngle -= 0.15f;

angle += 0.02f;

location += Vector3.Transform(new Vector3(0.1f, 0, 0),

Matrix.CreateRotationY(MathHelper.ToRadians(90) + angle));

Mesh-by-Mesh Animation

protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• New Draw() method

protected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• New Draw() methodprotected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• New Draw() methodprotected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• New Draw() methodprotected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• New Draw() methodprotected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• New Draw() methodprotected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• New Draw() methodprotected override void Draw(GameTime gameTime)

{

GraphicsDevice.Clear(Color.CornflowerBlue);

Matrix[] meshWorlds = new Matrix[3];

meshWorlds[0] = Matrix.CreateTranslation(new Vector3(0, 0, 0));

meshWorlds[1] = Matrix.CreateRotationY(mainRotorAngle);

meshWorlds[2] = Matrix.CreateTranslation(new Vector3(0, -0.25f, -3.4f)) *

Matrix.CreateRotationX(tailRotorAngle) *

Matrix.CreateTranslation(new Vector3(0, 0.25f, 3.4f));

world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(location);

DrawModel(helicopterModel, world, meshWorlds, view, projection);

base.Draw(gameTime);

}

Mesh-by-Mesh Animation

• Creating a new DrawModel() method as we did before

private void DrawModel(Model model, Matrix world, Matrix[] meshWorlds, Matrix view, Matrix

projection)

{

for (int index = 0; index < model.Meshes.Count; index++)

{

ModelMesh mesh = model.Meshes[index];

foreach (BasicEffect effect in mesh.Effects)

{

effect.EnableDefaultLighting();

effect.World = mesh.ParentBone.Transform * meshWorlds[index] * world;

effect.View = view;

effect.Projection = projection;

}

mesh.Draw();

}

}

Mesh-by-Mesh Animation

• Creating a new DrawModel() method as we did before

private void DrawModel(Model model, Matrix world, Matrix[] meshWorlds, Matrix view, Matrix

projection)

{

for (int index = 0; index < model.Meshes.Count; index++)

{

ModelMesh mesh = model.Meshes[index];

foreach (BasicEffect effect in mesh.Effects)

{

effect.EnableDefaultLighting();

effect.World = mesh.ParentBone.Transform * meshWorlds[index] * world;

effect.View = view;

effect.Projection = projection;

}

mesh.Draw();

}

}

Mesh-by-Mesh Animation

• Creating a new DrawModel() method as we did before

private void DrawModel(Model model, Matrix world, Matrix[] meshWorlds, Matrix view, Matrix

projection)

{

for (int index = 0; index < model.Meshes.Count; index++)

{

ModelMesh mesh = model.Meshes[index];

foreach (BasicEffect effect in mesh.Effects)

{

effect.EnableDefaultLighting();

effect.World = mesh.ParentBone.Transform * meshWorlds[index] * world;

effect.View = view;

effect.Projection = projection;

}

mesh.Draw();

}

}

Mesh-by-Mesh Animation

• Test it live

• “App1-Mesh-by-MeshAnimation”

top related