我正在学习OpenGL,并对人们如何制作一些高级形状感到好奇。以一个人模型为例。如果有人在OpenGL中绘制一个人,他们真的必须坐下来,绘制顶点,然后手工构建三角形来制作人吗?我无法想象人们使用OpenGL制作视频游戏并为每个3D模型绘制顶点?你真的必须这样做吗?有更自动化的方式吗?
答案 0 :(得分:1)
是的 - Maya,Max和其他3D建模程序为您做了很多这方面的工作。这些类型的程序是高级内容的制作方式。它为您提供了大于三角形水平的大型构建块和工具,以加快速度,但您可以根据需要访问或添加三角形。
答案 1 :(得分:1)
在诸如视频游戏之类的3D应用程序的环境中,OpenGL是3D应用程序本身和图形卡驱动程序之间的接口;在某种程度上,您向OpenGL发出的命令已翻译并传递给驱动程序,而驱动程序又是软件世界和图形卡之间的接口。一个完整的3D应用程序通常需要很多其他软件组件才能真正有趣,而对游戏来说最重要的当然是资产系统,它用于导入到你的游戏所有艺术的东西,如图像,声音效果和3D模型(可能包括游戏关卡)。这些艺术品或资产是由艺术家使用专用软件包制作的。对于3D模型,一些最流行的建模应用程序是Blender,Maya,Max,Lightwave。这些软件包中的每一个都定义了自己的文档格式,用于将资产保存到磁盘;如果您知道格式,则可以编写一个程序来读取文件并向OpenGL发出适当的命令以呈现场景。在最基本的层面上,您需要找到文件中存储顶点的位置,并使用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,这是一种非常简单的格式,编写导入器并不困难。还有其他出口商,但我不知道他们的质量,我从来没有真正使用过它们。您需要进行研究并为您选择正确的格式。