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

我从链接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 [] []告诉如何链接顶点以制作三角形。 例如,第一个三角形由第零个,第四个和第一个顶点组成。 如果按照给定的顺序获取三角形的顶点,则所有三角形都具有相同的方向。

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

对于相对简单的形状,您可以将它们绘制到一张纸上的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 ZX ] = - X * Z * Z - X * Z * Z = - 2 * X * Z * Z [ X 0.0 Z ] 

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

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

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

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

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