4

好的...我正在做简单的 OpenGL ES 编程,当我说简单时,我所做的最复杂的事情只不过是美化的斜角立方体和 L 形。(非常像俄罗斯方块,但在 3D 中。)但是,将所有顶点数据输入应用程序要么是 a)手工编码(UGH!)要么 b)第 3 方游戏引擎(双 UGH !!!)或者你使用一些3rd 方文件类型导入器。(部分呃!)

除了一个例外。

我一直在 Mac 上使用一个名为 Cheetah3D 的程序,它是一个非常好的建模器(不是很好,但很可靠......很好),而且我在其他地方没有看到的一件事是能够直接导出你的模型到 c-ready 头文件。它为您导出所有数组,甚至为您提供渲染它们的代码(尽管在注释掉的块中作为参考。)

虽然这对我们所做的 90% 都很好,但有些事情是建模者无法做到的,比如允许我为两个不同的面指定相同的顶点,但为每个面使用不同的法线……甚至混合平面和弯曲的法线(或者更确切地说它们如何渲染)在同一模型中。

请注意,这些功能很容易在 .obj 文件中描述,因为您的法线和顶点位于不同的数组中,您可以轻松地与面一起指定它们,但它们不会以这种方式出现在头文件中。

SO... obj 文件(或任何其他适用于此问题的文件类型...)将其放入代码的最佳方式?

想法?

4

4 回答 4

3

OBJ 文件格式。

任何从事 3D 工作的人,有时都应该编写一个obj模型加载器。

它是一种非常简单的文件格式。

v
t
n
f

在哪里:

  • v 是顶点。
  • t 是纹理坐标。
  • n 是正常的。
  • f是脸。

一个示例 obj 文件段:

v 1.0 0.1 0.1
t 1.0 0.0
n 1.0 1.0
f 1/1/1 1/1/1 1/1/1

所需要的只是存储上述的四个集合,当涉及到渲染顶点的面时,使用索引并执行简单的查找。简单的文件 I/O 在任何语言中都非常容易实现,所以总而言之,使用 obj 文件非常容易。

自然,obj 文件的缺点是它们会变得非常大。就个人而言,我从来没有发现这是一个问题,并且经常以 obj 文件格式为起点,并删除一些重复项,以专门为我的应用程序创建自定义文件格式。

于 2010-01-06T22:00:17.213 回答
2

当然,您不想在代码中嵌入任何内容,加载 OBJ 是一个不错的选择,但不同的建模者可以拥有自己的 OBJ 实现,因为没有官方的格式标准。这很简单,但我见过很多应用程序 X 无法从应用程序 Y 加载 OBJ 的情况。因此,如果您打算从不同的包中创作资产,请查看它们输出的 OBJ 文件,以确保它们遵循相同的约定。

我找到的最好的 OBJ 文件文档在这里http://www.martinreddy.net/gfx/3d/OBJ.spec

我发现这是一个很好的起点,但是如果您的应用程序变得更加复杂,并且您开始深入研究对象上更复杂的材质定义,那么您可能想要研究更标准化的东西,例如 Collada - 基于 XML 的格式 ( https:// collada.org)涵盖了更多内容,但加载到您的应用程序中也会更加复杂。

此外,生成 OBJ 文件的另一个不错的选择是 Blender,这是一个免费且非常可靠的建模工具 ( http://www.blender.org )。

于 2010-01-06T22:15:02.227 回答
2

OBJ 文件在历史上被使用了很多,并且滚动您自己的导入器或至少一个适用于您关心的简单模型的导入器并不难。只需处理顶点、颜色和法线即可开始,您对所描述的简单模型就可以了。如果您尝试读取任意 OBJ 文件,肯定会失败——但不要那样做。;^)

如果我正确阅读了您的 cheetah3d 评论,您当然不想每次修改模型时都重新编译。那会很快变得乏味。

于 2010-01-05T03:56:29.967 回答
1

我已经为在 iPhone (OpenGL ES) 上运行良好的AC3D文件编写了一个阅读器/渲染器

随意看看这里

Jeff Lamarche 在google code上也有一个 obj loader 。

于 2010-01-06T21:57:23.700 回答