我的高度图计算法线有一个小问题。它有一种奇怪的行为。在较高点和较低点,法线很好,但在中间它们似乎是错误的。它们被点光照亮。
取消了未经修复的资源
编辑: 尝试了两种新方法:
这是正常的。它看起来很好,但你看到了单面。
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值乘以高度乘数,并且必须更改一些值。
答案 0 :(得分:7)
有很多方法可以解决这个问题。我没有遇到你的。我建议使用中心差异来估计高度场的偏导数。然后使用交叉产品来获得正常:
每个顶点法线可以从其四个邻居计算得出。你不需要飞机加上它的邻居:
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轴向下对齐。