2011-04-20 71 views
0

我創建了一個模型在3d最大,我集中在世界..不過,當我把它放在XNA中,並通過XNA應用旋轉,似乎它的旋轉中心是不是在實際的對象中,而是稍微遠離它,所以它看起來像對象正在旋轉,而不是旋轉...這是煩人的any1知道如何解決這個問題?模型旋轉在XNA到3D最大似乎是錯誤的

+0

你能顯示你的代碼嗎?另外3DS Max使用XNA使用右手的左手座標。您是否使用Panda Export來導出模型? – 2011-04-20 10:31:09

+0

errr我的代碼和其他模型一起工作的很好,我使用3個模型的小行星,th3第三個模型看起來不對,可能是因爲它不平衡繞y軸?(變形)。我怎樣才能改變右手的事情? aw和最後的東西,不,我只是通過FBX格式通過3d max導出模型。 – Martinos 2011-04-20 10:48:26

回答

1

當您將對象置於3ds世界中時,它不會改變頂點位置。它只創建了一個矩陣,可以將頂點從他們所在的位置轉換到放置它們的位置。

可能是因爲經常你沒有對世界原點的視覺參考&沒有意識到你的模型在XNA中被抵消了,可能並不明顯你沒有考慮到這個矩陣。

這是通過Model.CopyAbsoluteBoneTransformsTo()將該矩陣(通過內容處理器變成「Bone」轉換)放入數組中,您可以在設置effect.World時使用該矩陣。

如果聽起來這可能是問題,並且您想要一個快速代碼示例,請告訴我們。

0

只是爲了擴大@Steve H公司的回答了一下,這裏有幾個可能的原因:

您的XNA代碼,你不應用骨轉換到模型。像大多數建模工具一樣,Max傾向於修改模型的世界變換矩陣而不是頂點本身。變換頂點往往會引入小的浮點錯誤,例如,圍繞z軸的1,0,0旋轉的Pi/2弧度的頂點可能會變爲0,0.99999,0而不是0,1,0 - 這就是浮點數學,也是在你的遊戲中,你總是從源幾何轉換而來的原因。

Here's a link to a bone transforms example on MSDN(從v3.1開始,但有很多v4示例):請注意myModel.CopyAbsoluteBoneTransformsTo(transforms)effect.World作業。這個例子是爲BasicEffect,但即使你自己的效果,你需要提取骨骼轉換並應用它們。例如,如果您使用自定義着色器,則可以在模型加載時執行此操作。 (請注意,即使你還沒有真正在最大模型中定義的任何骨骼骨轉換是必要的。)

(從鏈接的MSDN文章借用)

protected override void Draw(GameTime gameTime) 
{ 
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue); 

    // Copy any parent transforms. 
    Matrix[] transforms = new Matrix[myModel.Bones.Count]; 
    myModel.CopyAbsoluteBoneTransformsTo(transforms); 

    // Draw the model. A model can have multiple meshes, so loop. 
    foreach (ModelMesh mesh in myModel.Meshes) 
    { 
     // This is where the mesh orientation is set, as well 
     // as our camera and projection. 
     foreach (BasicEffect effect in mesh.Effects) 
     { 
      effect.EnableDefaultLighting(); 
      effect.World = transforms[mesh.ParentBone.Index] * 
       Matrix.CreateRotationY(modelRotation) 
       * Matrix.CreateTranslation(modelPosition); 
      effect.View = Matrix.CreateLookAt(cameraPosition, 
       Vector3.Zero, Vector3.Up); 
      effect.Projection = Matrix.CreatePerspectiveFieldOfView(
       MathHelper.ToRadians(45.0f), aspectRatio, 
       1.0f, 10000.0f); 
     } 
     // Draw the mesh, using the effects set above. 
     mesh.Draw(); 
    } 
    base.Draw(gameTime); 
} 

另一種可能性是,在Max中,對象的樞軸(所有旋轉/縮放/平移變換所基於的中心)不以網格爲中心。 This is easy to change

1

問題是3D Studio Max中的支點不會傳遞給XNA。您可以整天更改樞軸點,並且骨骼變形和頂點將保持不變。它只是不能正確導出。

我有一個MAXScript在http://metlab.cse.msu.edu/xna.html修復這個問題。

Charles