第一章內(nèi)容就兩句話啦:隨機(jī)游走,Perlin噪聲
前者原理簡單涤伐,適用于各種創(chuàng)作馒胆,后者可以拓展更有趣的應(yīng)用,譬如流場凝果,《MineCraft》,去年OpenGl大作業(yè)復(fù)制《MineCraft》有用到国章,游戲里也用,很熟悉的概念了豆村。所以選擇了酷炫的流場液兽。樣圖如下:
粒子系統(tǒng)在自畫像時(shí)已有涉及https://blog.csdn.net/WSXOKMLHDFEH/article/details/102898389
但是即使有之前的粒子與噪聲的應(yīng)用經(jīng)驗(yàn),我也想不出如何能讓一堆粒子的運(yùn)動(dòng)在空間上產(chǎn)生平滑效果掌动。后來就搜了搜四啰,一個(gè)有用的鏈接如下
https://zhuanlan.zhihu.com/p/27759509
讀了一下代碼,粒子行為同我之前的花瓣系統(tǒng)不同之處在于規(guī)定了加速度粗恢,并且加速度依托每一幀所在位置隨機(jī)生成
float deg = 360.0*noise( loc.x/w,
loc.y/h,
millis()/10000.0);
rad=radians(deg);
acc.set(cos(rad), sin(rad));
speed.add(acc);
if (speed.magSq()>maxVel) {
speed.normalize();
speed.mult(maxVel);
}
loc.add(speed);
如此柑晒,粒子運(yùn)動(dòng)就能表現(xiàn)出空間連續(xù)相關(guān)啦
那么問題來啦,要如何交互呢眷射?交互基本上依靠鼠標(biāo)坐標(biāo)匙赞,那么要如何檢測鼠標(biāo)擊中的粒子呢佛掖?畢竟粒子亂飛,鼠標(biāo)很難依靠位置去捕捉粒子并拿到粒子的引用涌庭,只有在每一個(gè)粒子中規(guī)定檢測鼠標(biāo)的行為芥被,這會帶來兩個(gè)問題:
1. 計(jì)算復(fù)雜度飛增,每一個(gè)粒子需要每一幀檢測與鼠標(biāo)的距離坐榆,而能捕捉到鼠標(biāo)的粒子在空間與時(shí)間維度上比例極小拴魄。開銷過大,冗余也過大席镀。
2.即使鼠標(biāo)能捕捉到粒子匹中,又要如何做到對粒子的影響是以擊中的粒子為圓心向外擴(kuò)散并且逐漸減小呢?
能捕捉到粒子已經(jīng)很難了豪诲,還要對周圍粒子進(jìn)行平滑處理顶捷。哇,我著實(shí)撓頭了許久屎篱。而且processing教程還很少焊切,哭泣。
后來我翻了一下《代碼本色》目錄芳室,看到第六章有流場专肪,翻過去看了看。它在二維數(shù)組里規(guī)定一堆向量堪侯,其方向依靠Perlin噪聲生成平滑變化的場嚎尤。這個(gè)概念簡單,后來又講要獲取場中小車的速度伍宦。沒有看上下文芽死,推測前面是講規(guī)定小車速度加速度之類的。
感覺沒多少啟發(fā)次洼。幾分鐘后再看了獲取小車速度函數(shù)是突然就明白了:流場 流場关贵,就好像電子在電場中跑一樣,真正要隨著時(shí)間改變方向卖毁,速度揖曾,以及同鼠標(biāo)發(fā)生交互的應(yīng)該是一個(gè)規(guī)定好的二維數(shù)組,而粒子要做的就只是讀取當(dāng)前位置所在的數(shù)組值作為方向跑就是了亥啦。
That's it !
于是迅捷寫好代碼炭剪,流場展示如下:
粒子展示如下:
然后我們要流場隨著時(shí)間改變方向,可勻速翔脱,也可變速奴拦,但為了后面的交互,勻速先届吁。
如果說此時(shí)鼠標(biāo)點(diǎn)擊错妖,我們應(yīng)該改變流場绿鸣。問題來了,之前的流場我僅作為速度暂氯,作加速度也可潮模。但是如之前的《星空》中所展現(xiàn)的,鼠標(biāo)的移動(dòng)改變了一些粒子的運(yùn)動(dòng)方向株旷,并且在一段時(shí)間后恢復(fù)再登。那么這個(gè)改變是要作為速度還是方向賦予粒子?當(dāng)然時(shí)間空間的平滑變化好處理尔邓,空間上應(yīng)該要有函數(shù)以鼠標(biāo)為圓點(diǎn)向周圍網(wǎng)格賦上遞減的力晾剖,時(shí)間上讓這個(gè)力以時(shí)間遞減最后為零。但這段時(shí)間過后梯嗽,粒子應(yīng)當(dāng)遵從什么運(yùn)動(dòng)齿尽?
啊,亂了灯节。不想了循头,過幾天更!