游戏内角色模型推荐的 3D 模型类型,手动加载?

Posted

技术标签:

【中文标题】游戏内角色模型推荐的 3D 模型类型,手动加载?【英文标题】:Recommended 3D model type for in-game character model, loaded manually? 【发布时间】:2010-10-09 19:17:10 【问题描述】:

我正在用 JOGL 编写游戏,需要代表游戏中的角色。我打算为角色的动作使用骨骼动画,当然角色会被蒙皮。我似乎无法为 JOGL 找到任何好的模型加载器,所以我计划根据规格或其他东西自己加载文件类型。我还计划使用 Blender 作为我的 3D 建模器,所以最好使用其中存在的某种类型。

你推荐我使用什么文件类型? 。混合? .x, .3ds, .md2/3/5, ...??请记住,我想要具有明确定义格式的东西,这样我就可以编写加载程序而不必对某些随机文件格式进行反混淆,并且它需要支持上述功能。您可以提供有关您选择它的原因以及为什么它是最好的任何其他信息也将非常有帮助!

谢谢!

编辑: 我将编写一个 Blender MS3D 导出​​器。完成后我会发布它here。

同时,请参阅下面我标记的答案;但从那以后发生了更多事情。我不会用我正在做的事情来更新它,但基本上我找到了 jMonkey Engine,它已经有一个 ms3d 导入器和其他我已经开始手写的子系统。尽管有场景图的东西(这就是我避免使用 Java3D 的原因),但我认为加入它是我最好的选择,所以这就是我要做的。

【问题讨论】:

【参考方案1】:

如果您可以只使用几何图形,或者准备处理自己的纹理,那么 .obj 可能是最直接且受广泛支持的 3D 文件格式。它基本上是 3D 建模的 ascii。

否则我会倾向于 vrml。它定义明确,至少有一些代码可以帮助您入门。我已经使用免费提供的代码成功地将 vrml 模型加载到 java3D 中。原生文件的大小往往很大,但这可以通过使用压缩格式来解决。

我不推荐 .3ds。我唯一一次处理这种格式的阅读器是在 Delphi Pascal 中,它很混乱、定义不明确、难以处理并且往往有很多“变化”,尽管我设法让我的阅读器处理模型从3D-MAX 本身很好,它拒绝了许多声称是 3DS 格式但格式不正确的其他包中的模型。

添加:此外,我建议您查看 Java3D API 和 O'Reilly 的书 Killer Game Programming in Java,因为即使您不走 Java3D 路线,它也可能会回答您的很多问题。

【讨论】:

我不太确定.obj,它似乎效率极低。我不需要人类可读的格式。我会研究是什么让 vrml 变大,也许会制作我自己的调整版本,谢谢!还有谁? :) Obj 效率低,但非常标准。您可能还想看看 Java3D,尤其是 O'Reilly 的书“Killer Game Programming in Java”,它可能会回答很多问题。【参考方案2】:

首先,感谢其他两位回答者。同样 basszero 你对混合文件的看法是对的,我应该先检查一下***!这是一个几乎没用的 Blender 内存的二进制转储。

写完这个问题后不久,我决定继续写一个 OBJ 加载器,因为 1)它会给我加载 3D 文件格式的体验,以及 2)它看起来不错,常用但也很容易载入。这最终成为了一个伟大的决定,因为它让我意识到,我实际上并不知道对象和组之间的区别,而且我对材料也不太了解。它帮助我建立了这些 3D 结构的代码。

两个答案都推荐基于 XML 的格式。我不想要 XML 格式。我认为这不是 XML 的正确位置。我相信创建这些格式是因为 XML 灵活、通用且易于为其创建模式,但这不是我想要的。我想要一种可以快速加载的格式(相对而言,XML 不是),它不必是灵活的或人类可读的,并且我可以为它编写一个导入器,而不是依赖于 XML 库。 basszero 甚至说,“以成为 XML 为代价”,他完全正确;这是我觉得不值得承担的成本。

我的 OBJ 加载器已完成。我将它与实际的模型类分开,并使用 MeshFactory 接口实现它,以便将来我可以根据需要编写不同的加载器......这是计划。过去几天我一直在做更多的研究,并决定使用 ms3d 格式。

ms3d 格式支持骨骼绑定(关节)和关键帧骨骼动画,此外还支持纹理贴图和 Alpha 贴图。此外,它是一种易于计算机读取的二进制格式,不浪费空间(如 XML 和 OBJ),带有人类可读的标签和标签等。

不幸的是,Blender 没有(工作的)ms3d 导出脚本,所以我将自己编写一个脚本。幸运的是,这不是一个艰难的过程,您可以阅读 Blender 的文档并使用其他导出器作为示例。我将不得不复习我的 Python,但除此之外,从我在其他脚本中看到的情况来看,它似乎非常简单。

Java 方面的东西应该很简单,实际上它比 OBJ 格式更容易,因为 ms3d 更加结构化。我在网上找到了 specifications 用于 ms3d 格式的 C 风格(天才!),因此它们非常不言自明,我对格式没有进一步的问题。我将根据这个规范来实现我的实现,尽管我以后可能会实现我自己的变体;这是编写自己的导入器和导出器的好处,我可以根据需要修改格式。

总而言之,我认为这是最好的解决方案。

basszero,你是绝对正确的,正如我从我的 OBJ 加载器中看到的那样:“一旦你把它全部读入,数据的组织(显示列表、纹理、顶点数组、顶点缓冲区等)和渲染是完全不同的野兽。”

Cruachan:我没有 Java3D,我坚持使用 JOGL。我确实拥有那本书(尽管目前无法访问)虽然我不记得他是如何加载模型的,但我很确定他使用了自动加载的 Java3D 格式加载器。不是我打算使用的东西...对不起!

-佝偻病

【讨论】:

【参考方案3】:

我相信 .blend 主要是来自 Blender 的内存结构的二进制转储,在 Blender 之外对您没有太大帮助。使用 Blender 建模,但导出为不同的格式。

这可能有点冗长,但我听说 Collada 很好地封装了 3D 信息(以 XML 为代价)。好处是可能有一个属性模式定义,您可以通过 JAXB 传递它,从而生成一个完整的解析器,而您无需进行任何工作。

.md* 格式也可能是一个不错的选择。它们来自 iD 引擎(q1、q2、q3、q4、doom3),并且已记录在案。它们还包含动画序列。

读完所有内容后,数据的组织(显示列表、纹理、顶点数组、顶点缓冲区等)和渲染就完全不同了。

【讨论】:

【参考方案4】:

有一个开源 .blend 文件阅读器,可以从 .blend 文件中提取任何信息,包括网格、纹理、骨架和动画。

在此处查看一些使用 Ogre 和 Irrlicht 的示例: http://gamekit.googlecode.com

【讨论】:

以上是关于游戏内角色模型推荐的 3D 模型类型,手动加载?的主要内容,如果未能解决你的问题,请参考以下文章

XNA 3D RPG 编程继承

微信小程序ThreeJs加载3D模型

Unity3D游戏开发之换装系统的实现

实现在3D模型上加载2D图片,3D模型用obj+mtl格式的文件实现的

vrchat特效模型在哪找

PHP加载3D模型WebGL