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

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

在Niagara中基于LBM優(yōu)化流體性能(下)

2023-05-01 22:25 作者:塵星_Star  | 我要投稿

????????悲催,本章開頭就要糾正上篇文章的小錯(cuò)誤。上篇文章提到梯度算子,這個(gè)說法并不準(zhǔn)確。應(yīng)該叫做哈密頓算子或者nabla算子。至于梯度、散度和旋度是另一種概念。由此可見,本篇文章也僅作為參考,因?yàn)楹芏喽际俏覙O其主觀的理解。尤其是接下來涉及官方流體的示例,歡迎大家一起交流。

????????打開官方示例(需要在項(xiàng)目中啟用流體插件才能看到),一條一條往下看??吹阶詈螅瑔为?dú)來看每一條感覺好像懂了。但連起來還是不懂,于是又看一遍還是不懂。然后閑著沒事,數(shù)了下左邊的變量數(shù)目。最多的Emitter命名空間就有200多個(gè)!這么多變量來回捯飭,弄得我頭昏腦脹。沒辦法,只能用其他方法來幫助自己理解。

????????這個(gè)思維導(dǎo)圖其實(shí)只是我理清關(guān)系用的,在后面并沒有多大的用,沒必要去細(xì)看。在之前的研究中,雖然沒有弄明白整體的思路。但能感覺到重心是幾個(gè)官方定義的Grid3D Collection。

????????這樣就能夠大致了解每個(gè)Grid的功能了。SimGrid主要涉及到模擬部分;TransientGrid與邊界有關(guān);PressureGrid與求解壓力梯度有關(guān);LightingGrid與光照有關(guān);ScalarGrid主要用來傳遞參數(shù);Temporary與計(jì)算旋度與散度有關(guān);RasterGrid與旁邊的另一個(gè)發(fā)射器有關(guān)。

????????我們還需要在開始研究發(fā)射器之前再回顧一些基本知識(shí)。我覺得自己描述的不夠準(zhǔn)確,請(qǐng)上GPT為我們講解。Grid3D Collection是一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)在三維網(wǎng)格中的粒子數(shù)據(jù)。它可以看作是一個(gè)三維的數(shù)組,每個(gè)元素(或單元格)都可以存儲(chǔ)一個(gè)或多個(gè)粒子。Grid3D Collection可以用于各種效果,例如體積渲染、流體模擬等。錯(cuò)了不要怪我,甩鍋給AI。在這里,一定要和之前的粒子渲染區(qū)分開來,由于之前我一直把自己的思維拘束在粒子上。導(dǎo)致寫代碼時(shí)的核心邏輯出現(xiàn)巨大偏差。對(duì)于粒子渲染,計(jì)算針對(duì)的是每一個(gè)粒子;而在流體渲染中,計(jì)算針對(duì)的是模擬的一個(gè)個(gè)小方格或者小方塊。盡管有從其他發(fā)射器獲取粒子數(shù)據(jù),但這是不同的。

?????? ? Simulation Stages這里可以看看知乎大佬Feilon的相關(guān)文章,我就簡(jiǎn)單提下。普通情況下,我們需要執(zhí)行兩個(gè)操作A和B。對(duì)于粒子或者Grid Collection來說,A,B它們有的先被計(jì)算,有的后被計(jì)算完成。但是在流體中,我們需要所有對(duì)象A執(zhí)行完了,B需要用到A中得到數(shù)據(jù),才能去執(zhí)行B操作,這個(gè)時(shí)候就需要用到Simulation Stages了。

????????官方設(shè)置了這么多的Grid3D Collection,主要的目的有兩個(gè)。一是模擬和渲染的網(wǎng)格分辨率是不同的;二是數(shù)據(jù)分組可以避免不必要的復(fù)制操作帶來的性能損耗。

????????每一個(gè)模塊我只是簡(jiǎn)單提一下它有啥子用,不然深入講的話,我整個(gè)五一就沒有了,而且有些模塊我自己也懶得深入研究,等要用到的時(shí)候,再去研究。



????????Grid 3D LBM CONTROLS SPAWN

????????Grid 3D LBM SCALABILITY SPAWN

