将OBJ文件中的四边形转换为三角形?

起初,它似乎很明显……无论在哪里找到4个指数,每个面都会生成2个三角形,对吧?
含义如下:

v 1.000000 1.000000 0.000000 v -1.000000 1.000000 -0.000000 v 1.000000 -1.000000 0.000000 v -1.000000 -1.000000 -0.000000 f -4 -3 -2 -1 

……反过来,需要转换为:

 v 1.000000 1.000000 0.000000 v -1.000000 1.000000 -0.000000 v 1.000000 -1.000000 0.000000 v -1.000000 -1.000000 -0.000000 f -4 -3 -2 f -2 -3 -1 

当然,这个特定的例子可以正确呈现。
然而,并非所有情况都像将面分割成两个面一样简单(其中第一个面包含原始面的前三个顶点,第二个面包含最后3个顶点,如上例所示)。 以下面的多维数据集为例:

 v 0.000000 1.000000 1.000000 v 0.000000 0.000000 1.000000 v 1.000000 0.000000 1.000000 v 1.000000 1.000000 1.000000 v 0.000000 1.000000 0.000000 v 0.000000 0.000000 0.000000 v 1.000000 0.000000 0.000000 v 1.000000 1.000000 0.000000 f 1 2 3 4 f 8 7 6 5 f 4 3 7 8 f 5 1 4 8 f 5 6 2 1 f 2 6 7 3 

在前面的例子中,这些面不能以相同的方式分割……所以,我需要一些方法知道如何将四边形面分成两个三角形面,同时使用第二个面的正确索引…

怎么能实现这一目标? 请注意,我没有使用固定function管道,因此,使用GL_QUADS不是一个选项。 我的渲染引擎几乎只使用GL_TRIANGLES。

如果你有4个指数,例如:

 0 1 2 3 

划分为两个三角形的是一个具有前三个指数,一个具有第一个,第三个和第四个。 在这个例子中:

 0 1 2 0 2 3 

让我们尝试一些ASCII艺术来说明这一点:

 3-------2 | /| | / | | / | |/ | 0-------1 

在这里你看到0 1 2 3作为四边形, 0 1 2作为第一个三角形(右下角), 0 2 3作为第二个三角形(左上角)。

更一般地,对于具有n个顶点的面,您将生成三角形:

 0 (i) (i + 1) [for i in 1..(n - 2)] 

如果您不坚持使用单独的三角形,您还可以使用仍在核心OpenGL中的GL_TRIANGLE_FAN基元。 这样,您可以使用原始索引序列使用三角形扇形绘制任何凸多边形。 因此,具有顶点序列0 1 2 3的三角形扇形在这种情况下描述了四边形,并且它很容易推广到具有多于4个顶点的面。

编辑:由于您似乎仍有问题,让我们看看这如何适用于您的post中的示例。 我将列出每个面的四边形的原始索引序列,以及分割四边形后两个三角形的索引序列。

 f 1 2 3 4 --> (1 2 3) (1 3 4) f 8 7 6 5 --> (8 7 6) (8 6 5) f 4 3 7 8 --> (4 3 7) (4 7 8) f 5 1 4 8 --> (5 1 4) (5 4 8) f 5 6 2 1 --> (5 6 2) (5 2 1) f 2 6 7 3 --> (2 6 7) (2 7 3) 

当我绘制立方体时,这对我来说是正确的。 请记住从索引中减去1以供您使用,因为这些是基于1的索引,您几乎肯定需要基于0的索引。

编写我自己的obj加载器并仔细阅读规范,’f’参数的细节非常模糊,特别是看到一些文件包含带有> 4个参数的’f’行。

事实certificate,这些实际上是奇数阶的三角形条带。 正确转换为三角形如下(伪代码):

 n = 0; triangles[n++] = [values[0], values[1], values[2]]; for(i = 3; i < count(values); ++i) triangles[n++] = [ values[i - 3], values[i - 1], values[i] ]; 

例:

 f: ABCDEFG 

将是以下5个三角形:

 ABC ACD BDE CEF DFG