Jump to content
  • Advertisement
Sign in to follow this  
firecy

Noob Help With 3D Animation

This topic is 2476 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've recently begun looking into 3D programming with XNA, and have gotten a virtual city up and running with some collision detection and a tankish thing that can drive around. The only problem is, I cannot seem to get the wheels animated when you drive (short of saving two models and swapping between them).

I originally drew the tank in Google Sketchup, but then began working in Blender (which seems to work much better), and drew it again. I tried adding bones and attaching them to the tank, but when I went to XNA and tried animating the bones with code such as this that I borrowed from online, but doesn't seem to work when I replace their default model with my own

EDIT: used quote tags cause the code tags were screwing everything up.
[font="Consolas"][font="Consolas"][/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]public[/font][/font][/font][font="Consolas"][font="Consolas"] [/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]void[/font][/font][/font][font="Consolas"][font="Consolas"] Load([/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]ContentManager[/font][/font][/font][font="Consolas"][font="Consolas"] content)

{

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Load the tank model from the ContentManager.

[/font][/font][/font][font="Consolas"][font="Consolas"]tankModel = content.Load<[/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Model[/font][/font][/font][font="Consolas"][font="Consolas"]>([/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"tank"[/font][/font][/font][font="Consolas"][font="Consolas"]);

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Look up shortcut references to the bones we are going to animate.

[/font][/font][/font][font="Consolas"][font="Consolas"]leftBackWheelBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"l_back_wheel_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

rightBackWheelBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"r_back_wheel_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

leftFrontWheelBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"l_front_wheel_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

rightFrontWheelBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"r_front_wheel_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

leftSteerBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"l_steer_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

rightSteerBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"r_steer_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

turretBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"turret_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

cannonBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"canon_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

hatchBone = tankModel.Bones[[/font][/font][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"][font="Consolas"][color="#a31515"]"hatch_geo"[/font][/font][/font][font="Consolas"][font="Consolas"]];

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Store the original transform matrix for each animating bone.

[/font][/font][/font][font="Consolas"][font="Consolas"]leftBackWheelTransform = leftBackWheelBone.Transform;

leftBackWheelTransform = [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"].CreateScale(10);

rightBackWheelTransform = rightBackWheelBone.Transform;

leftFrontWheelTransform = leftFrontWheelBone.Transform;

rightFrontWheelTransform = rightFrontWheelBone.Transform;

leftSteerTransform = leftSteerBone.Transform;

rightSteerTransform = rightSteerBone.Transform;

turretTransform = turretBone.Transform;

cannonTransform = cannonBone.Transform;

hatchTransform = hatchBone.Transform;

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Allocate the transform matrix array.

[/font][/font][/font][font="Consolas"][font="Consolas"]boneTransforms = [/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]new[/font][/font][/font][font="Consolas"][font="Consolas"] [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"][tankModel.Bones.Count];

}

?

[/font][/font][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"]///[/font][/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"] [/font][/font][/font][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"]<summary>

[/font][/font][/font][font="Consolas"][font="Consolas"][/font][/font][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"]///[/font][/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"] Draws the tank model, using the current animation settings.

[/font][/font][/font][font="Consolas"][font="Consolas"][/font][/font][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"]///[/font][/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"] [/font][/font][/font][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"][font="Consolas"][color="#808080"]</summary>

[/font][/font][/font][font="Consolas"][font="Consolas"][/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]public[/font][/font][/font][font="Consolas"][font="Consolas"] [/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]void[/font][/font][/font][font="Consolas"][font="Consolas"] Draw([/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] world, [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] view, [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] projection)

{

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Set the world matrix as the root transform of the model.

[/font][/font][/font][font="Consolas"][font="Consolas"]tankModel.Root.Transform = world;

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Calculate matrices based on the current animation position.

[/font][/font][/font][font="Consolas"][font="Consolas"][/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] wheelRotation = [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"].CreateRotationX(wheelRotationValue);

[/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] steerRotation = [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"].CreateRotationY(steerRotationValue);

[/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] turretRotation = [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"].CreateRotationY(turretRotationValue);

[/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] cannonRotation = [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"].CreateRotationX(cannonRotationValue);

[/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"] hatchRotation = [/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]Matrix[/font][/font][/font][font="Consolas"][font="Consolas"].CreateRotationX(hatchRotationValue);

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Apply matrices to the relevant bones.

[/font][/font][/font][font="Consolas"][font="Consolas"]leftBackWheelBone.Transform = wheelRotation * leftBackWheelTransform;

rightBackWheelBone.Transform = wheelRotation * rightBackWheelTransform;

leftFrontWheelBone.Transform = wheelRotation * leftFrontWheelTransform;

rightFrontWheelBone.Transform = wheelRotation * rightFrontWheelTransform;

leftSteerBone.Transform = steerRotation * leftSteerTransform;

rightSteerBone.Transform = steerRotation * rightSteerTransform;

turretBone.Transform = turretRotation * turretTransform;

cannonBone.Transform = cannonRotation * cannonTransform;

hatchBone.Transform = hatchRotation * hatchTransform;

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Look up combined bone matrices for the entire model.

[/font][/font][/font][font="Consolas"][font="Consolas"]tankModel.CopyAbsoluteBoneTransformsTo(boneTransforms);

[/font][/font][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"][font="Consolas"][color="#008000"]// Draw the model.

[/font][/font][/font][font="Consolas"][font="Consolas"][/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]foreach[/font][/font][/font][font="Consolas"][font="Consolas"] ([/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]ModelMesh[/font][/font][/font][font="Consolas"][font="Consolas"] mesh [/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]in[/font][/font][/font][font="Consolas"][font="Consolas"] tankModel.Meshes)

{

[/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]foreach[/font][/font][/font][font="Consolas"][font="Consolas"] ([/font][/font][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"][font="Consolas"][color="#2b91af"]BasicEffect[/font][/font][/font][font="Consolas"][font="Consolas"] effect [/font][/font][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"][font="Consolas"][color="#0000ff"]in[/font][/font][/font][font="Consolas"][font="Consolas"] mesh.Effects)

{

effect.World = boneTransforms[mesh.ParentBone.Index];

effect.View = view;

effect.Projection = projection;

effect.EnableDefaultLighting();

}

mesh.Draw();

}

}

[/font][/font][/quote]
Anybody know why/how to transform parts of a blender model by bones in XNA? As I said, I can change the default transformations applied to the supplied tank model, but nothing works with my own. Thank you.

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!