背景
經過以前的幾篇分析實踐,已經基本打通了UE4的Houdini植被管線部分,並對Far Cry5(簡稱FC5)的植被系統的需求作了整理,在接下來的幾節中,會關注於如何使用Houdini基於UE4來開發相似FC5的植被生成系統。這裏按工具製做流程分爲幾個部分來作闡述。
- 使用Houdini開發相似FC5裏的Generate_Terrain_Entities的HDA節點
- 修改Houdini Engine,讓Generate_Terrain_Entities的Input和Output能夠支持在UE4裏生成植被
- 進一步優化Houdini Engine,可讓關卡設計人員能夠在UE4 Editor裏更加靈活和方便的修改
本節的目標就是如何開發一個
Generate_Terrain_Entities的HDA節點,並在Houdini裏實現相似上圖中FC5的效果,大體流程分爲:
- 建立HDA面板,爲內部的過程化實現建立參數關聯
- 根據Viability中選擇Terrain Data以其餘的過程化生成的2D data,肯定植被的生成範圍
- 根據Density,Sizes,Scale,Color,Rotation等面板參數,來生成Point Colud,以及Point對應的旋轉,顏色,縮放等信息。
- 多個HDA鏈接,每一個HDA表明一種植被類型。並實現按照Viability範圍和優先級的選擇正確的Species。
- 根據最終的PointCloud,用Copy to Point節點作植被的Instance化
面板製做
首先要作的,是建立一個
Generate_Terrain_Entities的SOP節點,而且HDA的參數面板和Input/Ouput,這裏先建立一個SOP節點,
參考FC5,建立一個相似的
Generate_Terrain_Entities的參數面板和Input,Output的輸出。
參數面板就和FC5文檔裏介紹的同樣,具體作法就很少作敘述了,稍微有些Houdini經驗的美術均可以實現。
參考FC5把Input Laber 設置爲2個,Output爲3個,Input Output接續的數據在下圖有註釋。這樣把每一個Speices連接連接在一塊兒,具體如何起做用的在後文會有介紹。
複製完參數面板後,就是要實現根據參數來生成植被的Point Cloud信息的功能了,在以前管線裏已經提到過,Point Cloud是使用Scatter節點,基於Heightfiled Mask的信息來生成的。接下來的目標就是如何根據植被系統的設置,正確的生成所對應的Mask。
肯定生成區域
FC5的植被系統的生成區域來源主要是兩部分,一個是基於地形數據生成的各類Mask數據,例如AO,Flow,Slope,這些Mask一般肯定植被會生長在哪些區域,
另一種就是直接導入的2D數據,好比場景美術手繪的區域,以及一些在引擎裏經過其餘的過程化工具生成內容,好比街道,水塘的Mask,保證這些區域不會有植被放置。
把這不一樣Mask的組合根據規則和麪板參數作數學組合,就得出最終的生成區域結果,這裏簡單的介紹下如何使用VEX腳本結合Houdini的節點來實現功能。
首先是
AO,Flow,Slope,Direction(Sun or Wind)等Terrain Abiotic Data的生成,這些大部分能夠用Houdini自帶的節點來生成
Altitude能夠直接讀取height信息,但由於一些特殊的緣故,height的最低值並不必定爲0,這裏使用了一個Python節點,調用terraintoolutils.computeInputRange的函數來得到height的範圍
這裏增長一個altitude的Attribute的Ramp,用來獲取制定範圍內的高度信息
在
Generate_Terrain_Entities內部,在名爲Mask的SubNetwork裏主要作這些各類Mask的處理工做
這個示例Vex代碼裏,迭代每個Attribute的Ramp的Mask,而後合併到一塊兒。爲了簡化有些功能沒實現到Vex裏,好比每一個Attribute的Toggle開關和Power值的判斷,不一樣的Attirbute,例如Altitued還要作一些特殊處理等等。另外FC5能夠支持多組Combined Data後的Data Group再作二次Combine。最終會是雙重循環的形式。
下圖的效果就是隻有一個
Altitude(Height) Attribute的效果。
接着,在單獨加入一個Slope的Attribute的效果
最後獲得兩個Attribute合併的效果。
這樣,houdini的生成區域的基本功能就完成了,後面就能夠參考FC5,基於flow,direction等信息,製做出不一樣的植被生成區域的pattern
除此以外,FC5中還有一些用過程化工具生成mask要作爲exclusion區域來使用,
好比這裏把生成water的區域,做爲
exclusion mask。
把exclusion mask做用到Alittude Attribute上,
就獲得了
exclusion後的結果。
除此以外還有Noise,FC5的Noise的Size是受地形法線影響的,這根據Volume中height的位置,來取得height mesh裏對應的Point的Normal,根據Normal的Y值來控制生成Noise的Size。
這樣,不一樣坡度的噪聲大小也不一樣。下圖就是water和altitude attribute以及noise共通做用的結果。
最後獲得的Mask,就是對應的植被生成區域。接下來就要根據Mask,來生成植被的Scatter Point Cloud了。
生成Point Cloud
基於HeightFiled Mask來生成Point Cloud,一般使用HeightField Scatter就能夠實現,
而FC5的植被系統裏,仍是要考慮植被的Size和Age參數,來肯定最終的Point Cloud,這裏使用下面兩個Attribute的Data Group來做爲植被的生成信息
下圖就是獲得的Viability的信息。
接下來,須要把V
iability Mask用SDF的方式轉爲Age的mask
經過convertvolume和isooffset節點,用SDF方式從新生成Age Mask
接下來,經過Density面板,來配置密度,而後把Density寫入到HeightFiled的Mask裏(也能夠本身新建一個volume來保存)。而經過Density Ramp來控制不一樣Size植被的密度值,也就是Age(Mask)越小的外圍的小樹,密度越高,而Age(Mask)比較大的樹林中心的大樹,密度會比較小。
把Density值做爲Density Attriube傳入到Scatter節點,同時輸出Point的Radius屬性。
這樣就獲得了初步的Point Cloud,以及對應Point的Size,Pscale的信息。
而後,經過Size面板,設定不一樣等級的植被的具體大小。
以及對應的植被的顏色值。
就獲得了帶有具體Color和Transform信息的Point Cloud.
再經過Copy to Point節點,用Debug Tree進行測試,這樣就獲得了一種植被的Scatter結果。能夠看到Age信息外圍顏色較淺的樹木密度相對較大,尺寸也較小,而Age信息內部的顏色較深的樹木則尺寸比較大,散佈的也相對稀疏一些。
這樣,一種植被的生成功能已經初步完成,但生態系統裏,仍是要考慮多種植被的共通生長的競爭關係。以及同一種植被之間的競爭關係。這就須要實現FC5裏經過對
Viability Radius的判斷來選擇Species的功能。
根據Viability選擇Species
FC5使用的方法,是根據
Viability Radius和Viability強度,來肯定一個範圍內生成哪一種植被。
這個實現也比較簡單,先獲取一個Point Radius範圍內的所有Point,把Viability相對較小的剔除掉就能夠了。
這樣,在以前的演示的植被效果下面,再增長一個HDA節點。生成Species B
Species B的生成信息以下。
這裏
Species B的Viability值比
Species A要高
這樣,
Species B和Species A混合在一塊兒後,Species B會把Viability Radius裏的Species A剔除掉
增長密度後,2種植被的佈置效果。
最後像FC5這樣,把地貌的生態環境中的每種特定位置的植被用HDA文件一一描述再串聯起來,就能夠構成區域複雜的植被體系了。
總結
這樣,就初步實現了FC5的
Generate Terrain Entities的基礎功能,但欠缺的地方仍是不少的。
- Density,Size,Age等參數使用以及規則上,須要去對應最終的遊戲世界的尺寸作修改。
- 如何更優雅的與UE4的FoliageSystem結合,須要再Houdini Engine裏作進一步的擴展
- 算法上的調試,優化,也須要基於具體的製做示例來進行
- 像Rotation,TerrainData的輸出,在以前幾節有過介紹,在後文與UE4的整合裏也會有進一步的改進。
在下一節裏,在介紹如何使用
Generate Terrain Entitie在UE4裏製做效果的同時,進一步的優化和改進
功能。