计算高度图的法线

Esk*_*ior 7 c++ opengl math vector normals

我的高度图计算法线有一个小问题.它有一种奇怪的行为.在较高点和较低点,法线很好,但在中间它们似乎是错误的.它们被点光照亮.问题

已删除未修复的源

编辑:尝试了两种新方法:

这是正常的.它看起来很好,但你看到单面.

Position normal = crossP(vectorize(pOL, pUR), vectorize(pOR, pUL));
Run Code Online (Sandbox Code Playgroud)

我也尝试用这种方式按顶点做,但也有一个奇怪的输出.

在此输入图像描述

这是Nico提出的建议:

它看起来也很奇怪.也许我如何计算帮助点是错误的.

已删除未修复的源

在此输入图像描述

编辑2:我的点的定义:OL,OR,UL,UR是要绘制的平面的角顶点.

                postVertPosZ1 postVertPosZ2
preVertPosX1         pOL           pOR         postVertPosX1
preVertPosX2         pUL           pUR         postVertPosX2
                 preVertPosZ1  preVertPosZ2
Run Code Online (Sandbox Code Playgroud)

EDIT3:

我现在解决了.这是一个愚蠢的错误:我忘了将帮助顶点的y值乘以高度乘数,并且必须更改一些值.

现在很漂亮. 在此输入图像描述

Nic*_*ler 10

有很多方法可以解决这个问题.我没有遇到过你的.我建议使用中心差异来估计高度场的偏导数.然后使用十字产品来获得正常:

可以从其四个邻居计算每个顶点法线.你不需要飞机加上它的邻居:

  T
L O R
  B
Run Code Online (Sandbox Code Playgroud)

O是要为其计算法线的顶点.其他顶点(顶部,右侧,底部,左侧)是它的邻居.然后我们想要计算水平和垂直方向的中心差异:

             /           2           \
horizontal = | height(R) - height(L) |
             \           0           /

             /           0           \
vertical   = | height(B) - height(T) |
             \           2           /
Run Code Online (Sandbox Code Playgroud)

法线是这些切线的交叉积:

normal = normalize(cross(vertical, horizontal))
                   / / height(L) - height(R) \ \
       = normalize | |           2           | |
                   \ \ height(T) - height(B) / /
Run Code Online (Sandbox Code Playgroud)

请注意,这些计算假设您的x轴向右对齐,而z轴向下对齐.