我在3d max中创建了一个模型,并且我将它放在了世界中。然而当我把它放在XNA中并通过XNA应用旋转时,似乎它的旋转中心不在实际对象中但稍微远离所以看起来这个物体在圈子里移动而不是旋转...这对任何人都知道如何解决这个问题很烦人?
答案 0 :(得分:1)
当您将对象置于3ds世界中心时,它不会改变顶点位置。它只创建了一个矩阵,可以将顶点从它们放置到放置位置。
可能,因为通常你没有世界起源和视觉参考;没有意识到你的模型在XNA中是偏移的,你可能并不明白你没有考虑这个矩阵。
这是通过Model.CopyAbsoluteBoneTransformsTo()完成的,将矩阵(通过内容处理器变为“Bone”变换)放入一个可以在设置效果时使用的数组.World。
如果这听起来像是问题,而您想要快速举例说明代码,请告诉我们。
答案 1 :(得分:1)
问题是3D Studio Max中的轴心点未传递给XNA。您可以整天更改轴心点,骨骼变换和顶点将保持不变。它只是没有正确出口。
我在http://metlab.cse.msu.edu/xna.html处有一个MAXScript可以解决这个问题。
查尔斯
答案 2 :(得分: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
,但即使您有自己的效果,也需要提取骨骼变换并应用它们。例如,如果您正在使用自定义着色器,则可以在加载模型时执行此操作。 (请注意,即使您在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中,对象的枢轴(所有旋转/缩放/平移变换所基于的中心)不以网格为中心。 This is easy to change