葉隨風(fēng)動(dòng)

????????這篇文章接著上篇文章,上篇文章基本把LBM這塊的核心東西大致說了一遍。有了流體風(fēng)場(chǎng),自然就是如何使用了,今天就以風(fēng)吹樹葉來講述這個(gè)方法的優(yōu)勢(shì)與不足。
????????首先就是考慮如何對(duì)風(fēng)場(chǎng)進(jìn)行讀取和寫入,以便與其他的模塊,諸于藍(lán)圖,材質(zhì)亦或是其他Niagara進(jìn)行溝通。


????????溝通的媒介就是Render Target,我們需要存儲(chǔ)空間的向量信息(這里一般是速度場(chǎng),當(dāng)然也可以存其他的,按需求來),把得到的速度場(chǎng)存在名為SimRT的Render Target 3D上,用Grid3D Collection這支“筆”進(jìn)行寫入。有了這些當(dāng)然還不夠了,我們還需要記錄風(fēng)場(chǎng)的信息。比如風(fēng)場(chǎng)限于性能是有大小的,還要跟隨角色移動(dòng)(角色移動(dòng)的的話,可以考慮實(shí)時(shí)傳入角色的位置,基于位置算出角色的速度,流體按照角色的相反速度加上去就可以跟隨角色移動(dòng),此處未實(shí)踐,僅供參考),最重要的就是坐標(biāo)的轉(zhuǎn)換了,UE經(jīng)常在Niagara中三個(gè)坐標(biāo)系來回折騰,分別是最基礎(chǔ)的世界(World)坐標(biāo),基于Niagara系統(tǒng)的本地(Local)坐標(biāo),還有就是Grid3D Collection,Render Target常用到的單位(Unit)坐標(biāo)。
????????為此官方在Grid 3D Gas Update Emitter模塊中花了大量精力去進(jìn)行各種數(shù)學(xué)運(yùn)算來完成這些坐標(biāo)系的轉(zhuǎn)換。而且這個(gè)還比較重要,很多地方都會(huì)用到,像什么Neighbor Grid 3D也會(huì)出現(xiàn),當(dāng)然官方都寫好了,直接拿出來用也一樣,這些東西本來打算寫一下的,但反過來一想還是把背后的數(shù)學(xué)知識(shí)推薦給大家吧。


????????這里推薦上面的線代全集,以及下面的中間一集(Lecture 03 Transformation)看完總共就4個(gè)小時(shí)。如果線性代數(shù)只學(xué)過同濟(jì)那本那就更加推薦上面的視頻了,會(huì)對(duì)線性代數(shù)有著全新的理解??赐曛蠊俜綄懙臇|西那就是小菜一碟灑灑水啦。
????????


????????這里用Render Target 2D要存五個(gè)關(guān)于風(fēng)場(chǎng)的數(shù)據(jù),注意Override Render Target Filter要用Nearest模式。為什么,直接放圖比嘮叨一大堆更加簡(jiǎn)潔明了。


????????我要存五個(gè)數(shù),下面那個(gè)模式直接破壞了數(shù)據(jù)。不需要對(duì)數(shù)據(jù)進(jìn)行奇怪操作。
????????存了數(shù)據(jù),接下來就是考慮如何讀取了,目前只試過在材質(zhì)和其他Niagara中采樣數(shù)據(jù),藍(lán)圖還沒有試過。首先是材質(zhì):




????????把Render Target直接拽進(jìn)材質(zhì)里,連在SimRT之前的一大圈東西的目標(biāo)只有一個(gè),把世界坐標(biāo)轉(zhuǎn)換成Render Target里的坐標(biāo),換句話說假如處在風(fēng)場(chǎng)的某個(gè)世界坐標(biāo)(110,-151,111)在RenderTarget里的坐標(biāo)可能就是(0.2,-0.15,0.11)這些數(shù)據(jù)只是個(gè)表象,方便大家理解,并不是真實(shí)的。所以包括后面Niagara里也有相同的操作,目的就是將前面的數(shù)轉(zhuǎn)化成后面的數(shù)。至于其中還有涉及插值什么的,那是圖像處理手段,這里就不贅述了。MF_SampleWindData這個(gè)就是讀取風(fēng)場(chǎng)相關(guān)的數(shù)據(jù)的。
????????

