最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【Aegisub】隨機(jī)煙霧、隨機(jī)地形與柏林噪聲簡介

2022-09-06 20:12 作者:多華宮與火火里  | 我要投稿

????????下面這些效果都是利用柏林噪聲做出來的:

????????是的沒錯(cuò),柏林噪聲可以做火焰模擬、消融效果、定向溶解、定點(diǎn)溶解、平滑抖動(dòng)、隨機(jī)曲線、圖形扭曲、放射速度線、流場(chǎng)效果、隨機(jī)煙霧、隨機(jī)地形、湍流效果、體積云、電流閃電描邊等等等等各種各樣的效果,有著極其豐富的應(yīng)用。別忘了,之前我講過如何繪制隱式方程,也就是說,只要不是要專門做像素效果,那么你就可以直接繪制出相應(yīng)的繪圖,比如燃燒效果,就可以直接繪制出圖形,而不是用一堆像素來做!

? ? ? ? 好了,那么就開始具體講了。首先,現(xiàn)在說的"噪聲"其實(shí)指的就是隨機(jī)值。那比如說,現(xiàn)在就隨便生成幾十個(gè)或幾百個(gè)隨機(jī)數(shù),然后可以橫著把它們排出來、比如每隔一個(gè)單位畫出一個(gè)隨機(jī)點(diǎn),然后把這些點(diǎn)直接連起來就會(huì)大概是下圖這樣的,這應(yīng)該很容易理解

像是這樣的噪聲可以叫做一維噪聲。那很顯然,完全隨機(jī)的一些數(shù)是亂七八糟的、毫無美感,那么如果想要更平滑過渡的隨機(jī)數(shù)呢?當(dāng)然就可以用插值了。

? ? ? ? 先介紹值噪聲(即Value Noise)?,F(xiàn)在可以隔一段距離生成一個(gè)隨機(jī)數(shù),比如隔20個(gè)單位生成一個(gè)隨機(jī)數(shù),然后再用線性插值得到每個(gè)單位的對(duì)應(yīng)數(shù)值,這樣看起來就會(huì)不那么雜亂了

而如果想要更順滑的話,就可以不用線性插值,而是使用其它的插值函數(shù),比如fade(t)=3t2?2t3。原本的線性插值是a+t*(b-a)(即從a到b在走到 t 處時(shí)的數(shù)值),而如果用上fade函數(shù)就變成了a + fade(t) * (b-a),因?yàn)楝F(xiàn)在說fade(t)=3t2?2t3,所以從a到b在走到?t?處時(shí)的數(shù)就是a +?(3t2?2t3)?* (b-a)了。比如每隔20單位生成一個(gè)隨機(jī)數(shù),假設(shè)第一個(gè)隨機(jī)數(shù)是0.66、第二個(gè)隨機(jī)數(shù)是0.23,即0對(duì)應(yīng)的0.66、20對(duì)應(yīng)的0.23,那么比如7對(duì)應(yīng)的就該是0.66 + fade(7/20) * (0.23-0.66)了??偟膩碚f,這樣就可以得到更加平滑的一維隨機(jī)值噪聲了:

插值函數(shù)fade(t)可以有各種各樣的選擇,不過一般需要有幾個(gè)要求:fade(0)必須等于0、fade(0.5)必須等于0.5、fade(1)必須等于1,剛剛的fade(t)=3t2?2t3就滿足這些要求,再比如fade(t)=0.5*(1-cos(t*π))也是可以的,再比如fade(t)=6*t^5?15*t^4+10*t^3也可以。

? ? ? ? 那么二維的值噪聲其實(shí)也是同樣的道理。如果一維噪聲是橫軸上每個(gè)位置對(duì)應(yīng)一個(gè)隨機(jī)值的話,那二維噪聲當(dāng)然就是平面上每個(gè)點(diǎn)對(duì)應(yīng)一個(gè)隨機(jī)值了。假設(shè)隨機(jī)值的范圍是0到255的話,就可以和顏色對(duì)應(yīng)上,如果每個(gè)像素對(duì)應(yīng)的隨機(jī)值完全隨機(jī)(指的是直接用random函數(shù)的意思)的話,就會(huì)得到這樣的圖像:

