我总是觉得这很难理解,因为它看起来很理论化。
glVertex(0.0f,0.0f,0.0f);
glVertex(0.0f,0.0f,-1.0f);
glVertex(-1.0f,0.0f,-1.0f);
glVertex(-1.0f,0.0f,0.0f);
这是openGL中立方体的一个面。
我打开一个 obj 文件,人脸是这样存储的:
f 61 67 52
f 50 66 49
等等等等
我在这里猜测,但您似乎对 obj 文件的格式感到困惑。
f 61 67 52
实际上非常简单:它指定顶点#61、#67 和#52 在 3D 空间中形成一个三角形(一个面)。
我还要指出,您将四个 OpenGL 即时模式glVertex
调用的序列引用为“立方体的一个面”并不是对该代码实际执行或表示的内容的特别好的描述。代码本身指定了四个 3D 顶点,这是唯一指定的信息。面的概念,或就此而言三角形(3D 图形的构建块)的概念与顶点的规范不同。
有几个原因你看不到很多人在 3D 图形中使用几何术语“脸”,它在 .obj 文件中的使用是一个例外。这是因为图形硬件设计用于对三角形进行操作:如果你想制作一个五边形的脸,你真的需要用 3 个或更多的三角形来构建它。我无法告诉你为什么会这样,f 61 67 52
而不是t 61 67 52
因为那样更有意义。请注意,如果您采用四个不共面的顶点,则无法从中制作出平坦的几何面!这就是为什么可以将三角形称为面的原因:任何 3 个点都是共面的。
网格中的每个面通常都有一个数字,它充当索引和一个法线向量,它显示了这个特定面的渲染侧的方向(简单地从哪里查看可能映射到这个面的纹理)。这一切都取决于如何存储网格的特定格式(obj 只是几种格式中的一种,专有程序通常有自己的封闭格式)。