????????這兩個(gè)模塊和官方是一致的,只是稍微調(diào)整了下。主要的目的是將模擬需要調(diào)整的參數(shù)集成在一起。這樣調(diào)整參數(shù),就不用到處找了。

????????然后就是創(chuàng)建SimGrid、TransientGrid、DistributionGrid、LightingGrid、ScalarGrid這幾個(gè)Grid3D Collection,其中DistributionGrid是儲(chǔ)存分布函數(shù)用的。

????????Grid 3D Set Resolution

????????接下來就是設(shè)置各個(gè)Grid3D Collection的分辨率了,這里注意一下分辨率官方是如何設(shè)置的。ScalarGrid是用戶手動(dòng)設(shè)置的,LightingGrid、SimGrid,在繼承ScalarGrid的分辨率的同時(shí)還可以用參數(shù)手動(dòng)調(diào)節(jié)自身的分辨率。

????????Grid 3D Modify Grid Scale

????????在這里進(jìn)行的就是空間的離散化了,數(shù)學(xué)表達(dá)式的dx就是來自這里。但這里還多了幾個(gè)額外的dx_render等,這也是和上面提到的渲染和模擬的分辨率是不同的有關(guān)。有了更多的可操作性。

????????

????????LBM Create Grid Attribute Indices

????????這里就是創(chuàng)建屬性的地方,比如在一個(gè)網(wǎng)格中,我存了一些信息,速度,顏色。怎么才能讓程序知道那個(gè)數(shù)據(jù)指的是速度,那個(gè)數(shù)據(jù)指的是顏色。這個(gè)時(shí)候就是通過屬性索引來讓程序分辨了。在這里官方的命名具有迷惑性,在其他網(wǎng)格創(chuàng)建的索引最后以SimGrid作為前綴命名。當(dāng)然,這只是看待問題的角度不同導(dǎo)致的,并無對(duì)錯(cuò)之分。之前提到過,我們采用D3Q7模型,所以需要7個(gè)索引來存儲(chǔ)分布函數(shù)。對(duì)應(yīng)的屬性數(shù)據(jù)類型是1個(gè)Float,2個(gè)Vector。其他的沒有太多變化。

????????往下看也是創(chuàng)建屬性,并且規(guī)定重力加速度g的數(shù)值。

????????

?????我們把算好的數(shù)據(jù)需要傳遞到Render Target Volume里進(jìn)行渲染,注意這里需要設(shè)置正確的浮點(diǎn)數(shù)精度。

? ?Grid 3D Init RT

? ?這個(gè)就是初始化上面RT的大小,這里是根據(jù)ScalarGrid來進(jìn)行設(shè)置的。

????下面一系列操作和上面一樣,只不過操作的對(duì)象不一樣罷了,也沒有新玩意出現(xiàn),考慮文章篇幅,就不贅述了。

????

????????最后兩個(gè)一個(gè)是設(shè)置Particle Attribute Reader,這個(gè)就是指向旁邊發(fā)射器的。我們每幀需要從哪里獲得源信息嘛。舉個(gè)例子,旁邊的發(fā)射器就是設(shè)置燃料如何運(yùn)動(dòng),至于燃料產(chǎn)生的煙霧,燃燒的火焰如何運(yùn)動(dòng)就是這個(gè)發(fā)射器做的事。

????????還有一個(gè)是Debug用的,不要小看Debug了?。?!如此多的模塊。做的時(shí)候,一個(gè)字母打錯(cuò)了,一個(gè)邏輯沒想明白。系統(tǒng)就不會(huì)正常運(yùn)行,這個(gè)時(shí)候沒有做好Debug,想要解決問題,難度極其極其之大。雖然為了篇幅原因,我自己也偷懶不會(huì)過多介紹這方面內(nèi)容,但這一部分說是整個(gè)發(fā)射器最重要的部分也不為過。大家可以仔細(xì)研究學(xué)習(xí)。

????????

????????LBM GAS CONTROLS UPDATE

????????Grid 3D GAS SCALABILITY UPDATE

????????這個(gè)我改來改去還是和官方一樣的,忽略命名不同。主要就是調(diào)節(jié)流體的美術(shù)效果用的。

????????Sourcing Comp Modes

?????這里的CompModes是與下面Sourcing的Simulation Stages搭配使用,就是處理速度,溫度與密度的值。要三種方法可選,直接相加,取最大值,和一個(gè)給定閾值取其中之一,不同方式會(huì)有不同的美術(shù)表現(xiàn)。

????????接下來就是時(shí)間的離散化了,dt。官方有兩個(gè)可選,一個(gè)就是自己設(shè)置;一個(gè)用系統(tǒng)的DeltaTime。我就沒搞那么復(fù)雜,直接用系統(tǒng)的,然后乘以一個(gè)變量方便控制。

????????Grid 3D Create Unit to World Transform

????????進(jìn)行坐標(biāo)轉(zhuǎn)換,涉及到常用的世界空間,本地空間;以及對(duì)應(yīng)Grid3D的坐標(biāo)空間。這些都是方便數(shù)學(xué)計(jì)算用的。然后賦值給變量,后面可以直接使用。

????????Grid 3D Set Bounds

????????設(shè)置模擬空間的邊界。

????????Grid 3D Rigid Mesh Find Colliders

????????根據(jù)User傳遞來的模型,進(jìn)行碰撞體的查找。防止流體拖進(jìn)場(chǎng)景就產(chǎn)生交互,官方設(shè)置了Tag,只有名為collider的Tag才會(huì)產(chǎn)生交互。

???

?????

?????????這個(gè)Position是與Mesh Render里的Position Binding聯(lián)系起來的,官方直接設(shè)置的GridCenterPosition。但是疑似由于官方引入Position類型用于區(qū)分Vector導(dǎo)致我怎么也無法將GridCenterPosition直接綁定到Position上,只好這樣解決了。

?????????

?

????????接下來就是一系列初始化Grid3D Collection。這里首先注意子命名空間的用法,就是指明變量向那個(gè)Grid3D?Collection寫入數(shù)據(jù),這里寫自定義的時(shí)候,要注意寫法首字母大寫,不要有任何其他的符號(hào),包括空格。我在這里也卡很長(zhǎng)一段時(shí)間。最后發(fā)現(xiàn)自己多打了一個(gè)空格才拖不進(jìn)去,內(nèi)心有些小波動(dòng)。

????????迭代源是數(shù)據(jù)接口,和之前提到計(jì)算對(duì)象是Grid3D中的每一個(gè)格子而不是粒子聯(lián)系起來了。當(dāng)涉及數(shù)據(jù)寫入的時(shí)候,一定要確定寫入的對(duì)象和數(shù)據(jù)接口是一致的,像上面的DistributionGrid就不能換成其他Grid。我測(cè)試了一下,涉及數(shù)據(jù)讀取倒沒有非常大限制只要有數(shù)據(jù)就行。執(zhí)行的行為,只要涉及初始化的選擇在模擬重置時(shí)執(zhí)行(On Simulation Reset)就可以了。后面其他的模擬階段選擇Not?On Simulation Reset后面我就不再重復(fù)提及了。

????????Grid 3D Gas Particle Scatter Source

????????這里就是從旁邊的發(fā)射器獲得數(shù)據(jù),并且將數(shù)據(jù)傳到RasterGrid里了,這個(gè)里面有些復(fù)雜,可以多花點(diǎn)時(shí)間看看如何傳遞數(shù)據(jù)的。

??????????

旋度計(jì)算

????????接下來就是和官方示例有不同的地方了,官方在這里初始化TemporaryGrid然后計(jì)算了旋度。由于使用LBM,所以我們不需要,直接跳過!

????????

????????我們直接開始模擬速度的預(yù)處理,Pre Sim Velocity。

????????Grid 3D Resample Float

????????從ScalarGrid獲得密度,溫度數(shù)據(jù),給到臨時(shí)類型變量。這種類型的變量正如名字一樣,轉(zhuǎn)瞬即逝,每一幀都可以不一樣。

????????Grid 3D Compute Boundary

????????這個(gè)計(jì)算邊界的,里面好復(fù)雜。我大概看了下,最后輸出的Boundary。0代表流體單元,1代表固體單元,2代表空單元。

