本教學將介紹如何利用 Vexrtex color 結合 Vertex Paint 讓你可以自由地決定物體上何處要燃燒起來。想要製作寫實的火焰,必須能同時渲染煙與火,加上以 Particle shader 渲染粒子表現出燃燒時產生的細小灰燼。我們也將介紹如何以 resimulation 的流程進行變速,以產生慢動作的火焰。
1. System Unit 場景單位
選擇適當的尺度,本例製作燃燒的椅子,因此我們採用公分作為系統單位。
本例中的椅子長寬高約為53x62x113 cm
2. 動畫長度設置
至 Time Configuration 將動畫長度設定為60
3. Overall layout 整體配置
場景中有一張椅子的模型。一個 Phoenix FD Simulatior (PhoenixFDFire),一個 PHXSource (拾取椅子模型作為來源),一個 PlainForce 作為風力,一個 Particle Shader (PHXFoam)用來渲染灰燼的粒子,一個 VRayPlane 作為地面。場景中沒有其他人工照明,只有當火焰燃起時會自然照亮椅子與地板。
4. 使用Preset快速預設
為了節省設定的時間,我們先選中椅子幾何體,接著按下 Phoenix FD 工具列上的 Burning Fuel with Smoke sim 快速設置按鈕。如此會在場景自動產生一個 Simulator,一個 PHXSource,並設定好煙霧火焰的 shader,設定好一個 Particle Shader。我們根據這個設定再進行修改,以穩合當前專案的需求。
5. Output 輸出通道
Backup Interval
– 設定多少 frame 間隔備份完整的模擬狀態 這樣你可以在模擬中斷時,使用Restore接著模擬。當你把 Backup Interval 設為1時,代表你可以在每一個 frame 回復模擬,當設定為0時就不會輸出任何備份的 frame。預設為15,這表示模擬時產生的 cache 序列,因此每15間隔的 frame 其 cache 檔會比其他的 cache 要大很多; 由於備份會增加硬碟空間 這裡我們把 Backup Interval 設定為0
Output Grid Channels
– 本例要渲染火焰與煙,因此要輸出 Temperature 與 Smoke。我們也將使用 Resimulation 來使火焰變慢,所以勾選輸出 Velocity 通道。
6. Source發射器
如上圖設定,拾取場景中的 chair 做為發射源。Emit Mode 設定為 Surface Force,表示火焰會自椅子模型表面噴發出來。Outgoing Velocity 設定為400cm,你可根據需求調整。Smoke 數值為1.0。Particles 設定為2.5。記得勾選 Export Drag Particle IDs,否則當你改變 Playback Speed 時,可能會出現以下錯誤資訊:
在 Outgoing Velocity 的 Mask 中放置紋理貼圖,以侷限椅子的火焰發射範圍,以下詳述做法:
如果 Outgoing Velocity 沒有設定 mask,就會得到上圖的樣子,整個椅子燒成一大團火焰,沒有足夠的細節表現。
首先,我們選中椅子模型,然後套用一個 VertexPaint modifier。會出現上圖左邊的 VertexPaint 介面,我們把顏色改成全黑色,然後用油漆桶讓整個椅子都顯視為黑色。
然後把顏色改成白色,以筆刷工具在椅子上刷出你想要燃燒的部位。Size 可以控制筆刷的大小。
在材質編輯器中,產生一個 VRayCompTex,在其Source A中放置 Vertex Color,Source B放至 Celluar 程序性紋理,這兩者以 Multiply(A*B)混合。
Vextex Color 的 Sub Channel 選擇 Red 或 Green
Cellular 的 Size 設定為2.0; Spread 設定為0.25。我們對 Celluar texture 的 X offset 設定關鍵影格: 0 ~60 frame,數值設定為 X offset 0 ~5,如此發射源的遮罩才會不斷移動,可讓火焰的動態更自然。
可至 Curve Editor 中檢視,x offset 由0~60 frame 數值由0線性增加到5
為了檢視 VRayCompTex 產生的 mask 看起來像如何,我們暫時使用一個 3dsMax Standard 材質球,並在 Diffuse 中與 Self-Illumination 中都加上已經製作好的 VRayCompTex。勾選 Color。套用這個材質到椅子上。
Render 出來的效果如上圖,Vertex Color 表現 VertexPaint 繪製的白色區域,然後 Celluar則是讓遮罩有更多細節。
待 VRayCompTex 設定好後,將其拖曳並 Instance 至 PHXSource 的 Outgoing Velocity 下方的 Mask – Texmap 旁邊,這樣一來,發射源的 Outgoing Velocity 就受到 VRayCompTex 所調節。
7. Particle Shader 粒子著色器
在先前的步驟中,Burning Fuel with Smoke sim 快速設置已經替我們在場景中設定好了一個 Particle Shader。你也可以手動產生 Particle Shader。
在 Phoenix FD 工具列中,點擊 Particle Shader 圖示,並在場景中拖拉出一個 Particle Shader。
在 Particle Systems 中拾取場景中的 PhoenixFDFire001,Mode 使用 Points。Color 設定為亮橘色 (255,120,0)。Diffuse Multiplier 設定為4.0
8. Force 外力
為了產生寫實的燃燒效果,我們添加一個外力,模擬風吹火焰的動態。
到 Create Panel 中,Helper。按下 PlainForce 並在場景中拖曳出一個。
利用 3dsMax 旋轉工具,旋轉 PlainForce 使其指向右方,如此一來讓火焰模擬時,有個由左朝右吹的風力。Strength 設定為400.0 cm。
9. Simulator 流體模擬
-Grid 大小範圍
前面我們已經透過 Phoenix FD 的 quick preset 產生 Simulator Grid (PhoenixFDFire)了,但是我們還要根據專案需求來調整。如上圖箭頭所示,初始的 Grid size 設定在紫色的範圍,正好包住椅子 vertex paint 的白色範圍。如上圖,本範例使用的 Cell Size =0.669 cm,開啟 Adpative Grid,設定為 Smoke,讓範圍擴張到紅色的框框。這樣的設定可以節省模擬運算資源。
-調整 Scene Scale 場景尺度
由左至右 Scene Scale = 0.2, 1.0, 1.5 , 5.0。儘管椅子的模型是根據真實的尺度建模的,本例我們使用 Scene Scale = 1.5 模擬。讀者可以根據美感需求來決定使用多大的 Scene Scale 數值。
-Dynamics 動態
Time Scale 時間尺度。一般來說,比實際速度稍慢的火焰會比較好看,本例中我們採用 Time Scale = 0.6
Smoke Dissipation煙的消散度。我們採用0.3 希望煙產生後早一點消散開
左圖: 使用 Burning Fuel with Smoke sim 快速設置的 Vorticity 與 Randomize 參數; 右圖: 為了避免火焰產生過多的細節,我們將 Massive Vorticity 與 Randomize 中的所有參數都設為0
Conservation 守恆。Phoenix FD 提供四種守恒的方法,各有其優缺點
由左至右: 使用 Direct Symmetric,Direct Smooth,Buffered,PCG Symmetric。本教學選擇使用 Buffered 作為守恒的方法。
平流過程(advection process)使流體沿著其在網格內的速度移動。所有基於網格的模擬器(grid-based simulators)的問題是,將一個單元格的內容移動到網格中的新位置,而這個位置在單元格與單元格之間會得到模糊的結果,從而失去每個新幀的細節。Phoenix FD 提供四種不同的對流方式來對抗這個問題,每種方式都有其利弊,取決於場景不同情況。
Phoenix 可以每幀執行一次以上的平流(advection)。數值越低可獲得大量細節。 另一方面,較高的SPF可以得到更穩定和平滑的結果。
Material Transfer。由左至右 Backtrace, Forward transfer, Multi-Pass。
Material Transfer / Steps per Frame (SPF)
使用 Multi-pass 方法。由左至右SPF =1, 2, 3。SPF越高,模擬時間越久,火焰越平滑。本例中使用SPF =3。可依照您的喜好決定。
Quality 由左至右 = 0, 10, 40, 100。這個參數可增加守恒程度。當液體或煙霧量減少時,或者需要增加煙霧的渦流時,這個參數會有幫助。注意 Quality 數值會減慢模擬速度。您可以將此參數視為守恒傳播速度影響的距離範圍。本教學中椅背高度約為100個 voxel,我們使用 Quality = 40以獲得適當的品質。
Rendering / Steps。指定相機射線的射線前進步驟(ray marching step),單元大小的百分比。 由於渲染器通過模擬器追踪射線,此值控制從網格獲取信息的頻率。 如果這個值超過100,將開始跳過一些單元格,並可能導致錯誤。 如果使用特定的透明度曲線來渲染體積,則可能需要較低的百分比,以免遺失細節。 另一方面,增加這個值會提高渲染速度。
Steps數值超過100時開始跳過一些單元格,這個現象可以透過GPU預覽直接在 Viewport 觀察到,例如箭頭所指火焰中的空洞。數值越大,空洞越明顯。
GPU Preview 預覽
勾選 Enable in Viewport 則可以在viewport直接預覽火焰
請注意,如果要預覽煙霧的話,則必須再勾選Lighting
Volumetric Render Settings 控制體積渲染。勾選 Emit Light,當產生火焰時會照亮場景,Light Resolution 控制燈光的解析度
light resolutions 由左至右為1, 5, 50, 100。這個參數指定光柵網格(light grid)的分辨率,以 fire grid 的百分比作為單位。通過在每個火焰單元(fire cell)中放置一個 Omni 燈可以實現完美的火焰照明效果,但這可能需要大量的時間來渲染,通常不需要精確地估算火焰的照明就能產生令人信服的效果。基於這個原因,Phoenix FD 在內部創建了一個單獨的 light grid,其分辨率可以低於 fire grid,並且這個 light grid 在每個單元中都有一個 Omni light。較低的分辨率(因此較少的 Omni lights)雖然會損失某些照明細節,但可加快渲染速度,而這些細節不見得看得到。當數值為100時,light grid與fire grid 具有相同的分辨率。這個值越小,光照越平滑,渲染速度越快。然而,當數值非常低時,火焰可能不會與在煙霧上投射的光線融合的太好。本教學採用 light resolutions = 5%
Fire Opacity Mode的比較
由左至右: Fully visible, Use Own, Use smoke opacity。本教學我們使用 Fully visible 做為火焰的不透明度模式。
Color and Intensity 顏色與強度。我們可以手動調整出顏色漸層與曲線,或者可以load載入事先儲存好的設定檔。
到 Rendering 下方的 Render Presets 按鈕按下 Load from file
載入之前儲存 tpr 檔案
10. Retime 變速
模擬完畢後 假設我們希望火焰的速度更慢 可以透過 Phoenix FD Resimulation 配合 Output 的 Play speed,讓火焰降速
-首先我們先變更動畫長度,假設原本動畫長度為60,若 Resimulation 後 Play speed 設定為0.5,代表總長度會變成兩倍,60×2 = 120。因此我們先把動畫長度改成120
到Time Configuration / Re-scale Time,將 Length 由60改為120
– 接著,為了避免在 resimulation 的過程中遺失細節,我們要把 Step Per Frame 由3改為1。
-勾選 Grid Resimulation 下方的 Enable,Particle Resimulation 也勾選 Enable 。勾選 Use Time Bend Controls,Time Bend Method 設定為 Slow Down。按下 Start 再次模擬。因為我們的目的不是要增加解析度,只是要減慢火焰而已,所以 Amp. Resolution 設定為0.0,Wavelet Strengh 也設定為最小值0.01。
注意當你當勾選 Grid Resimulation Enable 時,Phoenix FD 就會切換到 Resimulation 的 cache,不需要手動切換撥放的 cache
到 Input 中,將 Play Speed 由原本的1.0改為0.5。Frm. Blend 設定為 Velocity
按下 Start 開始進行 Resimulation,得到的結果便是慢速火焰的效果了。
11. 燈光與攝影機
由於本範例利用火焰本身做為照明,因此場景不打任何燈光
以上是本教學所使用的攝影機參數
12. VRay Frame buffer
我們在 V-Ray frame buffer 中對火焰的顏色,對比做細調。開啟 Lens Effect 並勾選 Bloom effect, Glare effect 可得到更寫實的火焰效果。