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

时间:2014-05-18 16:05:25

标签: java opengl graphics lwjgl wavefront

起初,它似乎很明显......每找到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

这些面在上一个例子中不能以相同的方式分割......所以,我需要一些方法知道如何将四边形面分成两个三角形面,同时使用正确的指数对于第二张脸......

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

2 个答案:

答案 0 :(得分:15)

如果您有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个顶点的面。

编辑:由于您似乎仍然遇到问题,因此请注意这是如何应用于帖子中的示例的。我将列出每个面的四边形的原始索引序列,以及分割四边形后两个三角形的索引序列。

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的索引。

答案 1 :(得分:1)

编写我自己的obj加载程序并仔细阅读规范,详细介绍了&#39; f&#39;参数非常模糊,尤其是看到一些文件包含“f&#39; <>的行关于它们的4个论点。

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

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: A B C D E F G

将是以下5个三角形:

A B C
A C D
B D E
C E F
D F G