В настоящее время я изо всех сил пытаюсь понять и сделать 3D-анимацию в XNA.Есть ли более простой способ анимации 3D-моделей в XNA?
Моя модель первоначально выглядит следующим образом:
Я не хочу его с руки в сторону, как это. С помощью XNA, я попытался положить руки на стороне, и это в конечном итоге, как:
код, я использую XNA Анимация Sample от Microsoft:
public class SkinningSampleGame : Microsoft.Xna.Framework.Game
{
/* Other stuff here */
private Matrix rotate(float X, float Y, float Z)
{
return Matrix.CreateRotationX(MathHelper.ToRadians(X)) * Matrix.CreateRotationY(MathHelper.ToRadians(Y)) * Matrix.CreateRotationZ(MathHelper.ToRadians(Z));
}
protected override void Update(GameTime gameTime)
{
float time = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
//transform the model's left arm.
int boneId = currentModel.Bones["swat:LeftShoulder"].Index - 3;
animationPlayer.boneTransforms[boneId] = rotate(-2.593f, 1.84f, -14.782f) * Matrix.CreateTranslation(new Vector3(2, -3, 5)) * _originalBonesMatrix[boneId];
boneId = currentModel.Bones["swat:LeftShoulder"].Index - 2;
animationPlayer.boneTransforms[boneId] = rotate(0, -30, -56f) * Matrix.CreateTranslation(new Vector3(-25, 2, -1)) * _originalBonesMatrix[boneId];
boneId = currentModel.Bones["swat:LeftShoulder"].Index - 1;
animationPlayer.boneTransforms[boneId] = rotate(0, -2, -5f) * Matrix.CreateTranslation(new Vector3(0, 0, 0)) * _originalBonesMatrix[boneId];
//Transform model's right arm (the messed up arm)..
boneId = currentModel.Bones["swat:RightShoulder"].Index - 8;
animationPlayer.boneTransforms[boneId] = rotate(-2.593f, 1.84f, 14.782f) * Matrix.CreateTranslation(new Vector3(5, 3, 5)) * _originalBonesMatrix[boneId];
boneId = currentModel.Bones["swat:RightShoulder"].Index - 7;
animationPlayer.boneTransforms[boneId] = rotate(0, 7, 56f) * Matrix.CreateTranslation(new Vector3(-15, -2, 1)) * _originalBonesMatrix[boneId];
boneId = currentModel.Bones["swat:RightShoulder"].Index - 1;
animationPlayer.boneTransforms[boneId] = rotate(0, 2, 5f) * Matrix.CreateTranslation(new Vector3(0, 0, 0)) * _originalBonesMatrix[boneId];
animationPlayer.UpdateWorldTransforms(Matrix.Identity);
animationPlayer.UpdateSkinTransforms();
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice device = graphics.GraphicsDevice;
device.Clear(Color.CornflowerBlue);
Matrix[] bones = animationPlayer.GetSkinTransforms();
// Compute camera matrices.
Matrix view = Matrix.CreateScale(0.005f) * Matrix.CreateTranslation(0, 0, 0) * Matrix.CreateRotationY(MathHelper.ToRadians(0)) *
Matrix.CreateLookAt(new Vector3(0, 1, 1), Vector3.Forward, Vector3.Up);
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 0.1f, 1000f);
// Render the skinned mesh.
foreach (ModelMesh mesh in currentModel.Meshes)
{
foreach (SkinnedEffect effect in mesh.Effects)
{
effect.SetBoneTransforms(bones);
effect.View = view;
effect.Projection = projection;
effect.EnableDefaultLighting();
effect.SpecularColor = new Vector3(0.35f);
effect.SpecularPower = 16;
}
mesh.Draw();
}
base.Draw(gameTime);
}
}
кости в модель являются:
, и я хочу, чтобы это было гладким, как это:
Как это сделать с помощью XNA? Есть ли более простой способ оживить части тела? Я провел последние 3 часа, просто занимаясь левой рукой и используя пробную ошибку, чтобы выяснить, как много трансформировать каждую часть. Это выглядит нормально, но это не «отлично».