欢迎光临散文网 会员登陆 & 注册

最简理解梯度下降法,寻找高度场距离最近的一点(Unity)

2022-05-11 19:26 作者:DeadCyber  | 我要投稿


    有一高度场z=H(x,y):

    

现在对于空间中任意一点target,想要知道高度场中距离target最近的点的距离(不必完全精确)。

直接解析求解太麻烦(或者不可求),使用固定步长Trace又太慢,需要一个折中的办法。使用梯度下降法:

    设高度场上一点pnt(x,y,H(x,y)), 而target(m,n,o)。要使两者距离最小。即求目标函数:

(x-m)%5E2%2B(y-n)%5E2%2B(H(x%2Cy)-o)%5E2 

关于x,y的最小值,其梯度方向为(偏x,偏y):

gradX%20%3D%202(x-m)%2B2*(H(x%2Cy)-o)*H_%7Bx%7D%20(x%2Cy)

gradY%20%3D%202(y-n)%2B2*(H(x%2Cy)-o)*H_%7By%7D%20(x%2Cy)

这样,从target点开始,求得梯度后,往负梯度方向慢慢step,就能得到函数极小值(不保证全局最优),也就是距离target最近的点。

    我的高度场具体解析式是一个经典的带方向Cos函数组成的Octave Noise,或者称为FBM。由于FBM的组成是累加的,所以对H(x,y)求值和求导都很方便,不再赘述。

    Unity里可以很快很方便地验证正确性。尽管脱离不了梯度下降(GD)的一贯缺点,不过大部分情况下可用。之后试一下GD得到的距离之后减去一个小值,用来SDFTrace它的可行性。

补图:

(直接用高度场差进行SDFTrace,对于过高,过复杂地形是不对,不可接受的)


最简理解梯度下降法,寻找高度场距离最近的一点(Unity)的评论 (共 条)

分享到微博请遵守国家法律