日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Perlin noise(一)

發布時間:2023/12/10 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Perlin noise(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Perlin noise(一)

一、分形噪聲

??分形幾何學的基本思想是:客觀事物具有自相似的層次結構,局部與整體在形態、功能、信息、時間、空間等方面具有統計意義上的相似性,稱為自相似性。客觀自然界中許多事物,具有自相似的“層次”結構,在理想情況下,甚至分形分形至具有無窮層次。適當的放大或縮小事物的幾何尺寸,整個結構并不改變。不少復雜的物理現象,背后就是反映著這類層次結構的分形幾何學。分形思想的提出讓我們了解事物的本質更進一步,同時也提供了一種研究問題的方法,那就是通過疊加來最終模擬出超乎想像的自然物體。更通俗易懂的來說,分形就是把復雜的自然物體分成一個個的簡單形態,這有點像傅立葉提出的“任何連續周期信號可以由一組適當的正弦曲線組合而成”,事實證明傅立葉是對的,即便是拉格朗日也阻止不了。反過來說,可以由簡單的形態通過無限次的疊加來模擬自然現象。



??這是計算機圖形學家利用分形理論通過迭代算法最終生成的精美圖像。分形理論打開了圖形學描述自然的一扇大門,影響著圖形學、幾何學的發展。在了解完分形概念之后,我們再來回顧一些基本知識。

波長(Wavelength):指的是兩個波谷(波峰)之間的距離
振幅(amlitude):指波的高度
頻率(frequency):指的是波的振動快慢,頻率就是1/波長
在正弦波中,他們非常容易區分。在噪聲波中,也有波長,振幅,頻率之分,如下圖所示。

波長(Wavelength):指的是波峰與波谷之間的距離
振幅(amlitude):指波的高大高度
頻率(frequency):指的是波的振動快慢,頻率就是1/波長

持續度(Persistence):這個詞是由《大自然的分形幾何學》[波] 伯努瓦·B. 曼德布羅特(Mandelbrot)引入的,Mandelbrot開創了分形幾何先河。持續度指的是表示每個頻率下的振幅,也可以看成是柔合了頻率和振幅,或者說是分形中某種單一層次分形波的特征,持續度展示了疊加的每個組成部分:

frequency=2i

amplitude=persistencei

下圖中,Persistence值分別為 1/4, 1/2 與 3/4。可以看出不同的Persistence值對每個倍頻的頻率和波幅以及最后結果的影響。(注:以下若干圖片來自參考文獻3)



倍頻 (Octaves):從字面上來理解,倍頻就是加倍的頻率,也是分形疊加中疊加的某種單一層次分形波的特征,倍頻不一定是2倍,也可以是其他倍數,如4倍頻與8倍頻,倍頻越高越多,最后得到的波形包含的細節越多,也越自然。

??為加深理解,我們來看看在頻率加倍,振幅減半的一維perlin 噪聲。





??可以看到,隨著頻率的升高,在同一尺度下提供了更高的細節,但波動(振幅)影響的范圍卻更小了。為更直觀的演示這種效果,我們分形疊加不同的倍頻,分別是1倍頻,2倍頻,4倍頻與8倍頻。




??可以看到倍頻數越高,Perlin噪聲就越精細,但整體形狀不會有很大的改變。這符合自然現象。最平常的例子是山峰輪廓,它包含著高度上的很大變化(山峰),中等變化(丘陵),小的變化(礫石),微小變化(石頭)…你可以繼續想象。所以在我們程序中,我們用低頻率,大振幅來模擬大尺度變化,用高頻率,小振幅來模擬小尺度的變化,并將之分形疊加,最終達到我們想要的效果。

二、分形布朗運動

??布朗運動(Brownian movement) 指微小粒子表現出的無規則運動。1827年英國植物學家R.布朗在花粉顆粒的水溶液中觀察到花粉不停頓的無規則運動。進一步實驗證實,不僅花粉顆粒,其他懸浮在流體中的微粒也表現出這種無規則運動,如懸浮在空氣中的塵埃。后人就把這種微粒的運動稱之為布朗運動。這里我們要講的布朗運動跟這個有點區別,要講清分形布朗運動還得從《大自然的分形幾何學》和最簡單的正弦波入手,本篇開篇我們即闡明了:客觀事物具有自相似的層次結構,局部與整體在形態、功能、信息、時間、空間等方面具有統計意義上的相似性,稱為自相似性。這是分形學的最重要的結論。下面我們從正弦波入手來分別講解。
??正弦波是最簡單的波形之一,正弦波有個非常有意思的特性,那就是波可以疊加。如下:




圖上一個是頻率為1的正弦波,另一個是頻率為2的正弦波,通過疊加產生了一個新的波,這個波的振幅由這兩個波通過簡單的加減構成。不僅是正弦波,其他波也有類似的疊加特性。在音樂中,每一個音階都對應著特定的頻率,頻率加倍或者減半對應著另一個八度音階(octave),可以看到octave這個詞是從音樂中引用過來的,前面我們翻譯成倍頻,根據我們剛說的,octave對應頻率的加倍或減半而不是加1.5倍或減0.4倍。我們稍后也會對噪聲作類似處理。
??現在我們由正弦波來討論Perlin噪聲(下圖是一維Perlin噪聲圖),Perlin噪聲有著和正弦波一樣的振幅和頻率,雖然這個振幅和頻率在一定的范圍內波動,雖然不像正弦波那樣規律,但我們還是可以看得出振幅和頻率只是在一定范圍內的合理偏離。由波的疊加可知,利用Perlin噪聲不同倍頻波的疊加可以很容易的更隨機的波形。

??我們通過一個步進值(lacunarity)逐漸的增大頻率,同時也同過一個增益值(gain)逐漸的減小振幅,主可以得到不同的倍頻(octaves),然后再將不同的倍頻疊加,這種技術就叫分形布朗運動(fractal Brownian Motion(fBM) )。簡單的分形布朗運動可以由下面的代碼生成。

const int octaves = 2; float lacunarity = 2.0; float gain = 0.5; float amplitude = 1.; float frequency = 1.;// 疊代 octaves,y縱軸,x為橫軸 for (int i = 0; i < octaves; i++) {y += amplitude * noise(frequency*x);frequency *= lacunarity;amplitude *= gain; }

??下面是octaves為2,4,8時的一維Perlin噪聲,可以看到疊加的octave越多,噪聲的細節就越多,另外一個值得注意的地方是,疊加的細節與原波形具備宏觀上的相似性,這就是我們說過的分形的最重要的特征。




??分形布朗運動是分形幾何里的重要概念,理論上疊加無限多的octave,可以得到無限細節的分形幾何圖形,在實際運用中,過多的疊加會削弱圖形性能,根據需要取合適的值。

三、Perlin noise原理

??Perlin noise原理很簡單:
??第一步:定義一個晶格結構,每個晶格的頂點有一個“偽隨機”的梯度向量。對于二維的Perlin噪聲來說,晶格結構就是一個平面網格,三維的就是一個立方體網格。
??第二步:輸入一個點(二維的話就是二維坐標,三維就是三維坐標,n維的就是n個坐標),我們找到和它相鄰的那些晶格頂點(二維下有4個,三維下有8個,n維下有2n個),計算該點到各個晶格頂點的距離向量,再分別與頂點上的梯度向量做點乘,得到2n個點乘結果。
??第三步:使用緩和曲線(ease curves)來計算它們的權重和。在原始的Perlin噪聲實現中,緩和曲線是s(t)=3t2?2t3,在2002年的論文6中,Perlin改進為s(t)=6t5?15t4+10t3。由高等數學可以知道,函數越是高階可導函數曲線越是平滑,s(t)=3t2?2t3在一階導滿足連續性,但它的二階導在晶格頂點處(即t = 0或t = 1)不為0,會造成明顯的不連續性。s(t)=6t5?15t4+10t3在二階導上仍然滿足連續性。
??這就是計算Perlin噪聲的邏輯和流程。下面我們以二維Perlin噪聲為例加以說明:
第一步:構建一個二維平面,同時生成每個頂點的“偽隨機”的梯度向量:


??這里,每個頂點各自生成一個偽隨機的梯度向量。梯度向量代表該頂點相對單元正方形內某點的影響是正向還是反向的(一會我們會看到梯度向里對最終效果的影響)。而偽隨機是指,對于任意組相同的輸入,必定得到相同的輸出。雖然每個頂點生成的梯度向量看似隨機,實際上并不是。這保證了在生成函數不變的情況下,每個坐標的梯度向量都是確定不變的。同時,這些梯度向量并不是完全隨機的,而是由單位正方體(3維)的中心點指向各條邊中點的12個向量:
(1,1,0),(-1,1,0),(1,-1,0),(-1,-1,0), (1,0,1),(-1,0,1),(1,0,-1),(-1,0,-1), (0,1,1),(0,-1,1),(0,1,-1),(0,-1,-1)
采用這些特殊梯度向量的原因在Ken Perlin’s SIGGRAPH 2002 paper: Improving Noise這篇文章里有具體說明。主要是為了避免“鏡像”現象。
第二步:輸入一個點,找到和它相鄰的那些晶格頂點:

找到輸入點所在的晶格的頂點梯度向量:

接著,求出另外4個距離向量,它們分別從各頂點指向輸入點(藍色點):

接下來,對相應的頂點梯度向量與距離向里作點積運算。從點積的特性可知:當兩個向量的夾角小于90度時點積結果為正;當兩個向量夾角大于90度時點積結果為負;當兩個向量夾角等于90度時點積結果為0。因此點積后的結果圖如下:

此圖很直觀的表現了梯度向量對最終效果的影響,這也是Perlin噪聲最終外觀表現的內在原因。
第三步:對4個頂點的影響值做插值,緩和曲線的值會用來計算插值因子,這樣插值變化不再是單調的線性變化,而是這樣一個過程:初始變化慢,中間變化快,結尾變化又慢下來(也就是在當數值趨近于整數時變化變慢,或者說是接近固定點時變化速率變緩)。我們用Perlin改進的緩和曲線 s(t)=6t5?15t4+10t3
這就是Perlin噪聲生成的原理同時也是步驟,理解起來不難。這里也可以看到,梯度值在生成噪聲中影響可謂是舉足輕重,這也是Perlin噪聲叫作梯度噪聲的來源。

四、小結

??本篇文章主要關注了分形噪聲,分形布朗運動,介紹了Perlin噪聲原理,通過上文,我們可以看到,分形噪聲跟噪聲一點關系都沒有,分形布朗運動跟運動一點關系都沒有,不要僅僅局限于字面的理解,更要理解概念的實質,這更重要。
參考文獻:
1、《大自然的分形幾何學》[波] 伯努瓦·B. 曼德布羅特(Mandelbrot)
2、Perlin Noise http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
3、關于噪聲的一些基本定義 http://www.gamersky.com/handbook/201601/708963_2.shtml?tag=wap
4、Fractal Brownian Motion https://thebookofshaders.com/13/
5、Understanding Perlin Noise ,https://flafla2.github.io/2014/08/09/perlinnoise.html
6、談談噪聲 http://blog.csdn.net/candycat1992/article/details/50346469

總結

以上是生活随笔為你收集整理的Perlin noise(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。