我正在学习 OpenGL,并对人们如何制作一些高级形状感到好奇。以人物模型为例。如果有人在 OpenGL 中画一个人,他们真的必须坐下来,绘制顶点,然后手动构建三角形来制作人吗?我无法想象人们使用 OpenGL 来制作视频游戏并为每个 3D 模型绘制顶点?你真的必须这样做吗?有没有更自动化的方法?
2 回答
在视频游戏等 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 具有开箱即用的支持,这是一种非常简单的格式,编写导入器并不难。还有其他出口商,但我不知道他们的质量,我从来没有真正使用过它们。您需要进行研究并为您选择正确的格式。
是的,有——Maya、Max 和其他 3D 建模程序为您做了很多这样的工作。这些类型的程序是制作高级东西的方式。它为您提供了远高于三角形级别的大型构建块和工具,以加快速度,尽管您可以根据需要访问或添加三角形。