如何在opengl中定位二十面体的面?

时间:2014-06-20 14:11:39

标签: c opengl geometry orientation

我看到以下代码通过链接http://www.glprogramming.com/red/chapter02.html

制作二十面体
#define X .525731112119133606 
#define Z .850650808352039932

static GLfloat vdata[12][3] = {    
   {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z},    
   {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X},    
   {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0} 
};
static GLuint tindices[20][3] = { 
   {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},    
   {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},    
   {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6}, 
   {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };
int i;

glBegin(GL_TRIANGLES);    
for (i = 0; i < 20; i++) {    
   /* color information here */ 
   glVertex3fv(&vdata[tindices[i][0]][0]); 
   glVertex3fv(&vdata[tindices[i][1]][0]); 
   glVertex3fv(&vdata[tindices[i][2]][0]); 
}
glEnd();

数组tindices [] []告诉如何链接顶点以制作三角形。例如,第一个三角形由第零个,第四个和第一个顶点构成。如果按照给定的顺序拍摄三角形的顶点,则所有三角形都具有相同的方向。

但是如何才能通过观察代码知道所有三角形是否具有相同的方向?为了获得相同的方向,所有三角形的制作方式必须是顺时针方向或逆时针方向,对吧?那么,我不应该在脑海中构成一个复杂的结构,只是为了知道它们是否具有相同的方向?即使我发现代码中的方向是相同的,我如何自己形成(编写)方向的代码?

1 个答案:

答案 0 :(得分:0)

对于相对简单的形状,您可以将它们绘制到一张纸上的3D坐标系中。使用索引标记每个顶点,并开始枚举三角形,确保从外部查看形状时它们都是逆时针方向。

在数学上,这对你的例子来说相当容易,因为它是一个以原点为中心的凸形。因此,如果计算每个三角形的面法线,则需要指向原点。如果3个角的坐标向量为v0 = (x0, y0, z0)v1 = (x1, y1, z1)v2 = (x2, y2, z2),则可以将面法线计算为v1 - v0v2 - v0的叉积:

[ x1 - x0 ]   [ x2 - x0 ]   [ (y1 - y0) * (z2 - z0) - (z1 - z0) * (y2 - y0) ]
[ y1 - y0 ] x [ y2 - y0 ] = [ (z1 - z0) * (x2 - x0) - (x1 - x0) * (z2 - z0) ]
[ z1 - z0 ]   [ z2 - z0 ]   [ (x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0) ]

为了确定此向量是否指向远离原点,我们使用其中一个顶点计算点积,例如: v0。此点积必须为正三角形为逆时针:

x0 * ((y1 - y0) * (z2 - z0) - (z1 - z0) * (y2 - y0)) +
y0 * ((z1 - z0) * (x2 - x0) - (x1 - x0) * (z2 - z0)) +
z0 * ((x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0))

我会从简单的代数中拯救你,将它们相乘并组合起来。他们中的大多数最终都退出了,简化的结果是:

  x0 * y1 * z2
- x0 * y2 * z1
+ x2 * y0 * z1
- x1 * y0 * z2
+ x1 * y2 * z0
- x2 * y1 * z0

如果这看起来很熟悉,那不是偶然的。它确实是矩阵的决定因素:

[ x0 y0 z0 ]
[ x1 y1 z1 ]
[ x2 y2 z2 ]

这是有道理的,因为此决定因素的符号会告诉您向量v0v1v2是否具有右手方向,这正是我们所寻求的首先。

将其应用于示例的第一个三角形,其中包含顶点0,4,1:

    [ -X  0.0 Z ]
det [ 0.0 Z   X ] = - X * Z * Z - X * Z * Z = - 2 * X * Z * Z
    [ X   0.0 Z ]

第二个三角形,由顶点0,9,4组成:

    [ -X  0.0 Z   ]
det [ -Z  X   0.0 ] = - X * X * X - Z * Z * Z
    [ 0.0 Z   X   ]

第三个三角形,由顶点9,5,4组成:

    [ -Z  X 0.0 ]
det [ 0.0 Z -X  ] = - X * Z * Z - X * Z * Z = - 2 * X * Z * Z
    [ 0.0 Z X   ]

所有这些决定因素都有负值,因此至少前3个三角形都有顺时针方向。