2014-05-18 124 views
6

起初,看起来很明显......只要找到4个指标,每个脸部都做2个三角形,对吧?
含义,以下内容:将OBJ文件中的四角形转换为三角形?

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。

+0

我明白这里的混乱,我花最近两天试图弄清楚这一点。这些不是QUADs,而是三角形条,文档很差。 – Geoffrey

回答

9

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

0 1 2 3 

划分成两个三角形是一个与第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)] 

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

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

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

你确定这对所有情况都是正确的吗?在我上面的最后一个“立方体”示例中,这将错误地渲染其中一个面,导致立方体的一侧出现“切角”(即使使用GL_TRIANGLE_FAN)。因此,无论是我的代码或对象本身有其他问题,或者您的答案不能处理所有情况。 – RectangleEquals

+2

哪张脸你有问题?我草绘了它,使用基于0的索引时,它看起来都很好。但是你发布的示例文件确实被破坏了,因为OBJ文件中的索引应该是基于1的。以下是一个立方体示例:http://people.sc.fsu.edu/~jburkardt/data/obj/cube.obj。文件格式定义:http://www.fileformat.info/format/wavefrontobj/egff.htm。 –

+0

谢谢,我会看看那个,我会回复你 – RectangleEquals

0

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

原来,这些实际上是一个奇数顺序的三角形带。正确转化为三角形如下(伪码):

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