XNA模型导入 - 所有网格显示在彼此之上

时间:2012-01-18 22:29:01

标签: c# 3d xna 3dsmax

我在3DS Max中创建了一个带有股票引擎模型的场景,还有一些我添加了自己,平面和按钮的东西。

http://i.stack.imgur.com/R2iva.png

无论我如何导出场景,无论是使用熊猫导出器的.X还是使用2012.2 fbx导出器的.fbx,当加载到XNA并渲染时,它们都显示在彼此之上。

http://i.stack.imgur.com/6gdMb.png

由于引擎的各个部分都保留在它们应该的位置(并且在3ds max中是单独的),我非常确定在3ds max中有一些东西我没有正确设置其他对象的布局。

更新1:我用于在xna中加载模型的代码如下

        Matrix[] transforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(transforms);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect be in mesh.Effects)
            {
                be.EnableDefaultLighting();
                be.Projection = camera.projection;
                be.View = camera.view;
                be.World = GetWorld() * mesh.ParentBone.Transform;
                // adding the additional * transforms[i]; didnt do anything  

            }
            mesh.Draw();
        }

此代码适用于其他人的模型,但不适用于我制作的任何模型。就像3ds max不会导出我在场景中相对于场景原点创建的对象的位置。

1 个答案:

答案 0 :(得分:1)

您需要组合来自父骨骼和子骨骼的所有变换矩阵,如下所示:

Matrix[] transforms = new Matrix[model.Bones.Count];
model.CopyAbsoluteBoneTransformsTo(transforms);

foreach (ModelMesh mesh in model.Meshes) {
    foreach (BasicEffect ef in mesh.Effects) {
        ef.World = transforms[mesh.ParentBone.Index];
        //Also do other stuff here, set projection and view matrices
    }
}

可能有更好的方法,但这段代码应该有用。