2009-09-19 157 views
14

我正在尋找一些算法,可以讓我生成逼真的二維地形圖。 通過寫實我的意思是,這個人會將這種地圖視爲「正常」地形圖,而不是人爲創建的。 我不想製作逼真的地圖。只是類似於可以在地理地圖集中查看的地圖。逼真的二維地形圖生成

到目前爲止,我使用perlin noise爲高度圖,然後我添加湖泊,河流,山脈,沼澤等。你可以看看它的外觀下面的圖片:

Terrain map http://www.freeimagehosting.net/uploads/1f1e9372bf.png

我不喜歡它。這是不現實的,但我不能自己找出更好的東西。時間不是問題,所以算法可能會計算量大。

謝謝你的時間。

編輯後:

我想我找到了一篇文章,可以是有益的:http://portal.acm.org/citation.cfm?id=1255047.1255077

但是它不能免費獲取,所以我仍然在尋找答案或創意。

+4

我找不到我想要的文章,但它基本上使用了一個基於位置的山丘系統來生成漂亮的島嶼。這可能與此處鏈接:http://pcg.wikidot.com/articles 但我cba經歷了他們所有。 – Pod 2009-09-20 16:58:19

+0

對於偉大的鏈接+1。感謝資源Pod。我確實發現他們真的很有幫助。 – Wodzu 2009-09-20 17:47:11

+0

你沒有說爲什麼它不現實,在這些效果圖,河流,邊界,形狀等方面限定了你不滿意的地方......我不喜歡綠色與藍色的比例,太多的綠色沒有形成對比,而且河流是湖泊......所以至少要增加更多的水或一些高度信息,如海灘,三角洲,山峯等,以及更多的海岸線。 – 2014-03-05 10:06:00

回答

2

在許多不同的時間尺度上,地形是由各種不同的原因造成的。爲了真正創造逼真的地形,你必須模擬這些。

在「短」的術語中,水圈決定了大部分特徵。您可以從包含主要特徵(山脈等)的體素/粒子/高度圖/網格地形開始,將其視爲不可變的,然後用過多的水模擬對其進行後處理。您需要計算河流和湖泊的位置,它們如何侵蝕基礎景觀以及它們形成沉積物的位置。如果我必須編碼,我可能會從3D體素世界開始。

這將是一個巨大的任務,我敢肯定有很多技巧可用於生成需要幾毫秒而不是幾分鐘的特定地形類型。你想創造什麼樣的地形?多山?低地?工業化?森林?沙漠?羣島?長話短說:如果你想要人類看起來比較現實的地形(畢竟,這些東西往往是專家),你必須通過模擬實際的地質過程來創建它。

5

我以前玩過地形世代。假設目標是一個位圖,我發現了一種方法來製作像河流一樣的東西,並且通常使它看起來更好:腐蝕。

一旦你有其他手段產生的地形侵蝕它一點:你需要世界表示爲像素的高度。在地圖上找一個點並將一個高度單位移動到最低的鄰居。移動光標到這個鄰居並重復,直到它不移動。重複其他像素。

使河流數你通過一個位置移動位的次數。最受打擊的景點是河流。

後續工作:我沒有侵蝕每個像素,只是大量的隨機像素,直到它足夠風化。實際侵蝕它們的原因是,這會導致比特數降低並填充空洞。如果沒有這樣的話,就不會有河流,因爲會有死水堵住水流 - 流動的像素會填滿任何小孔並形成工作水道。

對不起,我不能給任何樣品,這是很多年前,而舊的代碼可能在某處,我不知道在哪裏看。

+0

謝謝羅蘭。我不確定我是否正確理解你。我必須侵蝕地圖上的每個像素嗎?這在某種程度上可以與本地山頂上的例子相比,而不是以某個特定方向下降。 「下去」是指用較小或等高度搜索相鄰像素。並繼續,直到條件沒有違反。這就是我現在正在做的(但我不會降低高度),你可能會看到結果。如果我能看到你的生成器的一些截圖,那將是非常棒的。 – Wodzu 2009-09-20 19:29:15

+0

@Wodzu,我想羅倫的建議對你來說是正確的方向。不,你不必侵蝕每個像素;但你應該移動一些(取代它們,沉積物對於形狀也很重要)。請參閱http://markjstock.org/pages/builder.html圖片中的'erode'。 – Unreason 2010-06-25 09:45:47