????????下面那個(gè)是與固體速度有關(guān)的,跳過跳過,浪費(fèi)性能。

????????接下來一大堆節(jié)點(diǎn)都是計(jì)算外力的影響,比較有意思的是計(jì)算RadialForce,這個(gè)力的方向是格子與中心(默認(rèn)0,0,0)的連線方向是一致的。這一部分就解決了流體方程關(guān)于外力的影響,后面計(jì)算的時(shí)候,就不要想著,唉,我重力還沒算了。因?yàn)槎荚谶@個(gè)部分解決了。最后算好的速度通過變量寫入到SimGrid中。

????????

?

???????首先獲得速度,而后將值給到臨時(shí)變量里,這里如果開啟Debug,值就會(huì)變?yōu)?。然后采樣RasterGrid所有屬性,全部拿來吧你。在賦值給變量的時(shí)候,有不同的操作。

????????在Grid3D中,數(shù)據(jù)的寫入和讀取是比較特別的,讀取的是初始值,或者理解為上一時(shí)刻,上一幀的值。經(jīng)過一系列的計(jì)算,我們寫入的是修改后的值,我們不能在同一個(gè)Simulation Stages里讀取我們修改后的值。這是我比較主觀的理解,如有理解偏差,希望大家指出來。

????????所以可以看到速度,密度和溫度是采用之前提到過的ADD模式疊加來的,而Alpha和RGB采用其它方式處理的。

????????Grid 3D Gas Init?沒用到,跳過。

????????然后從TransientGrid獲得Boundary信息,最后寫入ScalarGrid的值都要和Boundary進(jìn)行一次判斷,如果是0即流體單元才傳值,否則就是0。

????????這里是對(duì)速度進(jìn)行平流,一般來說,對(duì)于流體格子。我們考慮格子里面的流體要到哪里去,但這樣在數(shù)學(xué)上會(huì)出現(xiàn)問題。所以我們考慮當(dāng)前的流體從哪里來,即逆向思考。如果不好理解的話,可以簡(jiǎn)化問題考慮最簡(jiǎn)單的情況然后用數(shù)值計(jì)算幫助理解。后面的Grid 3D Set Value說實(shí)話這一塊我也不太清楚為什么這樣做,官方寫的注釋也只是提到為解算做準(zhǔn)備。希望大佬能指出來。好在并不影響其他東西,這個(gè)先暫時(shí)擱置一下。

????

計(jì)算散度

????????????在求解之前,官方又計(jì)算了一次散度。我們不用,直接跳過。

????????而后官方就是進(jìn)行了壓力求解,而且還算了6遍,LBM在這里也只是算一遍。簡(jiǎn)單提一下官方的求解吧。一般來說,求解壓力我們可以想象數(shù)值不斷地向正確值逼近,每算一次值會(huì)向正確值逼近一點(diǎn)。每次前進(jìn)的距離是有限的,我們當(dāng)然希望它逼近的速度快一些,所以就有了SOR方法,引入權(quán)重,這個(gè)權(quán)重會(huì)隨著每次計(jì)算還不斷改變。權(quán)重的初始值的選取也不能太離譜,否則會(huì)離準(zhǔn)確值越來越遠(yuǎn),導(dǎo)致不能收斂。在此基礎(chǔ)上,還用了紅黑高斯-塞德爾迭代解法進(jìn)一步加快速度。這個(gè)方法我還沒詳細(xì)研究,就不多提了。

????????至此,就可以感受到在計(jì)算上有多大的提升了。


????????

????????首先從SimGrid獲得速度與密度,其實(shí)密度到后面沒有用到。之后會(huì)詳細(xì)解釋的。

????????終于到LBM了,再回顧一下重要式子。

????????平衡分布函數(shù):

????????f_i%5E%7Beq%7D%20%3D%20w_i%20%5Crho%20%5Cleft%5B%201%20%2B%20%5Cfrac%7Bu_i%20%5Ccdot%20v%7D%7Bc_s%5E2%7D%20%2B%20%5Cfrac%7B(u_i%20%5Ccdot%20v)%5E2%7D%7B2c_s%5E4%7D%20-%20%5Cfrac%7Bu_i%20%5Ccdot%20u_i%7D%7B2c_s%5E2%7D%20%5Cright%5D

