2011-03-17 65 views
4

我有一個關於XNA模型旋轉的問題。現在的問題是 - 我該怎麼辦(其值應更改以及如何)那樣的旋轉綠化模範(紅色箭頭):XNA中的旋轉

http://img843.imageshack.us/i/question1.jpg/

代碼用於繪製:

DrawModel(elementD, new Vector3(-1, 0.5f, 0.55f), 0,-90,0); 

private void DrawModel(Model model, Vector3 position, float rotXInDeg, float rotYInDeg, float rotZInDeg) 
    { 
     float rotX = (float)(rotXInDeg * Math.PI/180); 
     float rotY = (float)(rotYInDeg * Math.PI/180); 
     float rotZ = (float)(rotZInDeg * Math.PI/180); 

     Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) *Matrix.CreateRotationX(rotX)*Matrix.CreateRotationZ(rotZ)* Matrix.CreateTranslation(position); 
     Matrix[] xwingTransforms = new Matrix[model.Bones.Count]; 
     model.CopyAbsoluteBoneTransformsTo(xwingTransforms); 
     foreach (ModelMesh mesh in model.Meshes) 
     { 
      foreach (BasicEffect effect in mesh.Effects) 
      { 
       effect.EnableDefaultLighting(); 

       effect.View = cam.viewMatrix; 
       effect.Projection = cam.projectionMatrix; 
       effect.World = (xwingTransforms[mesh.ParentBone.Index] * worldMatrix); 
      } 
      mesh.Draw(); 
     } 

    } 

所以,我想通過稍微改變我的代碼以應用解決方案:

Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) * Matrix.CreateRotationX(rotX) * Matrix.CreateTranslation(position) 
       * Matrix.CreateRotationX((float)(45 * Math.PI/180)) * Matrix.CreateRotationZ(rotZ) * Matrix.CreateRotationX((float)(-45 * Math.PI/180)); 

通過改變rotZ參數,我確實能夠旋轉模型。不過效果不是我想要達到的http://img225.imageshack.us/i/questionau.jpg/,它改變了立場。是因爲模型有缺陷還是其他一些錯誤?我希望「圓柱體」能夠保持其位置。你知道我該怎麼做?

+0

您是否考慮過註冊您的答案或將其標記爲已接受?我看到你在這裏是新的,所以記得upvotes是什麼驅動這個網站... – Pedery 2011-03-24 23:13:07

回答

1

旋轉矩陣的旋轉是累積的。因此,您可以通過將模型旋轉45度「向下」來計算旋轉矩陣,然後圍繞想要的軸應用旋轉,然後再次將模型旋轉45度「向上」。這三個矩陣的乘積應該給你你想要的矩陣。

+0

我試過你的解決方案,並更新了我的第一篇文章。非常感謝您的反饋,因爲它讓我更接近預期的結果。 – Konrad 2011-03-18 14:01:35

+0

你的轉變來自你的模型的樞軸中心。當然,你的代碼不能「猜測」你恰好想要圍繞圓柱軸旋轉你的複合模型,而不是整個邊界。我不是XNA專家,所以我不知道如何設置模型的旋轉中心。可選地,您可以從整個模型的邊界,圓柱的邊界以及旋轉的角度自己計算它。在這種情況下,你必須做一系列的轉換和翻譯。 – Pedery 2011-03-20 02:33:21

1

另一種選擇是使用四元數生成旋轉矩陣。四元數基本上是一個軸和它周圍的一個旋轉。在這種情況下可能更容易操作?

+0

有趣的概念:) http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation – Pedery 2011-03-20 02:33:42