OpenGL ES中3D立方体的法线是什么?

9

我有一个定义为:

  float vertices[] = {
            //Vertices according to faces
                -1.0f, -1.0f, 1.0f, //Vertex 0
                1.0f, -1.0f, 1.0f,  //v1
                -1.0f, 1.0f, 1.0f,  //v2
                1.0f, 1.0f, 1.0f,   //v3

                1.0f, -1.0f, 1.0f,  //...
                1.0f, -1.0f, -1.0f,         
                1.0f, 1.0f, 1.0f,
                1.0f, 1.0f, -1.0f,

                1.0f, -1.0f, -1.0f,
                -1.0f, -1.0f, -1.0f,            
                1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f, -1.0f,

                -1.0f, -1.0f, -1.0f,
                -1.0f, -1.0f, 1.0f,         
                -1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f, 1.0f,

                -1.0f, -1.0f, -1.0f,
                1.0f, -1.0f, -1.0f,         
                -1.0f, -1.0f, 1.0f,
                1.0f, -1.0f, 1.0f,

                -1.0f, 1.0f, 1.0f,
                1.0f, 1.0f, 1.0f,           
                -1.0f, 1.0f, -1.0f,
                1.0f, 1.0f, -1.0f,
                                    };

这个立方体的法线是什么?我需要实际的法线数值。

我们需要6个还是12个法线?由于OpenGL ES只使用三角形,这意味着我们需要12个法线,但我可能是错的。

2个回答

17

法向量是针对每个顶点指定的。由于共享每个顶点的三个面的法向量是正交的,因此如果只使用8个顶点来指定一个立方体,并将这三个面的法向量平均得到该顶点的法向量,则会得到一些非常奇怪的结果。它看起来像球体,但形状却像立方体。

相反,您需要指定24个顶点,以便每个立方体面在绘制时不与任何其他面共享顶点。

至于数值,很简单。如果我们假设x朝右增加,y朝上增加,z朝前增加,则右侧的法向量为(1,0,0),左侧为(-1,0,0),顶部为(0,1,0),等等。

总结一下:不要画一个立方体,而是画6个四边形,这些四边形恰好具有重合的顶点。


5
表面的法线只是一个方向向量。由于共面的两个表面的法线相同,因此您只需要6个表面法线。然而,通常情况下,预期会为每个顶点定义法线,在这种情况下,您将需要36个法线(每个面的每个三角形的每个顶点都需要一个法线)。
要计算法线,只需使用以下公式: http://www.opengl.org/wiki/Calculating_a_Surface_Normal

1
24(6x4)个顶点对于一个立方体来说足够了,36个则过多。 - rotoglup
1
嗯,这取决于您如何定义它。如果每个面有2个三角形而不是一个四边形,就像问题中所描述的那样,那么您需要36个。 - jwir3
2
但是三角形仍然可以重复使用顶点。 - PawelP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接