顯然也是雜亂無章的,這樣的噪聲被稱為白噪聲(即White Noise),而如果要更加平滑的噪聲的話,當(dāng)然還是要用插值了。二維的值噪聲和一維的是同樣的道理,一維的是每隔一段距離取一個(gè)隨機(jī)數(shù)、然后中間的部分就插值、相當(dāng)于把數(shù)軸分成一段段的,那么二維的話,就可以把平面分成網(wǎng)格、在每個(gè)方格頂點(diǎn)生成一個(gè)隨機(jī)數(shù),然后平面上的其它點(diǎn)就用插值得到:

比如x的間隔和y的間隔都是一樣的,那么每個(gè)格子就是正方形了,當(dāng)然也可以x間隔和y的間隔不一樣。然后在每個(gè)頂點(diǎn)生成一個(gè)隨機(jī)數(shù)

然后其它點(diǎn)就可以利用這些隨機(jī)數(shù)來插值得到。比如就看一個(gè)格子里的某一點(diǎn)

那怎么插值呢?其實(shí)就是插三次,左上和右上插值得到點(diǎn)B、左下和右下插值得到點(diǎn)A、最后A和B之間插值得到P

假設(shè)每次插值都是線性的話,就可以得到這樣的效果(200X200共4萬個(gè)像素,格子大小是20X20)

這樣的效果看起來像毛玻璃,不過線性插值的過渡不夠平滑,所以用fade插值函數(shù)的話,就會(huì)得到這樣的效果

200X200共4萬個(gè)像素,格子大小是20X20

這樣就得到了二維值噪聲了,當(dāng)然格子剛剛說了也可以不是正方形的,反正都是一樣的插值而已

200X200共4萬個(gè)像素,格子大小是40X20

雖然現(xiàn)在過渡平滑了,但顯然值噪聲看起來和自然噪聲區(qū)別不小,所以在80年代一個(gè)名叫Perlin的老外提出了柏林噪聲。二維柏林噪聲的生成方法當(dāng)然就有些許不同,二維值噪聲是在格子頂點(diǎn)處生成一個(gè)隨機(jī)數(shù),而二維柏林噪聲是在格子頂點(diǎn)處生成一個(gè)隨機(jī)梯度(即一個(gè)向量),然后利用點(diǎn)乘來做插值

比如要求上圖P這個(gè)點(diǎn)的隨機(jī)值,紅色向量是在格子頂點(diǎn)生成的隨機(jī)梯度,然后每個(gè)頂點(diǎn)的紅色向量和藍(lán)色向量做點(diǎn)乘,然后用點(diǎn)乘得到的4個(gè)數(shù)值來插值、當(dāng)然是插三次就得到了P點(diǎn)處需要的隨機(jī)值了。舉例比如對(duì)于左上的頂點(diǎn)就是向量a1和向量P1P進(jìn)行點(diǎn)乘,其它頂點(diǎn)的同理。哦對(duì)了,藍(lán)色向量當(dāng)然就是從格子頂點(diǎn)連到P這個(gè)像素點(diǎn)的一個(gè)向量。

? ? ? ? 這樣就有了二維柏林噪聲,那三維的也是同理。三維的就把空間劃分為多個(gè)立方體,然后插值即可,當(dāng)然三維就要插值7次了(一維插值1次、二維插3次),插的方法是同理的。

? ? ? ? 不過現(xiàn)在想一想,網(wǎng)格頂點(diǎn)都要生成一個(gè)隨機(jī)梯度,那么如果要求平面上任意一點(diǎn)的噪聲值,就需要有布滿整個(gè)平面的一張網(wǎng)格,就有無數(shù)個(gè)格子頂點(diǎn),那難道要提前生成無數(shù)個(gè)隨機(jī)梯度嗎?很顯然,不管是一維還是二維還是幾維,都需要提前生成一些隨機(jī)的東西,但是不可能生成無數(shù)個(gè)隨機(jī)的東西,所以柏林噪聲的作者在此后提出了優(yōu)化算法。

