• Advertisement
Sign in to follow this  

Noob Help With 3D Animation

This topic is 2298 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