参考: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的叉积,所得就是曲线的法线,也就是曲面的法线。

这里的问题是,曲面上某条曲线的法线是否能代表曲面的法线是个问题,我不清楚对不对,也没找到数学证明。

先不管这些,看看怎么求曲线切线方程吧。

曲线方程分为参数方程形式,也就是:

 

通过高度图求法线

注意情形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是向上的?)

通过高度图求法线

 通过高度图求法线

相关文章:

  • 2021-06-29
  • 2021-12-21
  • 2021-08-07
  • 2021-12-02
  • 2022-12-23
  • 2022-12-23
  • 2021-06-27
猜你喜欢
  • 2021-05-27
  • 2021-05-16
  • 2021-07-28
  • 2021-09-18
  • 2021-11-10
  • 2022-01-09
  • 2021-04-15
相关资源
相似解决方案