? ? ? ? 現(xiàn)在比如三維的柏林噪聲,每個(gè)立方體頂點(diǎn)就不生成完全隨機(jī)的梯度向量了,而是預(yù)設(shè)好一些向量,然后在這些向量里隨機(jī)選一個(gè)作為這個(gè)頂點(diǎn)的隨機(jī)梯度即可。比如,預(yù)設(shè)有12個(gè)不同的向量:

每個(gè)頂點(diǎn)在生成隨機(jī)梯度的時(shí)候,不再是生成任意的隨機(jī)向量了,而是在這12個(gè)里面隨便選一個(gè)當(dāng)做隨機(jī)梯度。不過由于為了在寫代碼時(shí)方便用位運(yùn)算,所以可以把預(yù)設(shè)的向量個(gè)數(shù)增加到16個(gè),在剛剛的基礎(chǔ)上再添加4個(gè)

當(dāng)然這4個(gè)和剛剛的12個(gè)是重復(fù)的,但這無所謂,反正在這16個(gè)向量里隨便選一個(gè)作為頂點(diǎn)處的梯度向量即可。然后由于還是不可能記錄保存下無數(shù)個(gè)隨機(jī)梯度,所以需要任給一個(gè)頂點(diǎn)坐標(biāo)都能返回一個(gè)確定的隨機(jī)梯度,那就需要用到排列表和哈希值了?,F(xiàn)在將排列表取名為perm表,perm表裝有512個(gè)范圍是0到255的隨機(jī)數(shù),然后每個(gè)點(diǎn)的哈希值用取余計(jì)算得到,然后因?yàn)轭A(yù)設(shè)16個(gè)向量,就在這16個(gè)里選,所以哈希值和16取余得到相應(yīng)的梯度。那由于本質(zhì)上是用的取余運(yùn)算,所以就算是無數(shù)個(gè)立方體頂點(diǎn),每個(gè)頂點(diǎn)也能算出一個(gè)隨機(jī)梯度,而且當(dāng)然,對(duì)于相同的perm隨機(jī)表、每個(gè)頂點(diǎn)得到的隨機(jī)梯度就是相同的。相當(dāng)于,只要生成了一個(gè)隨機(jī)的排列表perm,空間中任意一個(gè)點(diǎn)的噪聲值都可以算出來了,而且對(duì)于同一個(gè)perm排列表、每一點(diǎn)的噪聲值都一樣。所以你想生成不同的噪聲值,只需要生成不同的perm表即可。假設(shè)你無法理解這一段,也沒有關(guān)系,在老外的https://adrianb.io/2014/08/09/perlinnoise.html 這篇文章里本身應(yīng)該已經(jīng)講得很清楚了,因?yàn)檫B代碼都可以說是幫你寫好了,再不濟(jì),你把它翻譯成Lua語言你不會(huì)嗎?并且,這算法得到的噪聲值的范圍在-1到1,這樣也算是非常方便了,比如你縮放平移一下就能得到0到255的數(shù)

? ? ? ? 在剛剛的這個(gè)算法中,顯然每個(gè)坐標(biāo)是整數(shù)的點(diǎn)都對(duì)應(yīng)生成一個(gè)隨機(jī)的梯度,什么意思,不就是在說,立方體是邊長為1的正方體嗎,如果用二維的來說就是每個(gè)格子的邊長是1。但是顯然,在剛剛所有舉例中,格子的邊長都大于1,比如x間隔20y間隔40這樣的,你現(xiàn)在每個(gè)方向都間隔1,那你要怎么算每個(gè)像素的噪聲值呢、每個(gè)像素的坐標(biāo)不就是"間隔1"的嗎,你都沒地方插值了?。苦?,那當(dāng)然是縮放??!仔細(xì)想想這是不是廢話?如果這真的是廢話,這證明什么?當(dāng)然是證明我喜歡說廢話?。】墒峭瑯右痪鋸U話,對(duì)于每個(gè)人來說是一樣的嗎,也許對(duì)于一些人,廢話不是廢話呢?那我講的是廢話嗎?喂來碗泡椒牛肉炒面,我正在研究在外星人頭上騎摩托車呢!很好,這就對(duì)了。縮放是什么意思,比如如果格子的邊長是30,你可以算出來每個(gè)像素的噪聲值,但是現(xiàn)在格子邊長是1,相當(dāng)于畫面縮放成了30分之一,比如你要求原來(23,66)這個(gè)像素的噪聲值,現(xiàn)在就求(23/30,66/30)這個(gè)坐標(biāo)的噪聲值即可,然后你顯示圖像的時(shí)候,就還是顯示在(23,66)這個(gè)位置不就行了?所以,這么看的話,格子邊長是1實(shí)際上更方便了,因?yàn)槔每s放你可以更輕松地得到各種各樣邊長的格子,比如你想x間隔是40y間隔是20,那求(233,666)這個(gè)點(diǎn)的噪聲值就是求(233/40,666/20)這個(gè)點(diǎn)在邊長是1的格子里的噪聲值。

