我在计算高度图的法线时遇到了一个小问题。它有一个奇怪的行为。在较高点和较低点,法线很好,但在中间,它们似乎是错误的。它们由点光源照亮。
未固定的源已删除
编辑: 尝试了 2 种新方法:
这是按面法线。看起来不错,但你看到的是单人脸。
Position normal = crossP(vectorize(pOL, pUR), vectorize(pOR, pUL));
我也尝试过以这种方式对每个顶点执行此操作,但输出也很奇怪。
这是 Nico 提出的建议:
它看起来也很奇怪。也许我计算帮助点的方式有误。
未固定的源已删除
编辑 2: 我的观点定义: OL,OR,UL,UR 是要绘制的平面的角顶点。
postVertPosZ1 postVertPosZ2
preVertPosX1 pOL pOR postVertPosX1
preVertPosX2 pUL pUR postVertPosX2
preVertPosZ1 preVertPosZ2
EDIT3:
我现在解决了。这是一个愚蠢的错误: 我忘记将帮助顶点的 y 值与高度乘数相乘,不得不更改一些值。
最佳答案
有很多方法可以解决这个问题。我没有遇到你的。我建议使用中心差异来估计高度场的偏导数。然后用叉积得到法线:
每个顶点法线都可以从它的四个邻居中计算出来。你不需要飞机和它的邻居:
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/