SlideShare a Scribd company logo
Mohammad Shaker
mohammadshaker.com
@ZGTRShaker
2011, 2012, 2013, 2014
XNA Game Development
L03 – 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 B
X 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 B
X Y Z
R G B
XNA L03–Models, Basic Effect and Animation
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 Fog
Why using fog?
BasicEffect Fog
Why 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() 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() 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() 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() 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() 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() 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
• 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”

More Related Content

PDF
XNA L02–Basic Matrices and Transformations
PDF
XNA L08–Amazing XNA Utilities
PDF
XNA L04–Primitives, IndexBuffer and VertexBuffer
PDF
WPF L03-3D Rendering and 3D Animation
PDF
XNA L10–Shaders Part 1
PDF
XNA L11–Shaders Part 2
PPTX
Trident International Graphics Workshop 2014 2/5
DOC
Learn Java 3D
XNA L02–Basic Matrices and Transformations
XNA L08–Amazing XNA Utilities
XNA L04–Primitives, IndexBuffer and VertexBuffer
WPF L03-3D Rendering and 3D Animation
XNA L10–Shaders Part 1
XNA L11–Shaders Part 2
Trident International Graphics Workshop 2014 2/5
Learn Java 3D

What's hot (20)

PPTX
Computer Vision harris
PDF
PPTX
A practical intro to BabylonJS
PDF
Ch32 ssm
DOC
Anschp34
PPTX
Company of Heroes 2 (COH2) Rendering Technology: The cold facts of recreating...
PPTX
HTML5 Animation in Mobile Web Games
PPT
Geometry Shader-based Bump Mapping Setup
PDF
05 Views
PDF
WaterFlowUDK
PPT
Shadow Mapping with Today's OpenGL Hardware
PDF
CS193P Lecture 5 View Animation
KEY
Intro to Game Programming
KEY
Introduction to Game Programming Tutorial
PDF
Graphicsand animations devoxx2010 (1)
PDF
The Ring programming language version 1.5.3 book - Part 48 of 184
PPTX
Maximizing performance of 3 d user generated assets in unity
DOC
2. reflection (solved example + exercise)
PPT
CS 354 Object Viewing and Representation
Computer Vision harris
A practical intro to BabylonJS
Ch32 ssm
Anschp34
Company of Heroes 2 (COH2) Rendering Technology: The cold facts of recreating...
HTML5 Animation in Mobile Web Games
Geometry Shader-based Bump Mapping Setup
05 Views
WaterFlowUDK
Shadow Mapping with Today's OpenGL Hardware
CS193P Lecture 5 View Animation
Intro to Game Programming
Introduction to Game Programming Tutorial
Graphicsand animations devoxx2010 (1)
The Ring programming language version 1.5.3 book - Part 48 of 184
Maximizing performance of 3 d user generated assets in unity
2. reflection (solved example + exercise)
CS 354 Object Viewing and Representation
Ad

Viewers also liked (9)

PPTX
How to create an effective presentation
PPT
Basic PowerPoint Guidelines
PPT
Basic Guidelines For PowerPoint Presentation
PPT
Powerpoint Design Simple Rules
PPTX
Powerful PowerPoint Makeovers: PowerPoint Design & Presentation Redesign Samples
PPTX
Effective Design in PowerPoint
PPT
Guidelines on Developing Effective PowerPoint Presentation
PPTX
Presentation Skills - Presenting to a Group
PPT
How to make effective presentation
How to create an effective presentation
Basic PowerPoint Guidelines
Basic Guidelines For PowerPoint Presentation
Powerpoint Design Simple Rules
Powerful PowerPoint Makeovers: PowerPoint Design & Presentation Redesign Samples
Effective Design in PowerPoint
Guidelines on Developing Effective PowerPoint Presentation
Presentation Skills - Presenting to a Group
How to make effective presentation
Ad

Similar to XNA L03–Models, Basic Effect and Animation (20)

