[英]model rotation in XNA through 3d max seems wrong
我在3d max中創建了一個模型,並且我將它放在世界中。然而當我把它放在XNA中並通過XNA應用旋轉時,看起來它的旋轉中心不是在實際物體中而是稍微偏離它所以它看起來這個對象是在圈子里移動而不是tahn rotationg ...這很煩人任何人知道如何解決這個問題?
當您將對象置於3ds世界中心時,它不會改變頂點位置。 它只創建了一個矩陣,可以將頂點從它們放置到放置位置。
可能,因為通常你沒有世界原點的視覺參考,並且沒有意識到你的模型在XNA中被抵消,所以你可能不會明白你沒有考慮這個矩陣。
這是通過Model.CopyAbsoluteBoneTransformsTo()將該矩陣(通過內容處理器成為“Bone”變換)放入一個可以在設置效果時使用的數組.World。
如果這聽起來可能是問題,並且您想要快速舉例說明代碼,請告訴我們。
問題是3D Studio Max中的軸心點未傳遞給XNA。 您可以整天更改軸心點,骨骼變換和頂點將保持不變。 它只是沒有正確出口。
我在http://metlab.cse.msu.edu/xna.html上有一個MAXScript來解決這個問題。
查爾斯
只是為了擴展@Steve H的答案,這里有幾種可能性:
在XNA代碼中,您沒有將骨骼變換應用於模型。 像大多數建模工具一樣,Max傾向於修改模型的世界變換矩陣而不是頂點本身。 變換頂點往往會引入小的浮點誤差,即圍繞z軸的1,0,0旋轉Pi / 2弧度的頂點可能會變為0,0.99999,0而不是0,1,0 - 這就是性質浮點數學,也是你在游戲中總是從源幾何變換的原因。
下面是骨頭中的鏈接轉換在MSDN例如 (V3.1版本,但也有很多的例子V4那里):注意myModel.CopyAbsoluteBoneTransformsTo(transforms)
和effect.World
分配。 此示例適用於BasicEffect
,但即使您有自己的效果,也需要提取骨骼變換並應用它們。 例如,如果您正在使用自定義着色器,則可以在加載模型時執行此操作。 (請注意,即使您在Max中沒有真正定義模型中的任何骨骼,骨骼變換也是必需的。)
(借用鏈接的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中,對象的樞軸(所有旋轉/縮放/平移變換所基於的中心)不以網格為中心。 這很容易改變 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.