1

我在Terra3D中的方法是生成隨機的高度值,然後進行3次平滑處理,將一些重新整形寫入算法。改造造成水線下的地形向下移動一點,水線以上的所有東西都會稍微向上移動。其效果雖然是很多山丘和小湖泊。這可能不是你正在尋找的東西。

但是,我不相信我的方法背後的原理不能用來得到你想要的。您可能只需在重塑/平滑算法中寫入更多條件。例如,在較高海拔處減少地形上的平滑量將會創造出更多的岩石山形外觀。然後編寫一個更多涉及的平滑(或高斯)算法,爲更低的海拔進一步伸展可以將這些湖泊拉到一起形成天然河流。

下面是地形代Terra3D如果你有興趣的代碼:

// GENERATE TERRAIN 
    for (i = 0; i < MAX; i++) 
    {  
    for (i2 = 0; i2 < MAX; i2++) 
    { 
     if (i<10 || i2<10 || i>MAX-10 || i2>MAX-10) 
     field[i][i2].y=0; 
     else 
     field[i][i2].y=(GLfloat(rand()%151)-75)/50+(field[i-1][i2-1].y+field[i-1][i2].y+field[i-1][i2+1].y+field[i-1][i2-2].y+field[i-1][i2+2].y)/5.05; 
    } 
    } 

    // SMOOTH/RESHAPE TERRAIN 
    for (int cnt = 0; cnt < 3; cnt++) 
    { 
    for (int t = 1; t < MAX-1; t++) 
    { 
     for (int t2 = 1; t2 < MAX-1; t2++) 
     { 
     field[t][t2].y = (field[t+1][t2].y+field[t][t2-1].y+field[t-1][t2].y+field[t][t2+1].y)/4; 

     if (cnt == 0) 
     { 
      if (field[t][t2].y < -1 && field[t][t2].y > -1-.5) field[t][t2].y -= .45, field[t][t2].y *= 2; 
      else if (field[t][t2].y > -1 && field[t][t2].y < -1+.5) field[t][t2].y += .5, field[t][t2].y /= 5; 
     } 
     } 
    } 
    } 

這是我10年前寫馬虎代碼。 Terra3D是一個漫長的學習過程,在黑暗中進行實驗和摸索,以產生我期待的效果類型。但也許它會有所幫助。

+1

哦,我的天啊,你的網站上的菜單很煩人! – 2010-02-03 20:30:30

+1

啊,是的,我18歲時創建了這個菜單。哈哈,把音量調低一點。 ;) – 2010-02-03 20:32:16

+0

感謝史蒂夫爲您的興趣和代碼。我仍在使用我的發電機!你的代碼適合3D飛行模擬器,因爲在這種類型的遊戲中,用戶通過擁有一些湖泊和山脈而感到滿意。他實際上並不太在意地形結構及其邏輯。但是,我試圖完成不同的事情。如果您打開地理相冊並查看地形,您會發現它是隨機的,但也符合一些規則。 F.E.一條河流從山上降落到一些湖泊或海洋,或者山脈被安排在一些集羣中。 – Wodzu 2010-02-04 09:36:48

1

我知道這是一個非常古老的問題,但我正在回答這個問題,爲將來的人尋找一個好的地形生成器,就像我一樣。使用World Machine 2的免費版本。它是一款地形生成器,可以完全滿足您的要求和更多。專業人員已經使用它來生成圖像,3D世界地形,甚至是像你所建議的那樣的地圖。請注意,免費版僅用於非商業用途。

+0

順便說一句,該網站是www.world-machine.com – 2011-02-17 19:35:29

+0

自由是非常有限的地圖大小和生成地圖只有一次(或多少次,你按「生成」按鈕),當你想在你的應用程序中隨機生成地圖時,這不是很令人滿意:) – 2011-02-17 19:46:42

+0

謝謝Felipe M.問題很老,但我仍然對任何幫助感興趣。我給你+1的答案,因爲你給了鏈接的地形發生器產生了一個非常漂亮的地形。但是,這個地形仍然沒有任何邏輯意義;)好吧,它可以產生你一座山和一點水。但它正在生成相同對象的「集羣」。湖泊,河流和其他山脈在哪裏?那些「物體」必須以自然的方式放置在地圖上,像大自然一樣會這樣做:)例如:河流從山上流向湖。 – Wodzu 2011-02-21 11:21:15