从高度图计算法线

Calculate Normals from Heightmap

我正在尝试使用中心差分将高度图转换为法线矩阵,稍后将对应于给定点的陡度。

我找到了几个结果正确的链接,但没有解释背后的数学原理。

  T
L O R
  B

来自 this link 我意识到我可以做到:

Vec3 normal = Vec3(2*(R-L), 2*(B-T), -4).Normalize();

问题是我不知道 2*-4 来自哪里。

this explanation of central differencing 中,我看到我们应该将该值除以 2,但我仍然不知道如何连接所有这些。

我真正想知道的是这背后的线性代数定义。 我有一个高度图,我想测量中心差异,我想获得法向量以供稍后用于测量陡度。

PS:Z轴为高度

根据矢量微积分,表面的法线由 梯度运算符给出:

高度图h(x, y)是函数的一种特殊形式f:

对于离散化的高度图,假设网格大小为1,上述两个导数项的first-order近似值由下式给出:

因为从 LRx 步骤是 2,y 也是如此。上面正是你的公式,除以4。当这个向量归一化时,4的因子被取消了。

(在写这个答案时没有伤害到线性代数)