2013-08-25 38 views
1

我试图实现一个简单的水模拟,理论来自GPU Gems 1 chapter 1通过偏导数计算正切和偶数向量

如果想象3D平面(平在xz平面中,其中y在任何点表示的高度),该高度场函数被给定为:

heightfield function

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

振幅(A):从水面到波峰的高度。速度(S):波峰每秒向前移动的距离。方向(D):垂直于波峰前进的波前的水平向量。

这很容易实现。

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

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

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

所以我的问题是,如何在x中获取偏导数,然后在高程场函数中获取z方向?

文章说,x方向的偏导数由

partial derivative in the x direction

partial derivative in the x direction2

我明白采取偏导数from this video:概念给出,但我不知道如何采取我的身高场函数的偏导数。

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

回答

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分量位置。

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) 
+0

感谢这么多的全面的答案:):

类似地,二重(相对于到z衍生物)可以通过

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

因此被描述 – fishfood