How can I use blender animations in XNA 4.0?

Darkry picture Darkry · Nov 26, 2011 · Viewed 7.5k times · Source

I have a model in Blender (2.6+) with rigged animation. I exported it to FBX and import it to XNA. I know ho to draw it on the screen but how can I run the animation (called for example "run")?

Thanks!

Answer

annonymously picture annonymously · Nov 27, 2011

You can use the SkinnedModelSample from microsoft. Make sure you set the ContentProcessor property of the fbx file to SkinnedModelProcessor in the Properties box, Then you can do (needs optimizing):

Main Game class:

AnimationPlayer player;// This calculates the Matrices of the animation
AnimationClip clip;// This contains the keyframes of the animation
SkinningData skin;// This contains all the skinning data
Model model;// The actual model

LoadContent Method:

model = Content.Load<Model>("path_to_model");
skin = model.Tag as SkinningData;// The SkinnedModelProcessor puts skinning data in the Tag property

player = new AnimationPlayer(skin);
clip = skin.AnimationClips["run"];// The name of the animation

player.StartClip(clip);

Draw Method:

Matrix[] bones = player.GetSkinTransforms();

// Compute camera matrices.
Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, -30), // Change the last number according to the size of your model
                                          new Vector3(0, 0, 0), Vector3.Up);

Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
                                                        device.Viewport.AspectRatio,
                                                        1,
                                                        10000);

// Render the skinned mesh.
foreach (ModelMesh mesh in model.Meshes)
{
    foreach (SkinnedEffect effect in mesh.Effects)
    {
        effect.SetBoneTransforms(bones);

        effect.View = view;
        effect.Projection = projection;

        effect.EnableDefaultLighting();

        effect.SpecularColor = new Vector3(0.25f);
        effect.SpecularPower = 16;
    }

    mesh.Draw();
}