我正在尝试使用正弦波制作水几何着色器。
对于每个顶点,我计算x和y的正弦值,然后将顶点偏移到结果* normal。
因为我偏移了我的顶点,我必须重新计算我的法线,但如果我使用它们的三角形做这个,我会得到硬边,而它应该是平滑的波。
据我所知,我应该使用正弦函数并从中获得3D法线,但我很困惑。
有人可以解释一下你如何在3D空间中得到正常的罪计算?
答案 0 :(得分:1)
你需要得到x和y的导数,这样你就可以构造2个向量1,0,x'
和0,1,y'
,然后你得到交叉乘积并进行标准化。这将是正常的。
答案 1 :(得分:1)
你没有提供你使用的确切功能,但听起来像是:
z = a * sin(b * x) * sin(b * y)
我将完成整个过程,因此即使您的功能看起来略有不同,您也应该能够应用配方。此外,如果您的wave不是相对于xy平面,您仍然可以使用相同的计算,然后将必要的转换矩阵应用于生成的法线。
我们这里有一个参数曲面,其中平面点的3个坐标是从两个参数计算出来的。在这种情况下,参数为x
和y
,描述每个点的向量为:
[ x ]
v(x, y) = [ y ]
[ a * sin(b * x) * sin(b * y) ]
此处描述的过程适用于任何参数曲面,包括常见的几何形状。例如对于圆环,两个参数将是两个角度。计算所需的数学工具是基本分析(衍生物)和一些矢量几何(交叉积)。
作为第一步,我们计算两个参数中每一个的梯度向量。这些梯度向量由每个向量分量的偏导数和相应的参数组成。在示例中,结果是:
[ 1 ]
dv(x, y)/dx = [ 0 ]
[ a * b * cos(b * x) * sin(b * y) ]
[ 0 ]
dv(x, y)/dy = [ 1 ]
[ a * b * sin(b * x) * cos(b * y) ]
法线向量计算为这两个梯度向量的叉积:
[ - a * b * cos(b * x) * sin(b * y) ]
vn = [ - a * b * sin(b * x) * cos(b * y) ]
[ 1 ]
然后你规范化这个向量,vn / |vn|
是你的法向量。