2013-03-01 113 views
4

我已经在谷歌搜索了很多小时,没有很好的解释,我与照明workign一个答案,我需要顶点法线,让我们假设我们有这个顶点缓冲(这是一个立方体):计算顶点法线

static const GLfloat g_vertex_buffer_data[] = { 
-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, 
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 
}; 

所以,我怎么能计算顶点法线? 就是这样。由于

回答

7

这不是计算它们本身的问题,法线是对象的作品的一部分。如果您将每个角落的正常点从立方体“向外”放置,则会出现蓬松圆润的外观,而如果您将它们指向正方形(垂直于立方体这一侧的平面),则会有一个明显的定义立方体。

如果你有一个更复杂的(平滑)表面有许多三角形,你可以通过平均三角形边的交叉产品的价值计算法线。那会让最光滑的外观。在这种情况下,你仍然在作出艺术判断。每个对象都没有答案。

+0

谢谢!所以,如果我有一个扁平物体,我不需要规范化或使用光照内的顶点法线? 任何使用该顶点平滑的例子? – Spamdark 2013-03-01 01:49:58

+3

@Spamdark:您仍然需要*在你的照明代码中规范化*(确保矢量的长度是* 1 *),以便计算出数学。你仍然需要一些顶点正常。试试这个网址:http://www.lighthouse3d.com/opengl/terrain/index.php3?normals – 2013-03-01 01:52:56

+0

最后一个问题。 '平均所述triangles' 的侧面的横产物的值是获得三角形的边的3个向量(V1,V2,V3),那么'(cross1 + cross2 + cross3)/ 3的横' – Spamdark 2013-03-01 02:21:06

3

如果你只有几何形状,而不是法线,那么你可以写一个小程序来生成正常的每个顶点处。一般过程是平均共享给定顶点的面的法线面。然而,对于更多的“离散”形状(抱歉的数学家),如立方体,最好只使用一个面法线,并将其用于一边的顶点法线。

This Lighthouse3D tutorial解释一样Slide 22 of this USC Lecture顶点法线背后的数学。