参考:https://catlikecoding.com/unity/tutorials/rendering/part-6/
只对参考https://catlikecoding.com/unity/tutorials/rendering/part-6/求法线部分说明。
对于高度图,它存储的是高度数据。我们的目的是求顶点的法线,也就是空间曲面上任意点的法线。
对于一般的平面如果已知平面方程可以分别对x,y,z求偏导直接求出法线:
但如果不知道曲面方程,只知道曲面上的某条曲线方程,能不能求曲面上某点法线呢?
这个不知道,从上面的参考文章来看,似乎就是分别求出曲线沿两个轴的切线,然后通过切线向量积求出的。
具体的说明参考中的做法:假设坐标系三个轴分别为u, h, v. 以u,v,h为轴的空间下有一个曲面,我们不知道空间的曲面方程,但是知道曲面上某条曲线的方程,假设曲线方程为u = u, v=v, h=f(u,v)。我们分别求曲线方程对u, 对v的偏导,求出曲线沿着u,v方向的切线Tu,Tv,然后求Tu,Tv的叉积,所得就是曲线的法线,也就是曲面的法线。
这里的问题是,曲面上某条曲线的法线是否能代表曲面的法线是个问题,可能的说法是:https://wenku.baidu.com/view/0152ad4af56527d3240c844769eae009581ba2af.html?from=search
先不管这些,看看怎么求曲线切线方程吧。
曲线方程分为参数方程形式,也就是:
注意情形2,其实就是x=x , y = y(x), z=z(x)。
还有另外一种,看成两个平面相交的情况。
求解曲线上某点法线方式:
求曲线的切线方程看完了,看下通过高度图求法线吧。
已知高度图的u,v,假设高度h=f(u,v),那么我们就构建了一个曲线的参数方程u=u, h=f(u,v), v=v,我们就通过这条曲线的两条切线求法线。但是问题是,这里的高度h与u,v的映射关系其实是不知道的。像下面这张图,能知道那条波浪形的曲线方程吗,并且我们通过高度图采样拿到的高度数据是离散的,那么直接使用导数的定义来做就好,这个就不需要说明了,国内的谁不知道导数定义啊(文章中为了避免太陡,把除以delta去了)。这里再强调一下那个曲线方程,记住这个曲线方程是参数方程,不是一般的看成两个平面相交的那个。
参数方程为u=u, h = f(u,v), v=v,那么对u求偏导就是(1,f'u, 0)——切线Tu,对v求偏导就是(0,f'v, 1)——切线Tv。这里最后是Tv叉乘Tu,不知道为什么不是Tu叉乘Tv,用的是左手坐标系——》左手定则吗??(最后一张图AXB是向上的?)