1

我正在尝试使用GPU Gems 1 第 1 章中的理论来实现一个简单的水模拟。

如果你想象一个 3D 平面(在 xz 平面上是平的,y 表示任意点的高度),高度场函数为:

高度场函数

其中: 波长 (w):世界空间中波之间的波峰到波峰的距离。

振幅(A):从水面到波峰的高度。

速度(S):波峰每秒向前移动的距离。

方向(D):垂直于波前行进的水平矢量。

这很容易实现。

请注意 GPUGems 中的文章使用 z 方向作为高度,但这不是图形的标准(通常,x 是宽度,y 是高度,z 是深度)。所以我将参考 xz 方向,意思是平面/水平平面方向。

因此,在计算了任何给定点的高度 (y) 值后,我需要计算该点的双切线和切线向量,以便可以计算出照明方程所需的法线向量。

双切线和切线向量是 x 和 z 方向的偏导数(y 是高度场值)。

所以我的问题是,我怎样才能在 x 和 z 方向上对高度场函数进行偏导数?

文章说x方向的偏导数由下式给出

x 方向的偏导数

x 方向的偏导数2

我理解从这个视频中获取偏导数的概念:,但我不知道如何对我的高度场函数进行偏导数。

有人可以解释一下吗(比如我 5 岁)-我对数学的掌握不是很好!

4

1 回答 1

2

您想要导出以下等式:

W(x) = A * sin(w * (D.x * x + D.y * z) + t * phi)
     = A * sin(w * D.x * x + w * D.y * z + t * phi)

这是上面的公式与扩展的点积。因为我们想要找到关于 x 的导数,所以所有其他变量(x 除外)都被认为是常数。所以我们可以替换常量:

c1 = A
c2 = w * D.x
c3 = w * D.y * z + t * phi
W(x) = c1 * sin(c2 * x + c3)

导数是:

W'(x) = c1 * c2 * cos(c2 * x + c3)

还原我们得到的替换:

W'(x) = A * w * D.x * cos(w * D.x * x + w * D.y * z + t * phi)

它描述了给定位置的切线的 y 分量。

类似地,双切线(关于 z 的导数)可以描述为

W'(z) = A * w * D.y * cos(w * D.y * z + w * D.x * x + t * phi)

所以:

tangent   = (1, W'(x), 0)
          = (1, A * w * D.x * cos(w * D.x * x + w * D.y * z + t * phi), 0)
bitangent = (0, W'(z), 1)
          = (0, A * w * D.y * cos(w * D.y * z + w * D.x * x + t * phi), 1)
于 2013-08-25T17:01:16.790 回答