2011-04-20 38 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