2012-10-29 48 views
0

我該如何操作這些矩陣以保持我的船速度在加速度適用的方向?如何在XNA中正確加速旋轉的3D模型?

當我應用加速度然後應用旋轉時,當前代碼不起作用,加速度隨之改變。

我正在尋找一艘太空船的效果,而不是這裏的飛機。

任何幫助表示讚賞 - 我知道這是遊戲程序員的基本東西!

using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Content; 
using Microsoft.Xna.Framework.Graphics; 
using System; 

namespace AsteroidsWindowsGAme 
{ 
    public class ShipModel 
    { 
     Model model; 
     Matrix[] boneTransforms; 
     ModelBone shipModelBone; 
     Matrix shipTransform; 
     TimeSpan lastTime; 

     public void Load(ContentManager content) 
     { 
      model = content.Load<Model>("Ship"); 
      shipModelBone = model.Bones["Ship"]; 
      shipTransform = shipModelBone.Transform; 
      boneTransforms = new Matrix[model.Bones.Count]; 
     } 

     public void UpdateVelocity(GameTime gameTime) 
     { 
      if (AccelerationX != 0 || AccelerationY != 0 || AccelerationZ != 0) 
      { 
       if (lastTime == null) 
       { 
        lastTime = gameTime.TotalGameTime; 
       } 
       else 
       { 
        TimeSpan elapsedTime = gameTime.TotalGameTime - lastTime; 
        float elapsedSeconds = (float)elapsedTime.TotalSeconds; 
        VelocityX += AccelerationX * elapsedSeconds; 
        VelocityY += AccelerationY * elapsedSeconds; 
        VelocityZ += AccelerationZ * elapsedSeconds; 
       } 
      } 
     } 

     public void UpdatePosition(GameTime gameTime) 
     { 
      if(VelocityX != 0 || VelocityY != 0 || VelocityZ != 0) 
      { 
       if (lastTime == null) 
       { 
        lastTime = gameTime.TotalGameTime; 
       } 
       else 
       { 
        TimeSpan elapsedTime = gameTime.TotalGameTime - lastTime; 
        float elapsedSeconds = (float)elapsedTime.TotalSeconds; 
        PositionX += VelocityX * elapsedSeconds; 
        PositionY += VelocityY * elapsedSeconds; 
        PositionZ += VelocityZ * elapsedSeconds; 
       } 
      } 
     } 

     public void Draw(Matrix world, Matrix view, Matrix projection) 
     { 
      model.Root.Transform = world; 

      Matrix shipRotationMatrix = 
       Matrix.CreateTranslation(PositionX, PositionY, PositionZ) * 
       Matrix.CreateRotationX(RotationX) * 
       Matrix.CreateRotationY(RotationY) * 
       Matrix.CreateRotationZ(RotationZ); 

      shipModelBone.Transform = shipTransform * shipRotationMatrix; 

      model.CopyAbsoluteBoneTransformsTo(boneTransforms); 

      foreach (ModelMesh mesh in model.Meshes) 
      { 
       foreach (BasicEffect effect in mesh.Effects) 
       { 
        effect.World = boneTransforms[mesh.ParentBone.Index]; 
        effect.View = view; 
        effect.Projection = projection; 
        effect.EnableDefaultLighting(); 
       } 
       mesh.Draw(); 
      } 
     } 

     public float RotationX { get; set; } 
     public float RotationY { get; set; } 
     public float RotationZ { get; set; } 
     public float PositionX { get; set; } 
     public float PositionY { get; set; } 
     public float PositionZ { get; set; } 
     public float VelocityX { get; set; } 
     public float VelocityY { get; set; } 
     public float VelocityZ { get; set; } 
     public float AccelerationX { get; set; } 
     public float AccelerationY { get; set; } 
     public float AccelerationZ { get; set; } 
    } 
} 

回答

0

我這出:該解決方案是通過這樣的視圖矩陣乘以平移矩陣:

public void Draw(Matrix world, Matrix view, Matrix projection) 
    { 
     model.Root.Transform = world; 

     Matrix shipRotationMatrix = 

      Matrix.CreateRotationX(RotationX) * 
      Matrix.CreateRotationY(RotationY) * 
      Matrix.CreateRotationZ(RotationZ); 

     shipModelBone.Transform = shipTransform * shipRotationMatrix; 

     model.CopyAbsoluteBoneTransformsTo(boneTransforms); 

     foreach (ModelMesh mesh in model.Meshes) 
     { 
      foreach (BasicEffect effect in mesh.Effects) 
      { 
       effect.World = boneTransforms[mesh.ParentBone.Index]; 
       effect.View = view * Matrix.CreateTranslation(PositionX, PositionY, PositionZ); 
       effect.Projection = projection; 
       effect.EnableDefaultLighting(); 
      } 
      mesh.Draw(); 
     } 
    }