PDF
Real life XNA
PDF
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
PPT
HTML5 Canvas
PPTX
Async Redux Actions With RxJS - React Rally 2016
PDF
Model View Intent on Android
PPTX
Silverlight as a Gaming Platform
PPTX
java_for_future_15-Multithreaded-Graphics.pptx
PDF
An Introduction to the Unity GamingEngine
PDF
Webgl para JavaScripters
DOCX
asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
PDF
HTML5 game dev with three.js - HexGL
PDF
Introduction to Coding
PDF
XNA L07–Skybox and Terrain
PPTX
COMP340 TOPIC 4 THREE.JS.pptx
PDF
building_games_with_ruby_rubyconf
PDF
building_games_with_ruby_rubyconf
PDF
XNA L09–2D Graphics and Particle Engines
PDF
Top Tips for Android UIs - Getting the Magic on Tablets
PDF
Intro to computer vision in .net
PDF
Enhancing UI/UX using Java animations
Real life XNA
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
HTML5 Canvas
Async Redux Actions With RxJS - React Rally 2016
Model View Intent on Android
Silverlight as a Gaming Platform
java_for_future_15-Multithreaded-Graphics.pptx
An Introduction to the Unity GamingEngine
Webgl para JavaScripters
asmt7~$sc_210_-_assignment_7_fall_15.docasmt7cosc_210_-_as.docx
HTML5 game dev with three.js - HexGL
Introduction to Coding
XNA L07–Skybox and Terrain
COMP340 TOPIC 4 THREE.JS.pptx
building_games_with_ruby_rubyconf
building_games_with_ruby_rubyconf
XNA L09–2D Graphics and Particle Engines
Top Tips for Android UIs - Getting the Magic on Tablets
Intro to computer vision in .net
Enhancing UI/UX using Java animations

More from Mohammad Shaker (20)

PDF
12 Rules You Should to Know as a Syrian Graduate
PDF
Ultra Fast, Cross Genre, Procedural Content Generation in Games [Master Thesis]
PDF
Interaction Design L06 - Tricks with Psychology
PDF
Short, Matters, Love - Passioneers Event 2015
PDF
Unity L01 - Game Development
PDF
Android L07 - Touch, Screen and Wearables
PDF
Interaction Design L03 - Color
PDF
Interaction Design L05 - Typography
PDF
Interaction Design L04 - Materialise and Coupling
PDF
Android L05 - Storage
PDF
Android L04 - Notifications and Threading
PDF
Android L09 - Windows Phone and iOS
PDF
Interaction Design L01 - Mobile Constraints
PDF
Interaction Design L02 - Pragnanz and Grids
PDF
Android L10 - Stores and Gaming
PDF
Android L06 - Cloud / Parse
PDF
Android L08 - Google Maps and Utilities
PDF
Android L03 - Styles and Themes
PDF
Android L02 - Activities and Adapters
PDF
Android L01 - Warm Up
12 Rules You Should to Know as a Syrian Graduate
Ultra Fast, Cross Genre, Procedural Content Generation in Games [Master Thesis]
Interaction Design L06 - Tricks with Psychology
Short, Matters, Love - Passioneers Event 2015
Unity L01 - Game Development
Android L07 - Touch, Screen and Wearables
Interaction Design L03 - Color
Interaction Design L05 - Typography
Interaction Design L04 - Materialise and Coupling
Android L05 - Storage
Android L04 - Notifications and Threading
Android L09 - Windows Phone and iOS
Interaction Design L01 - Mobile Constraints
Interaction Design L02 - Pragnanz and Grids
Android L10 - Stores and Gaming
Android L06 - Cloud / Parse
Android L08 - Google Maps and Utilities
Android L03 - Styles and Themes
Android L02 - Activities and Adapters
Android L01 - Warm Up

Recently uploaded (20)

PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Approach and Philosophy of On baking technology
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Encapsulation theory and applications.pdf
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Electronic commerce courselecture one. Pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
Digital-Transformation-Roadmap-for-Companies.pptx
Approach and Philosophy of On baking technology
20250228 LYD VKU AI Blended-Learning.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Encapsulation_ Review paper, used for researhc scholars
Mobile App Security Testing_ A Comprehensive Guide.pdf
Chapter 3 Spatial Domain Image Processing.pdf
Spectral efficient network and resource selection model in 5G networks
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Encapsulation theory and applications.pdf
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
MYSQL Presentation for SQL database connectivity
Machine learning based COVID-19 study performance prediction
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
The AUB Centre for AI in Media Proposal.docx
Network Security Unit 5.pdf for BCA BBA.
Electronic commerce courselecture one. Pdf
Advanced methodologies resolving dimensionality complications for autism neur...

