游戏中的实时水体模拟技术分享:波形叠加法与波动方程
海洋,溪流,湖泊等水體的模擬在游戲中是十分常見的技術,每個開發人員或多或少都聽說過幾種制作水體的方法。不過想要把水體模擬做好,做出高質量,其中還是有很多值得注意的地方。這篇文章就是總結一下個人制作水體模擬的心得,以及一些平時閱讀技術論文和開發中容易忽略的細節。
首先要說一下,游戲中使用的“水體模擬”技術并不是真正的流體動力學計算,出于運行效率的考量,實際上使用技術的大多是用數學公式復現水體的視覺效果。從這點來說下面提到的公式基本都很簡單,而且也不是金科玉律,可以根據每個人的理解進行改寫。
游戲中使用的水體模擬技術大體可以分為三類
第一類是疊加不同的隨機周期函數構成水體表面,多用來表現波濤起伏海面,暫且稱為波形疊加法。
?
第二類是使用波動方程或者近似公式來表現局部的水波,多用于表現物體與水面互動產生的漣漪。
?
第三類是使用預渲染的Flow Map表現復雜的水流運動,多用于模擬渦流等難于實時計算的非線性運動。
?
第一部分 波形疊加
Gerstner波
波形疊加故名思義就是將很多個不同周期,不同振幅的周期函數疊加在一起。但在水體模擬中我們使用的基礎波形并不是正弦和余弦波,而是一種叫做Gerstner波的特殊波形。Gerstner波和余弦波的差別,用一幅簡單的圖就能說明了。
?
與紅色的余弦波相比Gerstner波在兩側有收緊的趨勢,和真實海洋表面更加接近。
?
Gerstner波構造起來非常容易,用2d的波形作說明,只要在y軸上取cos(t),再在x軸上添加一個相對應的sin(2t)位移就能得到。Gerstner波的"收緊"部分就是綠色箭頭所指的sin(2t)。
?
Gerstner波還有一種很多人不知道的變換,就是斜切波形。大家一定知道cos(x)如果把x換成x^i,波形會向一個方向傾斜。圖中的波形是cos(2*pi*x^2),可以看出波形明顯向右邊“傾斜”。
?
如果Gerstner的x和y坐標都加上這種傾斜,就能得到斜切Gerstner波,用來模擬涌向海岸邊的潮水。
將很多個不同波長,不同振幅的Gerstner波疊加在一起,QQ靚號賣號平臺加上一些隨機值,就能得到下圖這種看起來很復雜的海面效果。
如果需要更為復雜的波形疊加,可以使用逆向fft算法。因為fft的效率還不錯,一幅512x512的頻譜圖對應262144個波形,同時疊加這么多波形,能給海面帶來非常高的復雜度。
?
計算白浪
這里再補充一個一般人不太知道的技術。用雅可比絕對值計算白浪出現的位置。
白浪是水面激烈碰撞涌起的白色泡沫。在水面模擬的時候可以認為在Gerstner波最尖銳的部分會產生白浪。這個尖銳的部分可以用雅可比絕對值來計算。
?
可以設定一個閥值,當雅可比絕對值小余閥值的時候產生白浪。
?
第二部分 波動方程
我想學理科的同學一定對波動方程不會陌生的。估計寫的第一個matlab程序十之八九都是波動方程。實在不知道請查查wiki百科。這里不寫一堆推倒公式了,免得大家看得頭痛。
這里講一個波動方程的變形wave particles。
這是07年的一片siggraph論文,雖然老了點,但效果很好。神秘海域4的水面模擬就是用的這個技術。
Wave Particles
wave particles的想法其實很直接。作者認為波動方程太簡單了,波動方程的波之間不會相互影響 ,只會在碰到邊界的時候反彈一下。那干脆別算波動方程了,把波都看成一個粒子,遇到邊界會反彈,在移動的時候能量會衰減。再按照Gerstner波的樣子變形出來,就是一個小鼓包。
?
如果你要制造一個扇面形狀的波,發射一扇小鼓包。如果想制造一圈的波紋,就發射一圈小鼓包,隨便你。
?
但是隨著小鼓包的移動,他們本來是團結在一起的,卻漸漸散開了。這也好辦,小鼓包可以隨著移動而增殖,如果跑的距離太遠了,就一個變三個。
?
到這里就可以看出wave particles的最大優點是直觀易懂,容易控制,想要生成什么樣的波紋都可以控制。這也是神秘海域4開發時使用這個技術的主要原因。
不過wave particles對于開發人員來說還是挺有難度的,尤其是作者在論文中很多細節地方都沒寫清楚,我在做的時候遇到了不少麻煩。這里就隨便提兩點吧。
第一是上面提到的斜切波形的問題,論文中能實現出漂亮的浪頭形狀。但文章中只用了普通的Gerstner波。基本不可能做出來這種效果。
?
另一個問題是怎么把粒子渲染成位移圖,文章中根本就沒提。只提到以每個粒子為中心,渲染出一個Gerstner波形狀。難道要每個粒子都向位移圖渲染一個圓的范圍嗎,這個大的計算量怎么可能做到實時啊。
?
實際的做法是先渲染出粒子的位置,然后分別在x方向和y方向做一次模糊filter,filter的核就是Gerstner波的公式,這樣比起雙向filter的消耗還要小,真是個值得記住的小技巧。
當然wave particles比起波動方程還是有局限性的,比如像From Dust那種上帝游戲,會增加和減少水量,還是用波動方程計算水的流動比較容易。
?
第三類用Flow Map模擬水體比較偏美術,所以變種非常多,不太好講。等以后有機會再說吧。(逃)
總結
以上是生活随笔為你收集整理的游戏中的实时水体模拟技术分享:波形叠加法与波动方程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏编程技巧分析:策划变心太快?也许可以
- 下一篇: 游戏编程新手教程:怪物AI设计简述