C++ 计算顶点法线

C++ 计算顶点法线,c++,opengl,vertex,normals,C++,Opengl,Vertex,Normals,我在谷歌上搜索了好几个小时,没有得到很好的解释,我正在使用照明,我需要顶点法线,假设我们有这个顶点缓冲区(它是一个立方体): 那么,如何计算顶点法线呢? 这就是全部。谢谢这不是计算它们本身的问题,法线是对象艺术品的一部分。如果将每个角法线点从立方体“向外”设置,它将具有一种蓬松、圆形的外观,而如果将它们笔直地指向外(垂直于立方体那一侧的平面),则将具有一个清晰定义的立方体 如果有一个更复杂(平滑)的曲面,包含许多三角形,则可以通过平均三角形边的叉积值来计算法线。那会给你最光滑的外观。在那种情况下

我在谷歌上搜索了好几个小时,没有得到很好的解释,我正在使用照明,我需要顶点法线,假设我们有这个顶点缓冲区(它是一个立方体):

那么,如何计算顶点法线呢?
这就是全部。谢谢

这不是计算它们本身的问题,法线是对象艺术品的一部分。如果将每个角法线点从立方体“向外”设置,它将具有一种蓬松、圆形的外观,而如果将它们笔直地指向外(垂直于立方体那一侧的平面),则将具有一个清晰定义的立方体


如果有一个更复杂(平滑)的曲面,包含许多三角形,则可以通过平均三角形边的叉积值来计算法线。那会给你最光滑的外观。在那种情况下,你仍在作出艺术判断。对于每个对象,没有一个答案。

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


解释顶点法线背后的数学原理。

谢谢!所以,如果我有一个平面对象,我不需要规格化或使用照明内部的顶点法线?有没有使用顶点进行平滑处理的例子?@Spamdark:你仍然需要在你的照明代码中进行规范化(确保向量的长度为一)才能计算出数学。你仍然需要一些顶点法线。试试这个网址:最后一个问题
求三角形边的叉积的平均值
是得到三角形边的3个向量(v1、v2、v3)的叉,然后
(cross1+cross2+cross3)/3
@Spamdark:不需要除以3,而是
规格化(cross1+cross2+…)
(三个以上的三角形可能会聚在一个给定的点上)。规格化将使生成的向量长度为1个单位。除以3将产生不可预测的效果。请尝试在二维中绘制这些东西,以了解我的意思。
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
};