用曲线重新计算法线(正弦波)

时间:2014-06-11 14:30:52

标签: c++ opengl hlsl normals

我正在尝试使用正弦波制作水几何着色器。

对于每个顶点,我计算x和y的正弦值,然后将顶点偏移到结果* normal。

因为我偏移了我的顶点,我必须重新计算我的法线,但如果我使用它们的三角形做这个,我会得到硬边,而它应该是平滑的波。

据我所知,我应该使用正弦函数并从中获得3D法线,但我很困惑。

有人可以解释一下你如何在3D空间中得到正常的罪计算?

2 个答案:

答案 0 :(得分:1)

你需要得到x和y的导数,这样你就可以构造2个向量1,0,x'0,1,y',然后你得到交叉乘积并进行标准化。这将是正常的。

答案 1 :(得分:1)

你没有提供你使用的确切功能,但听起来像是:

z = a * sin(b * x) * sin(b * y)

我将完成整个过程,因此即使您的功能看起来略有不同,您也应该能够应用配方。此外,如果您的wave不是相对于xy平面,您仍然可以使用相同的计算,然后将必要的转换矩阵应用于生成的法线。

我们这里有一个参数曲面,其中平面点的3个坐标是从两个参数计算出来的。在这种情况下,参数为xy,描述每个点的向量为:

          [ 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|是你的法向量。