我正试图用GPU Gems 1 chapter 1的理论来实现一个简单的水模拟。
如果您想象一个3D平面(xz平面中的平面,y表示任意点的高度),则高度场函数为:
其中: 波长(w):世界空间中波浪之间的波峰到波峰距离。
幅度(A):从水面到波峰的高度。
速度(S):波峰每秒向前移动的距离。
方向(D):垂直于波前的水平矢量 波峰旅行。
这很容易实现。
请注意GPUGems中的文章使用z方向作为高度,但这不是图形的标准(通常,x是宽度,y是高度,z是深度)。所以我将参考xz方向,意思是平面/水平面方向。
因此,在计算任何给定点的高度(y)值后,我需要计算该点的比特和切线向量,以便我可以计算法线向量,这是我需要的照明方程式。
bitangent和tangent向量是x和z方向的偏导数(y是高度域值)。
所以我的问题是,如何在高度场函数的x方向和z方向上取偏导数?
文章说x方向的偏导数由
给出
我理解采用偏导数from this video:的概念,但我不知道如何取高度函数的偏导数。
有人可以解释它(就像我5岁) - 我对数学的掌握并不是很好!
答案 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)