XNA L03–Models, Basic Effect and Animation

  • 1. Mohammad Shaker mohammadshaker.com @ZGTRShaker 2011, 2012, 2013, 2014 XNA Game Development L03 – Models, BasicEffect and Animation
  • 3. Using 3D Models Why using models?!
  • 4. Some 3D Modeling Programs • 3D Max • Maya • Blender • Wings3D • Google SketchUp • … etc
  • 5. Using 3D Models - Loading the Model • Global Scope private Model model; Initialize LoadContent UnloadContent Update Draw Game1
  • 6. Using 3D Models - Loading the Model • Global Scope • LoadContent() private Model model; model = Content.Load<Model>("Ship"); Initialize LoadContent UnloadContent Update Draw Game1
  • 7. 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);
  • 8. 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
  • 9. 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
  • 10. Using 3D Models • “App-Using3DModels”
  • 12. 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
  • 13. 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); }
  • 14. 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); }
  • 15. 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); }
  • 16. 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(); } }
  • 17. BasicEffect • Changing BasicEffect Texture effect.Texture = otherTexture; // otherTexture is of the type "Texture2D"
  • 18. BasicEffect • Changing BasicEffect Texture effect.Texture = otherTexture; // otherTexture is of the type "Texture2D"
  • 19. BasicEffect • Not using Texture! effect.Texture = otherTexture; // otherTexture is of the type "Texture2D"
  • 21. 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.
  • 22. 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.
  • 23. 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.
  • 24. 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.
  • 25. Lighting with the BasicEffect Class • Default Lighting effect.EnableDefaultLighting();
  • 26. Lighting with the BasicEffect Class • Default Lighting • Custom Lighting effect.EnableDefaultLighting();
  • 27. 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
  • 28. 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
  • 29. 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 X Y Z
  • 30. 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 X Y Z R G B
  • 32. 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);
  • 33. Lighting with the BasicEffect Class • “App2-BasicEffectLighting”
  • 35. BasicEffect Fog Why using fog? For instance; Can be used to hide a close far-clipping plane
  • 36. BasicEffect Fog • Rendering Fog with the BasicEffect Class effect.FogEnabled = true; effect.FogColor = Color.CornflowerBlue.ToVector3(); effect.FogStart = 9.75f; effect.FogEnd = 10.25f;
  • 37. BasicEffect Fog • Rendering Fog with the BasicEffect Class effect.FogEnabled = true; effect.FogColor = Color.CornflowerBlue.ToVector3(); effect.FogStart = 9.75f; effect.FogEnd = 10.25f;
  • 45. 3D Animation • Create a Place to Store the Position private Vector3 position;
  • 46. 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);
  • 47. 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);
  • 48. 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);
  • 49. 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);
  • 50. 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()
  • 51. 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()
  • 52. 3D Animation • Now we want to move the Model – “Attaching position vector with our model” world = Matrix.CreateTranslation(position);
  • 53. 3D Animation • Now we want to move the Model – “Attaching position vector with our model” world = Matrix.CreateTranslation(position);
  • 54. 3D Animation • Now we want to move the Model – “Attaching position vector with our model” world = Matrix.CreateTranslation(position);
  • 55. 3D Animation • Now we want to move the Model – “Attaching position vector with our model” world = Matrix.CreateTranslation(position);
  • 56. 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);
  • 57. 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);
  • 58. 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);
  • 59. 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);
  • 67. • 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
  • 72. • 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
  • 73. • 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
  • 74. • 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
  • 75. • 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
  • 76. • 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
  • 77. • 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
  • 78. • 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
  • 79. • 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
  • 80. • 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
  • 81. • 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
  • 82. • 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
  • 86. 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
  • 87. 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);
  • 88. 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);
  • 89. 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);
  • 90. 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);
  • 91. 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);
  • 92. 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));
  • 93. 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); }
  • 94. 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); }
  • 95. 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); }
  • 96. 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); }
  • 97. 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); }
  • 98. 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); }
  • 99. 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); }
  • 100. 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); }
  • 101. 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); }
  • 102. 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(); } }
  • 103. 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(); } }
  • 104. 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(); } }
  • 105. Mesh-by-Mesh Animation • Test it live • “App1-Mesh-by-MeshAnimation”