繁体   English   中英

XNA到3d max的模型旋转似乎是错误的

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM