使用类似波形的顶点着色器计算球体中的法线

时间:2015-02-01 01:11:28

标签: math vector graphics normals

我一直试图为使用顶点着色器的球体获得正确的法线。算法可以简单地归结为

vert.xyz + = max(0,sin(时间+ 0.004 * vert.x))* 10 * normal.xyz

这会导致波浪滚过球体。 为了使我的法线正确,我也需要改变它们。我可以在给定的x,y,z处取切线向量,得到垂直向量(0,-vert.z,vert.y),然后与perp向量交叉切线。

虽然我在数学上遇到了一些问题,但此时它已成为个人的仇杀者。我已经解决了导数数百次,但我一直认为它不正确。我怎样才能得到切线? 分解上面的一行,我可以做一个数学函数

f(x,y,z)= max(0,sin(时间+ 0.004 * x))* 10 *范数(x,y,z)+(x,y,z)

其中Norm(..)是Normalize((x,y,z) - CenterOfSphere)

After applying f(x,y,z), unchanged normals

enter image description here

正确的f'(x,y,z)是什么?

我已经解释了由f(...)中的最大值引起的奇怪现象,所以这不是问题。

编辑:我现在最成功的算法如下:

切线矢量.x = 0.004 * 10 * cos(0.004 * vert.x +时间)* norm.x + 10 * sin(0.004 * vert.x +时间)+ 1

切线向量.y = 10 * sin(0.004 * vert.x +时间)+ 1

Tangent vector.z = 10 * sin(0.004 * vert.x + time)+ 1

2nd Tangent vector.x = 0

2nd Tangent vector.y = -norm.z

2nd Tangent vector.z = norm.y

将两者标准化,然后执行Cross(Tangent2,Tangent1)。再次标准化,并完成(它应该是Cross(Tangent1,Tangent2),但这似乎有更好的结果......在我的数学中有更多的问题提示!)。

这会产生this

enter image description here

1 个答案:

答案 0 :(得分:0)

如果表面点是非线性分布的,或者存在某些数学奇点,或者如果你犯了数学错误(99.99%就是这种情况),那么通过函数的推导得到正切/正规有时会失败。无论如何,你总是可以使用几何方法:

<强> 1。你可以通过

轻松获得切线
  • U(x,y,z)=f(x+d,y,z)-f(x,y,z);
  • V(x,y,z)=f(x,y+d,z)-f(x,y,z);
  • 其中d是一个足够小的步骤
  • f(x,y,z)是您当前的表面点计算
  • 不确定为什么使用3个输入变量我只会使用2
  • 但因此如果转移的点与未移位的
  • 相同
  • 使用此代替=f(x,y,z+d)-f(x,y,z);
  • 最后不要忘记将U,V尺寸标准化为单位矢量

<强> 2。下一步

  • 如果子弹1导致正常的法线
  • 然后你可以简单地解决U,V代数
  • U(x,y,z)=f(x+d,y,z)-f(x,y,z);重写为完整等式
  • f(x,y,z)代替表面点方程
  • 并简化

[注释]

  • 有时精心挑选的d可以将规范化简化为乘以常数
  • 你应该添加法线可视化,例如:
  • surface normals
  • 实际看到实际发生的事情(用于调试目的)