2010-06-28 46 views
13

我在隨機寫一個隨機地圖生成器,而且我不太確定如何隨機生成逼真的風景。我正在與地方規模的地圖these sorts,它提出了一些有趣的問題。什麼是生成隨機羣集和路徑的好方法?

其中一個最簡單的情況是forest

    Sparse Medium Dense 
Typical trees  50%  70%  80% 
Massive trees  —  10%  20% 
Light undergrowth 50%  70%  50% 
Heavy undergrowth —  20%  50% 

樹木和灌木叢可以在相同的空間中存在的,所以平均的稀疏森林具有25%的典型樹和光矮樹叢,25%的典型樹,25 %輕灌木林地和25%的開放空間。中等密度的森林將需要更多的思考,但這並不是我的問題所在,因爲它都是均勻分散的。

我的問題在於生成集羣和路徑,同時保持百分比限制。 Marshes是一個很好的例子:

    Moor Swamp 
Shallow bog   20% 40% 
Deep bog   5% 20% 
Light undergrowth 30% 20% 
Heavy undergrowth 10% 20% 

深沼澤正方形通常聚集在一起,並通過淺沼澤正方形的不規則環包圍。

一個額外的地圖元素,樹籬,也可能存在,以及開放地面的路徑,通過沼澤蛇行。這兩種地圖元素(集羣和路徑)都存在問題,因爲地圖的總體構成應該包含元素的X%,但它不是均勻分佈的。其他元素,如溪流,池塘和流沙,也需要集羣或路徑類型生成。

鑑於這些約束,我可以使用什麼技術來生成逼真的地圖?


我使用C#,FYI(但這不是一個C#特異性的問題。)

+0

這些基於網格的地圖?從你的描述或鏈接中我不清楚。 – academicRobot 2010-06-28 04:06:47

+0

是的,基於網格,可能不小於20x20(儘管可能更大,大約50x50ish?) – dlras2 2010-06-28 04:58:03

回答

21

現實「隨機」分配使用Perlin Noise經常做的,它可以是用於像你提到的那樣給「分塊」分配。它通過對來自隨機數據點的多個線性內插值進行求和/組合來工作。每一層(或「八度」)的數據點數是最後一個數據點的兩倍,並侷限於更窄的值範圍。結果是「逼真」,看起來隨機紋理。

下面是雨果埃利亞斯the theory behind Perlin Noise一個美麗的演示。

下面是我對Perlin Noise in C#發現的第一件事情。

你可以做的是生成Perlin雜點圖像並設置了「門檻」,其中任何一個以上的值是「上」,一切都在它下面是「關」。你最終會遇到的事情是高於閾值的東西,看起來不規則,真棒。只需將閾值以上的值分配給您想要的地形特徵的位置即可。

Here is a demonstration如果一個程序生成柏林噪聲位圖,然後調節所述截止閾值隨着時間的推移。清晰的「聚集」是可見的。這可能正是你想要的。

注意,具有高門檻,很少點上面,它的稀少。但隨着門檻的降低,這些點會「成長」成叢(由柏林噪音的性質決定),其中一些團塊將加入彼此,並基本上創造出非常自然和類似地形的東西。

請注意,您還可以通過設置Perlin噪聲函數的「湍流」來設置「叢塊因子」或要素聚集的趨勢,這會基本上導致PN函數的峯谷出現突出,走得更近。

現在,在哪裏設置閾值?閾值越高,最終地圖上的特徵百分比就越低。閾值越低,百分比越高。你可以和他們混在一起。你可以通過小數學計算得出確切的百分比(似乎數值的分佈遵循Normal Distribution;我可能是錯的)。調整它,直到它的恰到好處:)

編輯正如評論指出的那樣,你可以找到通過創建累積直方圖(是什麼%的地圖的下閾值指數)的具體比例,並選擇門檻這給你你需要的百分比。

這裏最酷的事情是,你可以創建圍繞某些其他功能(比如你的沼澤特徵)在這裏瑣碎的功能 - 只需使用相同的Perlin噪聲圖兩次 - 第二次,降低閾值。第一個會變得笨拙,第二個會在相同的區域聚集,但是會增大塊(參考之前發佈的Flash動畫)。

至於像hedgerows的其他功能,你可以嘗試建模簡單的random walk行有較高的傾向,比直接轉彎,並將它們隨機放置在基於perlin的地圖上。


樣品

下面是一個簡單的50x50瓷磚疏林地圖。灌木叢呈褐色,樹木呈藍色(對不起),以清楚哪棵是哪棵。

