计算顶点法线

Calculating Vertex Normals

本文关键字:顶点 计算      更新时间:2023-10-16

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

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
};

那么,如何计算顶点法线呢?这是所有。由于

这不是计算它们本身的问题,法线是对象艺术作品的一部分。如果你让每个角的法线点从立方体"向外",它会有一种蓬松的,圆形的外观,而如果你让它们指向正外(垂直于立方体的那一边的平面),你会得到一个清晰的立方体。

如果你有一个更复杂(光滑)的表面,上面有许多三角形,你可以通过平均三角形边的叉积来计算法线。这样看起来最平滑。你对那件事仍然是在作艺术判断。

如果您只有几何图形,但没有法线,那么您可以编写一个小程序来生成每个顶点的法线。一般的过程是对共享给定顶点的面的法线求平均值。然而,对于更"离散"的形状(对不起,数学家),比如立方体,最好只使用一个面法线,只使用一个边的顶点法线。

这个Lighthouse3D教程解释了顶点法线背后的数学,就像这个USC讲座的幻灯片22一样。