最簡理解梯度下降法,尋找高度場距離最近的一點(diǎn)(Unity)
起
????有一高度場z=H(x,y):
????

現(xiàn)在對(duì)于空間中任意一點(diǎn)target,想要知道高度場中距離target最近的點(diǎn)的距離(不必完全精確)。
直接解析求解太麻煩(或者不可求),使用固定步長Trace又太慢,需要一個(gè)折中的辦法。使用梯度下降法:

承
????設(shè)高度場上一點(diǎn)pnt(x,y,H(x,y)), 而target(m,n,o)。要使兩者距離最小。即求目標(biāo)函數(shù):
?
關(guān)于x,y的最小值,其梯度方向?yàn)?偏x,偏y):
這樣,從target點(diǎn)開始,求得梯度后,往負(fù)梯度方向慢慢step,就能得到函數(shù)極小值(不保證全局最優(yōu)),也就是距離target最近的點(diǎn)。
轉(zhuǎn)
????我的高度場具體解析式是一個(gè)經(jīng)典的帶方向Cos函數(shù)組成的Octave Noise,或者稱為FBM。由于FBM的組成是累加的,所以對(duì)H(x,y)求值和求導(dǎo)都很方便,不再贅述。
合
????Unity里可以很快很方便地驗(yàn)證正確性。盡管脫離不了梯度下降(GD)的一貫缺點(diǎn),不過大部分情況下可用。之后試一下GD得到的距離之后減去一個(gè)小值,用來SDFTrace它的可行性。
補(bǔ)圖:
(直接用高度場差進(jìn)行SDFTrace,對(duì)于過高,過復(fù)雜地形是不對(duì),不可接受的)

標(biāo)簽: