我一直试图为使用顶点着色器的球体获得正确的法线。算法可以简单地归结为
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
正确的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
答案 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)
是您当前的表面点计算=f(x,y,z+d)-f(x,y,z);
U,V
尺寸标准化为单位矢量<强> 2。下一步
U(x,y,z)=f(x+d,y,z)-f(x,y,z);
重写为完整等式f(x,y,z)
代替表面点方程[注释]
d
可以将规范化简化为乘以常数