高级形状和确定顶点

时间:2013-06-12 22:43:08

标签: opengl import assets

我正在学习OpenGL,并对人们如何制作一些高级形状感到好奇。以一个人模型为例。如果有人在OpenGL中绘制一个人,他们真的必须坐下来,绘制顶点,然后手工构建三角形来制作人吗?我无法想象人们使用OpenGL制作视频游戏并为每个3D模型绘制顶点?你真的必须这样做吗?有更自动化的方式吗?

2 个答案:

答案 0 :(得分:1)

是的 - Maya,Max和其他3D建模程序为您做了很多这方面的工作。这些类型的程序是高级内容的制作方式。它为您提供了大于三角形水平的大型构建块和工具,以加快速度,但您可以根据需要访问或添加三角形。

答案 1 :(得分:1)

在诸如视频游戏之类的3D应用程序的环境中,OpenGL是3D应用程序本身和图形卡驱动程序之间的接口;在某种程度上,您向OpenGL发出的命令已翻译并传递给驱动程序,而驱动程序又是软件世界和图形卡之间的接口。一个完整的3D应用程序通常需要很多其他软件组件才能真正有趣,而对游戏来说最重要的当然是资产系统,它用于导入到你的游戏所有艺术的东西,如图像,声音效果和3D模型(可能包括游戏关卡)。这些艺术品或资产是由艺术家使用专用软件包制作的。对于3D模型,一些最流行的建模应用程序是Blender,Maya,Max,Lightwave。这些软件包中的每一个都定义了自己的文档格式,用于将资产保存到磁盘;如果您知道格式,则可以编写一个程序来读取文件并向OpenGL发出适当的命令以呈现场景。在最基本的层面上,您需要找到文件中存储顶点的位置,并使用OpenGL绘制它们。我所知道的引擎确实没有这样做,也就是说,阅读建模应用程序文档的内容,因为它们是非常复杂的格式,在某些情况下甚至没有记录。

相反,游戏引擎开发者通常会免费创建或购买或下载一对程序:

  • 导出程序是一个从3D文档中提取相关信息并将其保存到文件中的程序。这可以是一个独立的程序,也可以是3D应用程序本身的插件;例如,Blender通常使用用Python编写的插件,其中包括导出器插件。
  • 导入程序通常是您链接到游戏引擎的库,并且能够将导出程序导出的文件加载到内存中。将此数据结构加载到内存后,您可以迭代其字段并将相应的命令发送到OpenGL。

这是Blender的一个非常简单的例子;以下Python脚本足以导出顶点位置。通常,您还需要导出面(三角形)信息,以便能够导出有趣的东西。

import bpy

object = bpy.data.objects['Cube']
mesh = object.to_mesh(scene = bpy.context.scene, apply_modifiers = True, settings = 'PREVIEW')

file = open('/Users/Damix/Cube.txt', 'w')

for v in mesh.vertices:
    file.write("%f %f %f\n" % (v.co[0], v.co[1], v.co[2]))

file.close()

对于实际的多维数据集,上面的脚本会输出与此类似的文件:

1.000000 1.000000 -1.000000
1.000000 -1.000000 -1.000000
-1.000000 -1.000000 -1.000000
-1.000000 1.000000 -1.000000
1.000000 0.999999 1.000000
0.999999 -1.000001 1.000000
-1.000000 -1.000000 1.000000
-1.000000 1.000000 1.000000

您可以使用以下内容(对于C语言)将此文件读入您​​的游戏:

float x, y, z;
FILE *file;

file = fopen("/Users/Damix/Cube.txt", "r");

while (fscanf(file, "%f %f %f", &x, &y, &z))
{
    glVertex3f(x, y, z);
}

fclose(file);

在现代OpenGL中,您不会使用 glVertex3f 而是构建属性缓冲区。

在真实游戏引擎中,您还需要导出纹理坐标,法线信息,材质设置以及最可怕的动画数据(如果您有动画)。 此外,由于3D建模应用程序可能具有与OpenGL不同的3D约定,因此您需要转换数据;例如,尽管Blender是用OpenGL编写的,但它使用了一个参考框架,其中Z轴指向上方。

通常明智的做法是使用众所周知的交换格式,对于3D建模包,已存在导入器和导出器。 Blender开箱即用,支持导出Alias Wavefront .OBJ,这是一种非常简单的格式,编写导入器并不困难。还有其他出口商,但我不知道他们的质量,我从来没有真正使用过它们。您需要进行研究并为您选择正确的格式。