XNA 4:导入 FBX 问题
Posted
技术标签:
【中文标题】XNA 4:导入 FBX 问题【英文标题】:XNA 4: import FBX problem 【发布时间】:2011-08-19 14:12:04 【问题描述】:我在从 FBX 文件导入 3D 模型时遇到问题。
源模型包含 575 个对象 + 1 个摄像头,如下所示:http://habreffect.ru/files/23d/542fa7f67/source_model.png
在 XNA 中使用内容管道模型准备包含 82 个网格和 576 个骨骼。 因此,当我绘制模型时,我只看到源模型的一部分。结果图片如下: http://habreffect.ru/files/28a/6e61c0215/Result_view.png
我的绘图代码:
GraphicsDevice.Clear(Color.CornflowerBlue);
Matrix[] transforms = new Matrix[_model.Bones.Count];
_model.CopyAbsoluteBoneTransformsTo(transforms);
foreach (var mesh in _model.Meshes)
foreach (BasicEffect effect in mesh.Effects)
effect.LightingEnabled = true;
effect.EnableDefaultLighting();
effect.World = transforms[mesh.ParentBone.Index] * _world;
effect.View = _view;
effect.Projection = _proj;
mesh.Draw();
base.Draw(gameTime);
如何在 XNA 中的模型实例中获取所有 575 个网格?
谢谢!
UPD:我尝试将我的 FBX 模型导入 3ds max,选择所有网格并使用“Export selected”。结果 FBX 文件大 11 倍。然后我将它作为内容添加到 XNA 项目中,加载的模型包含所有 575 个网格,并且渲染正确。
不幸的是,这种手动转换方法不适合我 - 我需要从可变存储库渲染各种 fbx 模型。
那么,对于 XNA 内容处理器(我使用 XNA 4)来说,什么 FBX 文件是“好”的?
【问题讨论】:
【参考方案1】:所以,在MSDN 上,我发现 FbxImporter 设计用于 2006.11 版本的 FBX 格式。
最近 Autodesk 发布了FBX Converter 2012.1,其中包含其他工具,如 FBX Eplorer、FBX Viewer。
FBX 资源管理器可以显示 FBX 文件的结构,我比较从 3D MAX 文件导出的和源 FBX 文件。它们有不同的内部格式。我尝试进行以下转换:FBX -> Collada -> FBX,结果 FBX 文件包含类似于从 MAX 数据结构中导出的内容。
所以,我只需将结果 FBX 添加到我的 XNA 应用程序的 Content 中,它就可以很好地呈现 :)
另一种方法是使用 Autodesk FBX SDK 手动读取模型,并在 XNA 中绘制。
结论:
-
XNA FbxImporter 正确工作不依赖于 FBX 文件的版本(2006、2011 等)和格式(二进制、ascii)。内部 FBX 数据结构更为重要。
要使 FBX 对于 XNA Importer “可读”,您可以使用双重转换,例如 FBX -> Collada -> FBX
您也可以使用 FBX SDK 从 FBX 手动加载数据
【讨论】:
感谢 FBX 转换器的链接。由于 Blender 以 ASCII FBX 格式而不是二进制格式导出,我可以使用此应用程序将 ASCII 转换为二进制,从而大大减小文件大小。一个简单的平面从 122.81 KB 变为 33.50 KB。 +1【参考方案2】:在最新的 3dx max 2012 中打开 3d 模型并以.fbx
格式导出。这个.fbx
使用 xna 模型加载器正确加载。导出时您甚至可以嵌入资源,因此您不必通过 XNA 为其添加纹理。
【讨论】:
【参考方案3】:您在 3DS MAX 中使用实例化。 XNA 不直接支持此功能。 您必须自己为每个实例骨骼绘制网格。 理想情况下,您应该使用 DirectX 实例化在单个 Draw() 调用中为每个骨骼绘制每个网格一次。 但是你必须通过将骨骼转换为实例顶点来滚动你自己的代码来做到这一点。 默认情况下,XNA 只支持最基本的操作。
【讨论】:
以上是关于XNA 4:导入 FBX 问题的主要内容,如果未能解决你的问题,请参考以下文章