【问题标题】:XNA model import - All meshs appear on top of each otherXNA 模型导入 - 所有网格相互重叠
【发布时间】:2012-02-13 15:57:10
【问题描述】:

我在 3DS Max 中使用库存引擎模型创建了一个场景,并添加了我自己、飞机和按钮的一些东西。

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

无论我如何导出场景,无论是使用 panda 导出器的 .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 并没有导出我在场景中创建的对象相对于场景原点的位置。

【问题讨论】:

  • 请注意,panda X 导出器有时无法与 XNA 一起使用。
  • 您是否尝试过从互联网上下载模型并使用它来测试它是您的代码还是模型?

标签: c# 3d xna 3dsmax


【解决方案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
    }
}

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

【讨论】:

  • 我认为您不需要额外的* transforms[i]
  • @Neil 如果你能确认,我会删除它
  • 用我用来显示我如何加载模型的代码更新了我的答案
  • @annonymously 尼尔是正确的。不需要额外的 '* transforms[i]',transforms[m.pb.i] 就足够了。但这是您希望将其应用于模型的所有网格的世界变换的好地方。
猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2020-12-08
  • 1970-01-01
相关资源
最近更新 更多