首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用曲线重新计算法线(正弦波)

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

Stack Overflow用户
提问于 2014-06-11 22:30:52
回答 2查看 2K关注 0票数 0

我正在尝试做一个水的几何着色器,使用一个正弦波。

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

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

我知道我应该使用正弦函数并从中得到3D法线,但我感到困惑。

EN

回答 2

Stack Overflow用户

发布于 2014-06-12 11:28:47

代码语言:javascript
复制
z = a * sin(b * x) * sin(b * y)

我将逐步介绍这个过程,所以即使您的函数看起来略有不同,您也应该能够应用该配方。此外,如果您的波不是相对于xy平面的,您仍然可以使用相同的计算,然后将必要的变换矩阵应用于生成的法线。

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

代码语言:javascript
复制
          [ x                           ]
v(x, y) = [ y                           ]
          [ a * sin(b * x) * sin(b * y) ]

计算所需的数学工具是基本分析(导数)和一些矢量几何(叉积)。

作为第一步,我们计算这两个参数的梯度向量。这些梯度矢量由每个矢量分量与相应参数的偏导数组成。在该示例中,结果为:

代码语言:javascript
复制
              [ 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) ]

代码语言:javascript
复制
     [ - a * b * cos(b * x) * sin(b * y) ]
vn = [ - a * b * sin(b * x) * cos(b * y) ]
     [ 1                                 ]

然后对这个向量进行归一化,vn / |vn|就是你的法向量。

票数 2
EN

Stack Overflow用户

发布于 2014-06-11 23:04:27

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24165608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档