????????這個(gè)材質(zhì)主要是Debug用的。本來在材質(zhì)中我想試試風(fēng)場(chǎng)對(duì)草的影響,如果不涉及交互的話,效果還是不錯(cuò)。但是一旦涉及交互,即我輕輕稍微移動(dòng)一下交互物體,那么附近的草也會(huì)抖動(dòng),因?yàn)檩斎氲娘L(fēng)場(chǎng)速度,會(huì)隨著交互物體每幀抖動(dòng),美術(shù)效果上看很奇怪。原因有兩個(gè),一個(gè)本身LBM只能模擬較小速度,我是倍增了速度。然后這種抖動(dòng)隨著倍增而增加,交互物體的速度遠(yuǎn)大于模擬速度。第二個(gè)就是為什么樹葉能用了,樹葉是把速度場(chǎng)作為力來看待,力本身突變對(duì)于位置的連續(xù)性沒什么太大影響。樹葉的交互就顯的十分舒服自然。當(dāng)然解決方法很多種,但都避開不了一個(gè)東西,需要添加額外的消耗。我本意是想通過這個(gè)風(fēng)場(chǎng),存兩張RenderTarget然后影響所有東西,包括樹葉,草,樹,頭發(fā),布料也伴隨著交互等等,但實(shí)際看來,還需要進(jìn)一步研究。
????????





????????這就是在Niagara采樣風(fēng)場(chǎng)的模塊了,其實(shí)和材質(zhì)的是一模一樣,只是處理方法不同罷了。這里就是把風(fēng)場(chǎng)的速度作為風(fēng)力來影響樹葉。
????????

????????整個(gè)樹葉模塊還是比較簡(jiǎn)單的,沒什么花里胡哨的,大部分都是系統(tǒng)自帶的。
????????對(duì)于樹葉,落在地面上的交互效果,這部分也處理了很長(zhǎng)時(shí)間,效果是只能說是差強(qiáng)人意吧。
Leaf Facing Correct By Speed
????????



????????這個(gè)模塊就是樹葉速度為0時(shí),使其仰面向上。至于樹葉落在地面還隨著坡度的變化而變化可以做,但是為了這點(diǎn)效果所需的性能消耗就太大了,費(fèi)半天力,別人還注意不到這種細(xì)節(jié)。這里L(fēng)erp Factor節(jié)點(diǎn),可以調(diào)節(jié)樹葉落地時(shí),方向改變的快慢。有點(diǎn)反常識(shí)。但是仔細(xì)想想四元數(shù)以及Update是每幀都執(zhí)行計(jì)算,就可以理解這個(gè)參數(shù)就是調(diào)節(jié)到目標(biāo)四元數(shù)每幀旋轉(zhuǎn)的程度。Make Quaternion from X and Y Vectors,這里XVector的方向就是垂直與葉片方向(把葉片近似的想象為一個(gè)平面),葉子落地,大部分葉子肯定不會(huì)豎著的,所以X Vector?的數(shù)值為(0,0,1)。當(dāng)然這個(gè)數(shù)值還可以精修,看自己的需求了。比如加點(diǎn)隨機(jī)值,上文提到的隨坡度變化等等。Y Vector?給個(gè)隨機(jī)值。目前樹葉落地就是這樣了。
Collision

????????碰撞模塊碰到了一些問題,之前碰撞采用GPU?距離場(chǎng)的,但是這種會(huì)隨著碰撞次數(shù)增加會(huì)Kill掉樹葉,你就會(huì)發(fā)現(xiàn)有些葉子會(huì)莫名其妙消失。打開一看,里面東西太多了,又偷懶不想自己寫或者修改。就用Analyticals Plane湊活著用,這樣粒子就不會(huì)莫名其妙消失了。
????????其他的都是系統(tǒng)已經(jīng)有的,模塊加上去改改參數(shù)就行了,像Areodynamic Drag我都基本用的默認(rèn)參數(shù),官方默認(rèn)的參數(shù)效果就不錯(cuò)了。至此樹葉,不對(duì)Niagara就暫時(shí)到這里了。