????????也就是說,現(xiàn)在"標(biāo)準(zhǔn)"柏林噪聲算法劃分的格子的邊長是1,其它任意邊長的格子都可以縮放得到,反正現(xiàn)在空間中任意一點(diǎn)的噪聲值都已經(jīng)是可以計(jì)算出來的。并且任意一點(diǎn)的噪聲值的取值范圍是-1到1。那比如你想要隨機(jī)值的范圍是0到1,你當(dāng)然不能直接對(duì)隨機(jī)值取絕對(duì)值,雖然-1到1取絕對(duì)值以后它的范圍就落在0到1,但是這樣做你就改變了原本的分布情況了。為了不改變隨機(jī)數(shù)在區(qū)間里的分布,只能對(duì)區(qū)間進(jìn)行縮放和平移、不能對(duì)區(qū)間進(jìn)行翻折(比如取絕對(duì)值)。所以把區(qū)間縮小一半然后平移0.5即可,假設(shè)你的噪聲值是val,那么用val/2+0.5就可以得到在0到1這個(gè)范圍的隨機(jī)數(shù)了。同樣的,如果要讓噪聲值的范圍是0到255,只需要把0到1縮放成0到255即可,很簡單。所以每個(gè)像素都可以對(duì)應(yīng)一個(gè)灰度,即一個(gè)顏色,r、g、b的值都是一樣的。比如6C6C6C就是r、g、b都是6C,比如FFFFFF就是r、g、b都是FF、而FFFFFF當(dāng)然是白色了,而000000是黑色(可以理解為黑色是0白色是1),那現(xiàn)在每個(gè)像素對(duì)應(yīng)一個(gè)顏色的話,就可以有:

200x200共4萬個(gè)像素,格子大小是30x30

? ? ? ? 同樣的,你還可以繪制等值線,比如就讓噪聲值的范圍是-1到1,可以畫出大于0的部分:

? ? ? ? 為了配合柏林噪聲的范圍,也可以讓其它噪聲的范圍也在-1到1,比如讓值噪聲的范圍是-1到1,這樣統(tǒng)一設(shè)定一下就會(huì)更方便記憶和使用。并且也同樣設(shè)定用來生成值噪聲的格子邊長也是1

? ? ? ? 現(xiàn)在再來更加"具體"、"形象"的理解一下噪聲。首先生成隨機(jī)的排列表perm、表里數(shù)字的范圍是0到255,比如:

對(duì)于一維噪聲,就是給出一個(gè)數(shù)字然后得到一個(gè)隨機(jī)值,即使用func(x)返回一個(gè)-1到1的隨機(jī)數(shù),而對(duì)于同一個(gè)排列表,func(x)得到的數(shù)當(dāng)然是一樣的、比如不停地用func(233),得到的結(jié)果永遠(yuǎn)是相同的、比如不停地用func(666),得到的結(jié)果也永遠(yuǎn)是相同的func(666),對(duì)于不同的perm排列表,同一個(gè)x的話,func(x)當(dāng)然也是不同的。其實(shí)就像random函數(shù)一樣,如果設(shè)定同樣的隨機(jī)數(shù)種子,那么random函數(shù)得到的隨機(jī)數(shù)就是一樣的?,F(xiàn)在同一個(gè)排列表就能得到同樣的隨機(jī)值。然后,別忘了咱們用柏林噪聲的理由,是為了得到平滑過渡的噪聲值,所以顯然,同一個(gè)排列表要用很多次,比如現(xiàn)在每次得到隨機(jī)數(shù)時(shí)不重新生成新的隨機(jī)排列表,那么func(x)首先得到一個(gè)-1到1的隨機(jī)數(shù),而你用func(x+0.01)也會(huì)得到一個(gè)隨機(jī)數(shù),你當(dāng)然會(huì)發(fā)現(xiàn)得到的隨機(jī)數(shù)和func(x)得到的數(shù)很接近,因?yàn)橐呀?jīng)講得很清楚了,噪聲值現(xiàn)在是平滑過渡的

