将基本3D模型转换为OpenGL应用程序

时间:2010-01-05 01:38:34

标签: opengl 3d header vertex

好的......我正在做简单的OpenGL ES编程,当我说简单的时候,我做的最复杂的事情不仅仅是美化的斜面立方体和L形。 (想想非常的俄罗斯方块,但是在3D中。)然而,将所有顶点数据放入应用程序是a)手动编码(UGH!)或b)第三方游戏引擎(双UGH !!!)或者你使用一些第三方文件类型导入程序。 (偏袒!)

有一个例外。

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

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

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

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

思想?

4 个答案:

答案 0 :(得分: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文件格式为出发点并删除一些复制以专门为我的应用程序创建自定义文件格式。

答案 1 :(得分:2)

OBJ文件在历史上使用了很多,并且推出自己的导入器或者至少是一个适用于您关心的简单模型的导入器并不困难。只需处理顶点,颜色和要开始的法线,你会对你描述的简单模型没问题。如果你试图读取任意OBJ文件,它肯定会barf - 但只是不这样做。 ; ^)

如果我正在阅读你的cheetah3d评论,你肯定不想在每次修改模型时重新编译。这将非常繁琐。

答案 2 :(得分:2)

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

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

我发现这是一个很好的起点但是如果你的应用变得更加复杂并且你开始深入研究对象上更复杂的材料定义那么你可能想要研究一些更加标准化的东西,比如Collada--一种基于XML的格式({ {3}})包含更多内容,但加载到您的应用中也会更复杂。

另外,生成OBJ文件的另一个好方法是Blender,这是一个免费且非常可靠的建模工具(https://collada.org)。

答案 3 :(得分:1)

我为AC3D文件编写了一个阅读器/渲染器,可以在iPhone(OpenGL ES)上正常工作

随意查看here

Jeff Lamarche在google code还有一个obj加载器。