詳細介紹在遊戲製作中的分形演算法(轉)

post0發表於2007-08-12
詳細介紹在遊戲製作中的分形演算法(轉)[@more@]

  所謂分形,在數學上是指具有如下性質的一類圖形:

  1.具有無限的細節。具有無限的細節的意思是指這個圖形無論如何放大,都無法存在一個平坦的表面。這個定義有些抽象。舉個例子就知道了。比如說吧,一塊石頭。無論怎麼放大,表面都是粗糙不平的。

  2.自相似。自相似是指一個圖形無論怎樣放大,看起來都於原圖形相似。舉個例子來說,人體的微小血管和大血管看起來沒什麼兩樣。

  

  具有如上性質的圖形就被稱做分形。通常分形都是極度對稱的,對稱到了完美的地步。非常的美觀(具體請參見《計算機圖形學 第二版》後面的彩色附圖,電子工業出版社出版)。但生成這種圖形卻不需要非常複雜的程式。因為它們具有無限的細節表面,就可以使用遞迴演算法來實現。下面我就來簡單介紹一些分形的演算法。

  

  首先我們來考察二維的情況。

  

  二維分形的建立一般是透過一維變換得到的。通常用的演算法是一維線段中點隨機平移演算法。考慮以下演算法:

  

  首先建立一條線段,設端點為A,B。則首先找到它的中點C,並線上段上隨機移動一點距離。這樣就得到了兩條線段AB,AC。重複以上步驟,一直到足夠多的次數,那麼就可以得到比較滿意的二維分形了。其虛擬碼如下:

  

  do {

  遍歷線段陣列,並找到線段中點;

  沿線段隨機移動一點距離;

  }while(足夠多的次數);

  

  接著我們考察三維的情況。

  想法跟二維情況相似,三維的分形一般透過二維平面變換得到。我們考慮以下演算法:

  

  演算法一:隨機生成地形演算法。首先我們考慮一個空的2維陣列。在各個結點處隨機生成一個值,然後渲染。這樣生成地形速度快,但是有個缺點,就是地形太離散。這種演算法的應用較侷限,但是生成海面我想是不錯的。虛擬碼如下:

  

  do{

  遍歷陣列,生成隨機值;

  }

  

  演算法二:將上面的演算法擴充套件。我們還是考慮一個空的2維陣列。但是隻在某些點隨機生成值,然後以這些點為原點向周圍遞減。這種演算法就已經較上面的不錯了,而且比上面演算法生成的圖形要平滑了許多。其虛擬碼如下:

  

  do

  {

  遍歷陣列,在隨機點生成隨機數值;

  }

  then

  {

  以這些點為原點向周圍遞減;

  }

  

  以上演算法是我在研究分形的過程中研究出的簡單的分形演算法,同時我還研究出了幾個演算法,但是忽然想不起來了,只好以後再說明。需要說明得是,以上兩個演算法適用的範圍比較侷限,所以接下來我介紹一種比較有名的演算法:Diamond+Square演算法,演算法描述如下:

  

  首先我們考慮一個空的2維陣列,這個陣列必須是方的,也就是2的N次+1乘以2的N次方。然後取四角組成的正方形,並隨機生成一個數值,然後使這個正方形中心的數值等於四角數值的和的平方根加上剛才生成的隨機數,這樣我們就得到了4個正方形了,然後重複以上步驟,即取四角並生成隨機數,然後將正方形中心付值,這樣經過A次以後,我們就有2的2N個正方形了,非常的滿足 :)

  

  接著我們考慮著色的問題,就以上演算法而言,除了生成地形非常好之外,還能生成雲紋理。很簡單。由於陣列值已經確定了,我們就可以將數值最大處著不透明的白色,最小處著蘭色。依次平滑過度,而半透明效果將由RGBA的ALPHA分量決定。

  

  接下來我想討論一下有關分形的平滑過度問題。

  

  通常的做法有兩種:自平方和乘以一個叫做平滑係數的數字。我們先看自平方。所謂自平方,就是將某點或該點周圍的數值經過平方或開方後付值給該點。這樣做是由於2次曲線所具有的一些性質決定的。而開方函式也具有這樣的優良性質。而使用平滑係數(一般叫做H數),則能使數值教較平滑過度。一般來講,0  

  這就是現在我所要說的一些東西。假若以後想起了什麼的話,我再做補充

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-952056/,如需轉載,請註明出處,否則將追究法律責任。

相關文章