而如果你取func(x)和func(x+2)的話,你就可能會(huì)發(fā)現(xiàn)得到的兩個(gè)數(shù)相差很多。因?yàn)樯厦嬉呀?jīng)講了,現(xiàn)在生成噪聲的采樣間隔是1(如網(wǎng)格格子邊長是1),所以你取點(diǎn)的時(shí)候只要相差小于1,那么得到的隨機(jī)數(shù)就會(huì)比較接近了。同樣的,可以應(yīng)用縮放的思想,你不想要采樣間隔是1,你想采樣間隔是20,那么你使用函數(shù)的時(shí)候就可以是用func(x/20)和func( (x+9)/20 )這樣的,這樣當(dāng)然也會(huì)得到平滑過渡的隨機(jī)值了。

????????對(duì)于二維噪聲同理。同一個(gè)perm表,用func(x,y)得到的隨機(jī)數(shù)和func(x+0.01,y)得到的隨機(jī)數(shù)差不多、也和func(x-0.01,y+0.003)得到的隨機(jī)數(shù)差不多、也和fiunc(x+0.0123,y+0.023)差不了多少。當(dāng)然你覺得這樣不清晰,也可以縮放網(wǎng)格格子,比如讓格子大小是23x66的,那么你可以算每個(gè)像素點(diǎn)對(duì)應(yīng)的噪聲值,即func(x/23,y/66)。所以三維噪聲也是同樣的,本身算法里設(shè)定是立方體邊長是1,方便縮放,所以你用func(x/77,y/5,z/21)就說明你想設(shè)定的是x間隔77y間隔5z間隔21。所以四維噪聲也同理,如func(x,y,z,w)和func(x+0.01,y+0.0001,z+0.04,w-0.0233)就很接近,因?yàn)槟J(rèn)采樣間隔是1。

? ? ? ? 所以知道了采樣間隔是1方便縮放以后,就能利用縮放得到不同的噪聲圖了。比如150x150的像素圖、設(shè)定格子邊長是30x30可以得到

而設(shè)定格子邊長是20x20就有:

設(shè)定格子邊長是10x10就有:

顯然格子邊長越小整個(gè)圖看起來就越"密集",這可以直接從縮放來理解

格子相對(duì)于噪聲圖越大則噪聲圖看起來就越"不密集",格子相對(duì)于噪聲圖越小則噪聲圖看起來就越"密集"。從縮放的角度看,各種各樣的格子都是從1x1的格子縮放得到的,比如30X30的格子不就是把默認(rèn)的1x1的格子在x、y方向都縮放了30嗎,所以你就可以發(fā)現(xiàn)以30x30為格子的噪聲圖是以20x20的噪聲圖的一部分。當(dāng)然在縮放的時(shí)候,排列表當(dāng)然是不變的,因?yàn)橥粋€(gè)排列表對(duì)應(yīng)同樣的噪聲,所以當(dāng)然不能改變排列表了,這剛剛應(yīng)該已經(jīng)講得很清楚了,什么時(shí)候可以改變排列表、什么時(shí)候不能改變排列表。

????????當(dāng)然縮放的時(shí)候,可以x、y縮放不一樣,比如還是150x150的噪聲圖,格子設(shè)定是60x20

比如把格子設(shè)定成150x20:

比如把格子設(shè)定成150x5

利用不同的縮放就能得到各種需要的噪聲圖,比如利用上面細(xì)的一條條就可以做速度線效果

