2013-11-24 9 views
2

В настоящее время я изо всех сил пытаюсь понять и сделать 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); 
    } 
} 

кости в модель являются: enter image description here

, и я хочу, чтобы это было гладким, как это:

enter image description here

Как это сделать с помощью XNA? Есть ли более простой способ оживить части тела? Я провел последние 3 часа, просто занимаясь левой рукой и используя пробную ошибку, чтобы выяснить, как много трансформировать каждую часть. Это выглядит нормально, но это не «отлично».

ответ

0

Анимация сложной трехмерной геометрии выполняется исключительно с использованием средств визуальной анимации. И даже при правильных инструментах для правильного использования потребуется много часов практики.

Существует множество бесплатных или коммерческих программ для 3D-моделирования и анимации. Для начала я бы порекомендовал взглянуть на Blender.

Смежные вопросы