Voronoi 圖,舍棄馬爾科夫后的第二個選擇
????為什么我們要舍棄馬爾科夫?基礎(chǔ)的存在值得歌頌,但付出的高額代價由誰支付呢?當(dāng)國王的書記官無力根據(jù)僅有的信息去創(chuàng)造完美的地形特征與概率分布時,是時候介入圖形學(xué)的范疇了。 ??????一旦邁入基于圖形學(xué)的地圖生成,全新的區(qū)塊范圍特征逐漸出現(xiàn),沃洛諾伊圖便浮出水面,表明我們確實應(yīng)該試試去使用它。事實上,很多地圖都在使用各種沃洛諾伊圖,游戲制造行業(yè)在這一描述上所下的功夫相當(dāng)充足,大量的游戲(尤其是沙盒)在廣泛使用。雖然其并不能像柏林噪聲等算法來進行細節(jié)上的刻畫,但是其在大塊特征描述上,特別是描述我們正在解決的生物群落上,有著非常出色的表現(xiàn)。 ??????當(dāng)我們使用它時,將地圖進行網(wǎng)格化,然后按照鄰接的規(guī)律和地形的分布進行染色,很快就能看到一片模糊的鳥瞰圖。近視眼的人摘下眼鏡觀察更佳。這時,這些分好區(qū)域的地形特征就能很好地指導(dǎo)我們具體應(yīng)該如何去具體生成這些地形。 ??????同時,使用較多并不代表有異常成熟的方法幫助我們來使用這一工具。它僅僅作為數(shù)學(xué)工具的一種,具體的使用時更容易受到很多細節(jié)的影響。在算法上,隨機點的生成采用泊松過程來控制多邊形邊數(shù)趨近于6,勞埃德松弛等方法使區(qū)塊更加均勻平滑。在實踐上,小而凸的多變形更加強調(diào)塊和塊之間的銜接,特殊的形狀要求如何通過扭曲核心點的位置來產(chǎn)生影響。這些都是和最終的地圖成品效果掛鉤的選擇。 ??????當(dāng)我們將效果表現(xiàn)出來時,就不得不考慮優(yōu)化的問題。相信我,過于龐大的數(shù)據(jù)集不是你想要的。比如我所使用無優(yōu)化的德勞內(nèi)三角剖分在將兩萬個點連成三角形需要花費十分鐘的時間,這顯然不是我們想要的效果。一個可能的方案是既然我們采用了翻轉(zhuǎn)的算法,我們完全可以將龐大的地圖分成較小的大塊,各個大塊間獨立進行生成,然后進行鏈接。因為一個比較直觀的現(xiàn)象允許我們這么做,因為隨著遠離邊,三角形的最小角會急速增大。這需要我們付出一些小的額外開銷,但絕對是很值得的。 ??????那么我們應(yīng)該如何染色呢?事實上這很簡單,我們根據(jù)事物出現(xiàn)的特征對其進行描述,就能知道如何去染色。其一是我們存在這大范圍的描述,比如海陸分布奠定了最基礎(chǔ)的一個分塊。做好第一步,就可以去標明下一層的描述,某些帶有特征的地區(qū)就可以以此完成對應(yīng)的染色。比如某個充斥著神秘色彩的南極,某個開闊的非洲平原,某個龐大的山系,某片深海。賦予其生物群落的特征,然后賦予他們一個喜聞樂見的名字。比如說喜馬拉雅,比如科迪勒拉。 ??????這個時候,整個世界得到了一份具體的分割。分析這些分布,因為這些特征僅僅提供了關(guān)于地形的特征,我們需要在大致的地形確定后再對其進行其他特征的補充,比如溫度等情況。海洋等可能由洋流產(chǎn)生溫度交換,使其不那么像我們對維度上一貫水溫的認知。陸地往往又會很容易受季風(fēng)的影響,這也讓我們無法在地形生成時就敲定溫度等特征。將現(xiàn)象抽象,其描述了存在一些影響是非獨立的,甚至是塊間強關(guān)聯(lián)的。這代表我們需要一些脫離于地圖地形的復(fù)雜特征系統(tǒng),像季風(fēng)和洋流一樣。 ??????當(dāng)然,我們并不需要將其表現(xiàn)的很完美,因為我們并沒有做一個現(xiàn)實世界,我們甚至在一個魔法世界中耕耘。換言之,繼續(xù)抽象,將影響的模式抽象出來一些簡略版本,給予它們一些魔幻的名字,比如什么生命潮汐,亡靈涌動等。當(dāng)我們在地形上存儲的特征經(jīng)受住這些影響,就可以結(jié)束這一層的生成了。 ??????從這一層開始,往下所有的層數(shù)和細節(jié)都開始具備實際價值。海陸范圍太過于龐大和粗糙以致于我們對其的使用往往是多余的,而且其生命周期僅僅存在于生成時,因為新的地形特征暗含了海陸分布,且其是完全和地圖網(wǎng)格剖分相互綁定。地圖上活動的官員們第一眼看到地圖的時候,他們可以清晰地看到這一個地形塊是山脈還是平原,這一個地形塊屬于喜馬拉雅還是科迪勒拉,這一個地形塊是否在經(jīng)受著亡靈涌動的影響等。 ??????可能這里省略了一些細節(jié)的方法,比如喜馬拉雅山脈究竟要穿過哪些地形塊,比如季風(fēng)的影響到底要穿過哪些地形塊。我們需要提供一些數(shù)學(xué)模型來表明這些信息如何被敲定。一些概率手段可以幫助我們決策,而最后的數(shù)值指定一個較為貼合預(yù)期效果的函數(shù)。 ??????而有分割好的地形塊并不代表接下來的工作會是很好進行的。事實上,塊是凸的,塊的邊數(shù)是趨近于六的,這都決定了我們的地形是很難獨立的,甚至是強相關(guān)的。而地圖是很龐大的,這可能導(dǎo)致一個橫跨大陸的山脈可能覆蓋了數(shù)以千計的地形塊,一條顯而易見的山脊也可能跨越了幾十個地形塊。這可能有點不太合理,這有點讓地圖過于龐大,或許我們應(yīng)該將規(guī)模稍微下降一些。(至少當(dāng)我們使用分而治之的算法幫助我們減少了不少急速膨脹的信息量處理) ??????而有了足夠的細節(jié)信息,我們就可以在地形塊上創(chuàng)造新的指導(dǎo)生成信息,這些信息可能是一些包含特征的點線結(jié)合,也可能描繪了一小片特征,或者是一份新的三角分割。 ??????比如一個較小型的山脈,通過給出山頂和山脊線和山谷線,就可以很好地提供所需要的信息,而大型一點的山脈,就需要提供一些描述鞍部的形狀。而考慮水的情況就需要提供可能的溪流,瀑布還有泉水,顯然,這些可以用點和連線就能解決,而一小塊湖泊就需要我們提供一個塊。 ??????有了足夠的指導(dǎo)信息,就可以幫助我們來生成更細節(jié)的地形。我們可以選擇繼續(xù)分塊,完善地圖信息。也可以直接使用這些信息來進行生成,指導(dǎo)信息的完善已經(jīng)可以幫助我們確定所有的地形信息,比如使用經(jīng)典的柏林噪聲就可以利用這些信息來確定一個實際的塊應(yīng)該被填入空氣還是一個方塊。 ??????當(dāng)我們完成針對地形和生物群落的確定,就需要補充實際地形的情況。讓沙和泥土落于巖石之上,讓不同的石頭混雜,讓礦脈在地形中生長。一些新的空洞在地形中產(chǎn)生,一些參差不齊的石頭開始交錯。一些事件的源頭開始擴散影響。顯而易見地,大量的處理需求來源于地下,不受表層地形影響的地方更需要提供充足的信息。 ??????創(chuàng)建一些穿透地形的地標,這些地標需要提供一個深度信息來標明它的3D位置。但反過來想,我們在最初為表層地形描述的時候也提供了高度信息,這在本質(zhì)上是有一些相似處的。不同的是在更深層的地方不再是像表面這樣如何創(chuàng)建都只有一個面,在深處更有可能形成3D的網(wǎng)格。 ??????出于多方面考慮,3D并不能作為一個很好的選擇,可能的情況將通過結(jié)合平面地圖和豎直地圖的方式來制造一個偽3D的情況。最后的時候,我們將得到一沓泰拉瑞亞式的地圖,玩家就可以在這些地圖間相互穿梭。