C++ 计算四边形网格的法线

C++ 计算四边形网格的法线,c++,3d,mesh,lighting,C++,3d,Mesh,Lighting,我有一个struct QUAD,它存储4个指向4个VECTOR3D的指针(其中包含3个浮点数),以便我可以绘制四边形网格。 据我所知,每当我画一个网格时,我也需要法线来正确地照亮/着色网格,当它是一个网格放在一个平面上时,使用每个面的法线是相对容易的 当我在XZ坐标系上放置2乘2的四边形网格,并尝试将其中心(0,0,0)升高某个点,比如(0,4,0),它将开始形成真实的3D形状,然后我需要再次计算法线。我很难理解如何以及怎样计算法线。正如预期的那样,3D形状的阴影看起来仍然是一个平面网格,因此它

我有一个struct QUAD,它存储4个指向4个VECTOR3D的指针(其中包含3个浮点数),以便我可以绘制四边形网格。 据我所知,每当我画一个网格时,我也需要法线来正确地照亮/着色网格,当它是一个网格放在一个平面上时,使用每个面的法线是相对容易的

当我在XZ坐标系上放置2乘2的四边形网格,并尝试将其中心(0,0,0)升高某个点,比如(0,4,0),它将开始形成真实的3D形状,然后我需要再次计算法线。我很难理解如何以及怎样计算法线。正如预期的那样,3D形状的阴影看起来仍然是一个平面网格,因此它并不代表真实的形状。其中一种解释是,我需要计算每个顶点的法线,而不是每个面的法线。
这是否意味着我需要计算网格所有角的法线?一旦我有了法线,我会怎么做?我仍然在使用老的glBegin-glEnd方法,但现在我觉得我需要使用DrawArray方法。我很困惑,我很确定我没有发出太多声音,但我非常感谢你的帮助。

如果你需要平面,那么你的法线将是四平面的法线。如果你需要“柔和外观”的曲面,你需要混合(并观看酷炫的简单视频)法线-这将增加某种梯度。

因此,如果我要计算顶点法线,我是否需要在所有9个坐标(2x2网格)之间循环计算法线顶点并将其存储在单独的空间中,然后使用glNormalPointer/glvertexPointer和glDrawArrays?如果您想使用老式api,可以使用旧方法设置法线。唯一的区别是法线值与该点的其他法线值混合(如果一个四边形中有多个法线值,则一个四边形中有该点),因为每个四边形都有自己的法线,并且您希望软化曲面之间的过渡。