????????碰撞后的分布函數(shù):

????????f_i%5E%7BCol%7D%20%3D%20f_i%5E%7Bin%7D-k(f_i%5E%7Bin%7D-f_i%5E%7Beq%7D)

????????與宏觀的聯(lián)系:

????????%5Crho%20%3D%5Csum%5Cnolimits_%7Bi%7Df_%7Bi%7D%20

????????%5Cupsilon%20%3D%5Csum%5Cnolimits_%7Bi%7Df_%7Bi%7D%20u_%7Bi%7D%20%2F%5Crho%20

????????

????????我把代碼盡量寫好注釋。

????????

?????????其它的和官方的沒什么不同。

????????這里還需要注意權(quán)重和平衡函數(shù)的計(jì)算,權(quán)重如何取值。涉及到公式的推導(dǎo),我試著推了一遍,可始終有個(gè)2沒有消掉,只能拿出結(jié)論來用。這個(gè)部分可以看書。上面的代碼是按照格子速度與聲速的平方比為4算的。如果按照3來算,把數(shù)據(jù)帶進(jìn)去我看了下好像肉眼看不出來有啥子區(qū)別。平衡函數(shù)這里我直接把密度變?yōu)榱顺?shù)1,一開始這里本是Density,但是運(yùn)行起來總是一開始有流體,后面就消失了。當(dāng)時(shí)這里卡了很長(zhǎng)時(shí)間,后來想想,density變?yōu)槌?shù)1。舉個(gè)例子,一個(gè)墨水瓶掉進(jìn)湖里,里面墨水經(jīng)過一段時(shí)間肉眼就看不到了,常數(shù)1意味著違背了物質(zhì)守恒,這個(gè)墨水瓶源源不斷的冒出墨水,無窮無盡,所以始終看得到墨水。

????????

??

?????????得到碰撞后的分布函數(shù)就可以得到我們想要的流體的宏觀速度了。

?????

??

?????????其他的和官方一樣了,只需要把得到的速度(OutVelocity)和官方的壓力梯度替換就行了。

????????Dissipate Vector(Float)

????????控制變量更快的消散(趨向于0)

????????后面我沒有進(jìn)行任何修改,只是替換了自己改的模塊的變量。后面就是對(duì)Scalar中的溫度和密度進(jìn)行平流,還有光照的相關(guān)處理,最后把結(jié)果給到RT上。

????????

??

????????材質(zhì)這一塊就是和官方一樣的,官方將材質(zhì)里的變量和Niagara中綁定到一起。然后材質(zhì)中比較重要的是一個(gè)宏,MARCH_SINGLE_RAY_EMISSION,該宏可能是一個(gè)體積光線追蹤的方法,這里我就沒有往下研究了,用到了再去深入吧。

????????最后提一下如何調(diào)節(jié)美術(shù)表現(xiàn)吧,這里可以了解蠟燭燃燒的過程。首先最上面白煙或者黑煙的是沒有燃燒充分的燃料,這個(gè)顏色可以通過線性顏色重采樣。中間的黃色部分是黑體輻射,這個(gè)也可以用線性顏色重采樣。最下面的藍(lán)色部分是電子躍遷產(chǎn)生的,好像不用考慮。? ??

????? ?

????????


? ??

????????

????????


????????

????????

????????



在Niagara中基于LBM優(yōu)化流體性能(下)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
眉山市| 斗六市| 凌海市| 阿克陶县| 嫩江县| 赣榆县| 卢龙县| 松溪县| 兴安盟| 康马县| 浦县| 东阳市| 新泰市| 云龙县| 化隆| 修武县| 山阳县| 黄大仙区| 桓台县| 九龙县| 都兰县| 敦煌市| 辽中县| 岱山县| 阜新市| 资阳市| 南雄市| 汉川市| 商城县| 仁寿县| 三门县| 大洼县| 中江县| 安龙县| 红安县| 石屏县| 西宁市| 辽宁省| 武川县| 射阳县| 行唐县|