????????一般的random函數(shù)得到的隨機(jī)數(shù)在整個(gè)取值范圍是均勻分布的,而噪聲函數(shù)則不一樣,它是類似正態(tài)分布的。也就是說,比如范圍是-1到1,生成的大部分噪聲值是靠近0的,而靠近-1和1的非常少

? ? ? ? 再總的重復(fù)啰嗦一遍,在"標(biāo)準(zhǔn)的"、"優(yōu)化的"柏林噪聲算法中,"格子"間隔是1、對(duì)于同一個(gè)排列表會(huì)得到同樣的噪聲、噪聲值的范圍在-1到1

? ? ? ? 那知道了每個(gè)點(diǎn)可以生成一個(gè)噪聲值,那動(dòng)態(tài)的效果是怎么做的呢,就算平面上每一點(diǎn)都有一個(gè)噪聲值,可是又怎么讓它變起來呢?這當(dāng)然是增加一個(gè)維度了,比如你想讓一維的隨機(jī)曲線動(dòng)來動(dòng)去,就可以利用二維噪聲,而如果你想二維的噪聲動(dòng)來動(dòng)去,當(dāng)然就要用三維噪聲了:

顯然三維噪聲是空間中每一個(gè)點(diǎn)都對(duì)應(yīng)一個(gè)噪聲值,所以你可以截出一個(gè)面,這個(gè)面當(dāng)然就是一張?jiān)肼晥D了,而如果連續(xù)的朝一個(gè)方向截取一個(gè)個(gè)面,當(dāng)然就可以做出一張"動(dòng)來動(dòng)去"的噪聲圖了。這應(yīng)該很好理解,比如對(duì)于一維噪聲來說,一個(gè)點(diǎn)附近的點(diǎn)對(duì)應(yīng)的噪聲值和這一點(diǎn)的噪聲值很接近,對(duì)于二維噪聲來說,一個(gè)點(diǎn)周圍的其他點(diǎn)(如上下左右)的噪聲值和這個(gè)點(diǎn)的噪聲值很接近,對(duì)于三維噪聲來說,一個(gè)點(diǎn)周圍的其他點(diǎn)(如上下左右前后)的噪聲值和這個(gè)點(diǎn)的噪聲值很接近,因?yàn)檫@些噪聲都是平滑過渡的。所以想要噪聲"動(dòng)來動(dòng)去"只需要增加一個(gè)維度即可,比方說你隨便在一個(gè)高度取一堆x、y得到一張?jiān)肼晥D、然后將高度增加一些又取一堆x、y又得到一張?jiān)肼晥D,以此類推。同樣的道理,你也可以使噪聲圖看起來有平移效果,這當(dāng)然不需要增加維度,而是直接朝相應(yīng)的方向偏移即可

因?yàn)檫^渡是平滑的,所以你在平面任意畫一條曲線,然后一點(diǎn)點(diǎn)的取得曲線上的點(diǎn),這些點(diǎn)對(duì)應(yīng)的噪聲值當(dāng)然也是平滑過渡的

所以如果你在噪聲圖上畫一個(gè)圓,那么一開始的噪聲值和最后的噪聲值就可以一樣了,相當(dāng)于首尾相接了

這意味著你可以做隨機(jī)的循環(huán)效果,比如可以讓一個(gè)點(diǎn)隨機(jī)的走動(dòng),然后整個(gè)過程可以循環(huán)起來。

????????在有了柏林噪聲以后,就可以利用分形布朗運(yùn)動(dòng)( 即fbm )使得噪聲看起來更加"自然"

這很簡單,就是疊加噪聲而已。比如有一個(gè)正弦波

然后又有一個(gè)正弦波

然后疊加起來就有

所以要得到像是山脈一樣的東西,只需要將噪聲疊加一下即可

比如原本的函數(shù)是func(x,y),現(xiàn)在設(shè)定一個(gè)新的函數(shù)func2(x,y)是func(x,y)+func(x*0.5,y*0.5)這樣不就是疊加了嗎?顯然疊加的次數(shù)越多,就會(huì)有越多的"細(xì)節(jié)",不過疊加次數(shù)越多計(jì)算量當(dāng)然就越大,所以一般疊加最多8次就行了。