Sparse Forest http://img688.imageshack.us/img688/7005/forestmap.png

對於這個地圖我沒有確切的閾值,以匹配50%;我只將門檻設置爲最大值的50%。從統計上看,每次平均達到50%。但它可能不足以達到你的目的;請參閱前面有關如何執行此操作的說明。


這裏是你的沼澤功能(不包括叢林,爲清楚起見)在後面演示,淺沼澤在灰色和深沼:

Marshes http://img202.imageshack.us/img202/5092/marshdemo.png

這僅僅是50×50,所以這裏有一些人造物,但你可以看到,通過調整同一個Perlin地圖上的閾值,你可以輕鬆地使淺沼澤從深沼中「生長」。對於這一個,我把閾值水平看成是令人眼前一亮的結果,但爲了你自己的目的,你可以做前面提到的。

下面是來自同一個柏林噪聲地圖生成沼澤的地圖,但在250x250的瓷磚地圖,而不是伸出:

Marshes 250x250 http://img251.imageshack.us/img251/2867/marshdemo250.png

+0

閾值可以精確計算給定的perlin噪聲位圖。製作一個直方圖,從直方圖中可以計算出導致任何百分比(不考慮分佈)的截止點(保留的範圍);你甚至可以用幾種方法做到這一點。 – Unreason 2010-06-28 08:59:22

+0

不合理 - 謝謝;它看起來像我完全誤解了這個問題,認爲提問者想要**總特徵**的百分比而不是**覆蓋地圖的百分比**。我會更新我的答案=) – 2010-06-28 09:32:02

+0

我喜歡這些樣本!如果我理解正確 - 你爲森林生成了兩張柏林噪聲地圖(一個用於刷子,一個用於樹木),並覆蓋它們?那麼對於沼澤地,您生成了一張地圖,並使用了稍微不同的閾值?你是否使用[gutgames](http://www.gutgames.com/post/Perlin-Noise.aspx)的代碼?如果是這樣,你知道八度的目的是什麼嗎?我發現的其他Perlin噪音代碼中沒有一個有這樣的循環,我無法弄清楚。 – dlras2 2010-06-28 20:49:22

2

我從來沒有做過這樣的事情,但這裏有一些想法。

您可以通過將隨機選擇偏置到網格上接近該類型現有元素的位置來獲取集羣。爲所有方塊分配默認值1。對於具有現有聚類元素的方塊,將聚類值添加到相鄰的方塊(聚類值越高,聚類越強)。然後在所有方塊的概率分佈函數上對該類型的下一個元素進行隨機選擇。

對於路徑,除了可以逐步擴展路徑(在路徑末端旁邊的方塊的路徑概率是有限的,在其他地方爲零)之外,您可以使用類似的過程。方向路徑可以通過增加路徑方向上​​的選擇概率來完成。蜿蜒的路徑可以有一個隨機擴展過程中改變的方向(new_direction = mf * old_direction +(1-mf)* rand_direction,其中mf是介於0和1之間的動量因子)。

0

您可以開始閱讀鏈接here。我記得看着更好的文件。如果我找到它會發布它(它也是基於L系統的)。

但是這是一般的一面;你所面臨的特殊問題,我想你應該在

  • 百分比
  • 其他規則(集羣和路徑)方面,它模擬

的一點是,即使你不知道如何如果你能夠評估屬性(聚類率;路徑漂亮度)並對它們進行評分,那麼你就可以暴力破解或者做一些其他的橫向空間問題。

如果你仍然想要做的生成方法,那麼你必須檢查生成規則有點接近;這裏就是我會追求

  • 創造不同的地形,並已要求「clusterness」,「pathness」或均勻性
  • 以這樣的方式創建模式地形覆蓋模式的想法,深值沼澤不是謹慎的,而是分配概率值;之後的格局已經建立,你可以以這樣一種方式,它會產生蓋的規定比例
  • 搭配不同的圖案一起歸這個概率
0

您可能對某些類型區域的一些成功的一個Voronoi模式。我從來沒有見過它用於創建地圖,但我已經看到它用於許多類似的領域。

1

爲了擴大academicRobot的評論,您可以從一些網格單元格中的默認沼澤或森林種子開始,讓它們使用相關的隨機數從源生長。例如一個沼澤可能有八個相鄰的網格單元,其中每個網格單元都有90%的可能性也是沼澤,但有10%的可能性是其他的。你可以讓種子生態系統從種子中形成,並調整相關性,直到你看到正確的東西。即使在電子表格中也可能很容易實現。

相關問題