【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

遊資網發表於2020-02-21
引言

在開發遊戲時,我們經常需要用到隨機生成的地形,而河流是其中不可或缺的一部分。本文章將探討如何在地圖上生成河流。

河流生成的自然原因

高山積雪,地下水,雨水是河流發源的主要原因,而由於雨水形成的小水流並不大,很容易在連續晴天后消失,並不穩定。而高山積雪和地下水,都可以看作是河流從某個固定的地方開始,到匯入湖泊或海洋結束,這正是我們需要研究的地方。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

正如在自然中所見,河流從來都是蜿蜒曲折而非筆直的。

簡單的解釋就是河床兩側的土壤並不完全一樣,有的堅硬,有的柔軟,甚至會有動物在河床旁開鑿洞穴改變河床一側的土壤結構,如此下來,河流會蜿蜒曲折也就不足為奇了。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法
在頂點上沿邊生成河流

這是河流生成的一種方法,如下圖,藍色的地塊表示海洋,綠色的地塊表示陸地,顏色越淺,地勢越高,而白色地塊表示山頂。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

RebBlobGames 的一篇文章中寫道:在確定每個地塊和地塊頂點的高度後,我在山頂地塊的邊緣隨機找出一個頂點作為河流的發源地,從這個頂點開始,隨機選擇與自己臨近而地勢比自己低的一個頂點作為下一個河流所在頂點,而兩個頂點所在邊就是河流的一部分。如此往復,直到匯入湖泊或者海洋。

值得注意的是,這樣的多邊形地塊並不是隨機生成的,否則河流很有可能仍然近似筆直。

RLGUY 在他的github 文章裡面給出了說明:

首先使用泊松盤分佈取樣生成一些點,這些點的距離不會太近,如下圖右,作為對比,下圖左是真正隨機生成的一些點。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

然後使用 Delaunay 三角剖分連線這些點

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

最後再生成 Voronoi 地圖,如下圖右,這樣的地塊更加漂亮。而左邊是利用隨機生成的點。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

具體演算法很容易搜尋到,這裡不再贅述。


在地塊上生成河流


【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

另一種方法則是直接在地塊上生成河流。

基本方法與之前一種也是一樣的,河流會從地勢高的地塊流向地勢低的地塊。但問題是,我們計算地塊地勢高低的資料,一般都是根據地塊的某一固定點來計算的,例如正六邊形地塊的中心點,如上圖,或者 Delaunay 三角形的外接圓中心點,如下圖:

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

很多點同時在一條直線上的情況經常發生,Martin O'Leary 在他的文章中也說到了這個情況。

而解決辦法,就是我們可以將河流分成幾段,每一段固定起點和終點,保證起點比終點高,而讓中間的那些點自由選擇流向,而忽略地勢高低,這樣會生成漂亮的效果。

另一種方法則是一篇論文裡提出的利用三角形地塊生成河流的方法裡提出,利用三角形分形地塊生成河流的方法。

步驟如下:先生成一個大三角,確定河流的大致流向,例如下圖左,虛邊代表河流流進,粗邊代表河流流出,細邊代表普通邊。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

然後將大三角形分形,分成四個小三角形,那麼此時原來的進入邊變成一條進入邊和一條普通邊,流出邊也是如此,這時候河流就有四種可能的具體流向,見上圖右。這時再隨機選擇一種,繼續迭代下去。

下圖是一種效果。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

其他方法
板塊漂移運動

這篇文章利用隨機生成的板塊及板塊的運動方向來確定哪裡會出現河流湖泊,哪裡會出現高山。紅色表示板塊擠壓,容易形成高山,藍色表示板塊相離,容易形成河流。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

隨機分形

Mandelbrot 在他的分形著作《大自然中的分形幾何學》也介紹過利用樹狀結構生成河流的一種方法。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

生成河流需要保證河流不會與自己相交。利用樹形結構是一種很好的方法,如下圖,事先確定好河流可能流經地的樹狀結構,讓河流只能從上面一層到下面一層隨機一個節點上。

【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法

而之前提到的利用地勢高低,或者將大三角形分形成小三角形也都用到了類似方法。

參考

http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/
rlguy/FantasyMapGenerator
http://algorithmicbotany.org/papers/mountains.gi93.pdf
http://eveliosdev.blogspot.com/2016/06/plate-tectonics.html
http://mewo2.com/notes/terrain


作者:clatterrr  
來源:INDIENOVA
地址:https://indienova.com/indie-game-development/river-generation-on-map/


相關文章