噪聲圖相加就是字面意思的相加,就是在噪聲圖A的點(diǎn)(x,y)對(duì)應(yīng)某噪聲值1、在噪聲圖B的這點(diǎn)(x,y)對(duì)應(yīng)某噪聲值2、在噪聲圖C的這點(diǎn)(x,y)對(duì)應(yīng)某噪聲值3,將噪聲值1、2、3都加起來就得到這個(gè)點(diǎn)的新的噪聲值了,當(dāng)然加起來可能最后會(huì)使得噪聲值范圍不在-1到1,所以最后要控制一下最大的幅度。這很簡單,一個(gè)范圍是-1到1的數(shù)加上一個(gè)范圍是-0.5到0.5的數(shù)以后,得到的數(shù)的范圍就是-1.5到1.5,那么這個(gè)數(shù)只要再除以1.5就直接讓它的范圍在-1到1了。所以現(xiàn)在這些噪聲的最大幅度都知道,最開始噪聲值范圍是-1到1、所以振幅是1,然后疊加振幅0.5的噪聲,然后又加振幅0.25的噪聲,然后又加振幅是0.125的,以此類推,然后為了控制使得得到的噪聲值的范圍是-1到1,只需要將結(jié)果除以(1+0.5+0.25+0.125+......)即可,應(yīng)該講的很清楚了。

? ? ? ? 最后再簡單提一下simplex noise,剛剛講了柏林噪聲,而simplex noise其實(shí)也是柏林噪聲的作者Perlin提出來的,是的,Perlin提出了perlin noise然后又優(yōu)化了perlin noise然后為了使得噪聲算法更優(yōu)化,他本人又提出了simplex noise。

????????咱們已經(jīng)知道在二維中是如何在四個(gè)點(diǎn)(正方形的四個(gè)角)之間插值的;,對(duì)于三維和四維我們需要插入 8 個(gè)和 16 個(gè)點(diǎn)。也就是說對(duì)于 N 維你需要插入 2 的 n 次方個(gè)點(diǎn)(2^N)。盡管很顯然填充屏幕的形狀應(yīng)該是方形,在二維中最簡單的形狀卻是等邊三角形。所以Perlin他把正方形網(wǎng)格(才剛講了怎么用)替換成了單純形等邊三角形的網(wǎng)格。

這時(shí) N 維的形狀就只需要 N + 1 個(gè)點(diǎn)了。也就是說在二維中少了 1 個(gè)點(diǎn),三維中少了 4 個(gè),四維中則少了 11 個(gè)!那么怎么得到三角形網(wǎng)格呢?可以先把常規(guī)的四角網(wǎng)格分成兩個(gè)等腰三角形,然后再把三角形歪斜成等邊三角形。

其實(shí)就是坐標(biāo)變換一下而已。有了網(wǎng)格以后,就是插值了。

????????simplex noise 比之前的算法有如下優(yōu)化:

? ? ? ??有著更低的計(jì)算復(fù)雜度和更少乘法計(jì)算。

? ? ? ??可以用更少的計(jì)算量達(dá)到更高的維度。

? ? ? ??制造出的 noise 沒有明顯的人工痕跡。

? ? ? ??有著定義得很精巧的連續(xù)的 gradients(梯度),可以大大降低計(jì)算成本。


? ? ? ? 最后,關(guān)于噪聲的應(yīng)用實(shí)在是過于的多,多得數(shù)不過來,所以各種各樣的應(yīng)用就在以后再講了。

????????然后代碼啥的照舊在相應(yīng)的視頻里講

【Aegisub】隨機(jī)煙霧、隨機(jī)地形與柏林噪聲簡介的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
天气| 盐山县| 会理县| 福州市| 双城市| 海宁市| 宜黄县| 瑞安市| 兰西县| 望都县| 喀喇沁旗| 虹口区| 任丘市| 泰兴市| 灵寿县| 凌海市| 壶关县| 衡水市| 北辰区| 花莲县| 南皮县| 瓦房店市| 兖州市| 天门市| 固阳县| 营山县| 中阳县| 辉南县| 娱乐| 开远市| 南木林县| 东辽县| 五峰| 高台县| 焦作市| 扎囊县| 屯门区| 曲阜市| 普兰店市| 禄丰县| 秦安县|