【遊戲設計圖形學】在地圖上生成蜿蜒河流的兩種方法
在開發遊戲時,我們經常需要用到隨機生成的地形,而河流是其中不可或缺的一部分。本文章將探討如何在地圖上生成河流。
河流生成的自然原因
高山積雪,地下水,雨水是河流發源的主要原因,而由於雨水形成的小水流並不大,很容易在連續晴天后消失,並不穩定。而高山積雪和地下水,都可以看作是河流從某個固定的地方開始,到匯入湖泊或海洋結束,這正是我們需要研究的地方。
正如在自然中所見,河流從來都是蜿蜒曲折而非筆直的。
簡單的解釋就是河床兩側的土壤並不完全一樣,有的堅硬,有的柔軟,甚至會有動物在河床旁開鑿洞穴改變河床一側的土壤結構,如此下來,河流會蜿蜒曲折也就不足為奇了。
在頂點上沿邊生成河流
這是河流生成的一種方法,如下圖,藍色的地塊表示海洋,綠色的地塊表示陸地,顏色越淺,地勢越高,而白色地塊表示山頂。
在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/
相關文章
- 【遊戲設計圖形學】模擬自然界火焰的方法遊戲設計
- 遊戲UX設計:地圖設計的考量遊戲UX地圖
- MOBA類遊戲地圖中的反饋設計遊戲地圖
- 3D遊戲程式設計與設計4——遊戲物件與圖形基礎3D遊戲程式設計物件
- 【java學習】GUI 圖形程式設計JavaGUI程式設計
- RPG遊戲的地圖和場景是如何設計出來的?遊戲地圖
- 遊戲原畫教程:角色設計中的幾個基本圖形的用法遊戲
- 從《黑暗之魂1》的地圖設計一覽魂系遊戲的創造之美(上)地圖遊戲
- 攻防大戰場地圖規劃與設計 | 射擊遊戲·設計篇地圖遊戲
- uniapp 高德地圖 sha 生成方法APP地圖
- 產品設計中的地圖學思維地圖
- Android中圖片圓形設定三種方法介紹Android
- Linux 上截圖的三種方法Linux
- 一個碼農是如何用遊戲推動計算機圖形學的?遊戲計算機
- 遊戲圖示的設計跟其它應用的圖示設計有何不同?遊戲
- 《黑暗之魂3》地圖設計:妥當的收尾也不失為一種成功(上)地圖
- ubuntu下圖形程式自啟動的幾種方法Ubuntu
- 圖形設計與遊戲用途的電腦CPU和顯示卡選擇攻略遊戲
- MOBA遊戲地圖的著作權保護(一)——一款MOBA遊戲究竟有幾個地圖?遊戲地圖
- 遊戲地圖發展簡史遊戲地圖
- 百度地圖開發-在地圖上檢索資料 08地圖
- ArcGIS API for JavaScript根據兩個點座標在地圖上畫線APIJavaScript地圖
- 遊戲設計文件→圖檔,建築工程圖學“真香”策劃表達需求遊戲設計
- 遊戲設計方法論——非玄學的遊戲設計知識譜系遊戲設計
- 計算機圖形學 第四章 圖形變換計算機
- 學廢了系列 - WebGIS vs WebGL圖形程式設計Web程式設計
- 幾何圖形在logo設計中的有哪些情感意義?Go
- WPF基礎:在Canvas上繪製圖形Canvas
- 《統計學習方法》思維導圖-上
- 向量圖形設計Illustrator 2022(AI)AI
- 自定義上傳圖片拼圖遊戲遊戲
- 計算地圖中兩點之間的距離地圖
- Flutter 生成圖形驗證碼Flutter
- 譯介丨MDA:遊戲設計和遊戲研究的一種正式方法遊戲設計
- 遊戲地圖背景移動C++遊戲地圖C++
- 高德地圖app怎麼使用北斗地圖? 高德地圖設定北斗地圖的教程地圖APP
- 遊戲大地圖開發指南:遊戲外部空間設計遊戲地圖
- MDA:一種用於遊戲設計和研究的方法遊戲設計