c++ - 计算高度图的法线

标签 c++ opengl math vector normals

我在计算高度图的法线时遇到了一个小问题。它有一个奇怪的行为。在较高点和较低点,法线很好,但在中间,它们似乎是错误的。它们由点光源照亮。 Problem

未固定的源已删除

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

这是按面法线。看起来不错,但你看到的是单人脸。

Position normal = crossP(vectorize(pOL, pUR), vectorize(pOR, pUL));

我也尝试过以这种方式对每个顶点执行此操作,但输出也很奇怪。

enter image description here

这是 Nico 提出的建议:

它看起来也很奇怪。也许我计算帮助点的方式有误。

未固定的源已删除

enter image description here

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

                postVertPosZ1 postVertPosZ2
preVertPosX1         pOL           pOR         postVertPosX1
preVertPosX2         pUL           pUR         postVertPosX2
                 preVertPosZ1  preVertPosZ2

EDIT3:

我现在解决了。这是一个愚蠢的错误: 我忘记将帮助顶点的 y 值与高度乘数相乘,不得不更改一些值。

现在很漂亮。 enter image description here

最佳答案

有很多方法可以解决这个问题。我没有遇到你的。我建议使用中心差异来估计高度场的偏导数。然后用叉积得到法线:

每个顶点法线都可以从它的四个邻居中计算出来。你不需要飞机和它的邻居:

  T
L O R
  B

O 是您要为其计算法线的顶点。其他顶点(上、右、下、左)是它的邻居。然后我们要计算水平和垂直方向的中心差:

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

             /           0           \
vertical   = | height(B) - height(T) |
             \           2           /

法线是这些切线的叉积:

normal = normalize(cross(vertical, horizontal))
                   / / height(L) - height(R) \ \
       = normalize | |           2           | |
                   \ \ height(T) - height(B) / /

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

关于c++ - 计算高度图的法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33736199/

相关文章:

c++ - Sublime3 构建系统在远程 linux 机器上编译 C++

opengl - 这个简单的FxAA如何工作?

c++ - 将浮点值转换为 RGB 值

python - 优化乘法模一个小质数

python - 如何找到两点之间的距离?

c++ - 如何可移植地加载动态库并运行其初始化代码?

C++:文件打开调用失败

c++ - 如何使用 vtk 旋转/平移/翻转 vtkActor2D 对象?

python - 节目要结束但不会停止

c++ - 属性通知更改在 C++/CX 绑定(bind)中等效