最简理解梯度下降法,寻找高度场距离最近的一点(Unity)
起
有一高度场z=H(x,y):

现在对于空间中任意一点target,想要知道高度场中距离target最近的点的距离(不必完全精确)。
直接解析求解太麻烦(或者不可求),使用固定步长Trace又太慢,需要一个折中的办法。使用梯度下降法:

承
设高度场上一点pnt(x,y,H(x,y)), 而target(m,n,o)。要使两者距离最小。即求目标函数:
关于x,y的最小值,其梯度方向为(偏x,偏y):
这样,从target点开始,求得梯度后,往负梯度方向慢慢step,就能得到函数极小值(不保证全局最优),也就是距离target最近的点。
转
我的高度场具体解析式是一个经典的带方向Cos函数组成的Octave Noise,或者称为FBM。由于FBM的组成是累加的,所以对H(x,y)求值和求导都很方便,不再赘述。
合
Unity里可以很快很方便地验证正确性。尽管脱离不了梯度下降(GD)的一贯缺点,不过大部分情况下可用。之后试一下GD得到的距离之后减去一个小值,用来SDFTrace它的可行性。
补图:
(直接用高度场差进行SDFTrace,对于过高,过复杂地形是不对,不可接受的)
