通过偏导数计算切线和切线矢量

时间:2013-08-25 14:37:41

标签: math graphics vector derivative

我正试图用GPU Gems 1 chapter 1的理论来实现一个简单的水模拟。

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

heightfield function

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

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

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

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

这很容易实现。

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

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

bitangent和tangent向量是x和z方向的偏导数(y是高度域值)。

所以我的问题是,如何在高度场函数的x方向和z方向上取偏导数?

文章说x方向的偏导数由

给出

partial derivative in the x direction

partial derivative in the x direction2

我理解采用偏导数from this video:的概念,但我不知道如何取高度函数的偏导数。

有人可以解释它(就像我5岁) - 我对数学的掌握并不是很好!

1 个答案:

答案 0 :(得分: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)