UnrealEngine4HairStrandPlugin開發(fā)日志
來源:
未知 |
責任編輯:傳說的落葉 |
發(fā)布時間: 2019-06-13 08:20 | 瀏覽量:
這篇文章介紹了HairStrandPlugin的立項和大體思路。
HairStrandPlugin總覽
HairStrandPlugin可以用來實現(xiàn)毛發(fā)的設(shè)計、模擬和渲染。
效果查看:傳送門
在目前來說,該插件可以使用Maya進行發(fā)型的設(shè)計,將發(fā)型導入UE4后便可以直接進行發(fā)絲的模擬和渲染了。
使用教程:傳送門
墻內(nèi)用戶請訪問:傳送門
目前工具鏈的適配方面還有一些小問題,但是總體上不影響使用。
HairStrandPlugin的立項
HairStrandPlugin在一個月前立項。在練手插件GhostMeshPlugin完成后,我便開始了HairStrandPlugin的開發(fā),將代碼托管于coding.NET平臺之上。
小廠商的情懷
針對于發(fā)絲的模擬,各大游戲廠商都已經(jīng)做的不錯,例如愛麗絲瘋狂回歸中愛麗絲的發(fā)絲,古墓麗影中勞拉的發(fā)絲和最終幻想15中的發(fā)絲等均為高質(zhì)量的發(fā)絲表現(xiàn)。
但是可惜除古墓麗影的TressFX已經(jīng)開源外,我們這些小廠商也無法窺探到發(fā)絲技術(shù)的奧秘。又因為我當前所參與開發(fā)的項目隱龍傳:影蹤里主角陸天源也是長發(fā)造型,因此我便開始了這個項目,希望能夠讓沒有太多背景的游戲開發(fā)者也可以在UE4上實現(xiàn)發(fā)絲的渲染。
Nvidia Hairworks
實際上,Nvidia也已經(jīng)推出了Hairworks,專門用于毛發(fā)的渲染,而且效果相當不錯。但是以來Hairworks采用的是基于DirectX 11 的Tessellation技術(shù),換句話說,無法在移動平臺和Play Station平臺上使用。
另一方面,由于Nvidia Hairworks只公開了PC版本的庫,因此針對于其他系統(tǒng),Hairworks無法適配。
Apex Cloth
Apex Cloth是Nvidia推出的可以用于布料的模擬的工具,并且已經(jīng)集成在UE4里面了。實際上在該插件還未完全實裝的情況下,時至今日隱龍傳:影蹤也是正在使用Apex Cloth進行發(fā)絲的模擬??墒茿pex Cloth在模擬發(fā)絲上還是有一些短板:
不支持移動平臺,換句話說在Android平臺上無法正常工作。
布料與發(fā)絲還是有差別,例如在Apex Cloth上的布料不會回彈。因此使用Apex Cloth模擬的發(fā)絲在表現(xiàn)發(fā)型上略不適應(yīng)。
Apex Cloth與UE4中的Skeletal Mesh完全綁定,換句話說一個Skeletal Mesh只能綁定一個類型的布料,該布料的信息無法在runtime進行調(diào)整。假如角色從陸地進入水中,布料阻尼damp無法進行調(diào)整,因此在水中的表現(xiàn)將會很怪異。
開發(fā)過程
到目前為止的開發(fā)過程大致可以分為兩塊:Particle Simulation和Strand Mesh Build。
初期針對于發(fā)束粒子進行Physical Simulation、Collision Detection和Constraint Solve。
然后利用結(jié)算得來的粒子進行樣條插值,從而將發(fā)絲構(gòu)建出來。
Particle Simulation
針對發(fā)束粒子來說,整體的模擬分成力場模擬、碰撞檢測和約束迭代。
重力&風力模擬
在HairStrandPlugin中,我采用的是帶有阻尼的Verlet Integration來進行模擬:
x(t+Δt)=x(t)+(x(t)−x(t−Δt))∗damp+aΔt2
在上面的公式中,damp為阻尼系數(shù),阻力越大則該值越小。而a則是該粒子在該處的加速度,重力、風力或者水流等都可能影響這個值。
關(guān)于Verlet Integration,我在之前的一篇博客Unreal Engine 4 —— 可交互繩索的構(gòu)建也提到過。
碰撞檢測
目前的發(fā)束例子只進行了球形的檢測,檢測方法很簡單:檢測發(fā)束粒子與球心的距離,若距離小于半徑r,則將改粒子推到球面即可。
約束迭代
針對于約束,目前來講分為Global Constraint Solve和Local Constraint Solve。Global Constraint Solve用于保持發(fā)型,Local Constraint Solve用于處理兩個過遠的粒子。
總體來講還是不難。
Strand Mesh Build
Strand Mesh的構(gòu)建經(jīng)歷了一些風波。
LineMesh
最開始的時候我打算使用LineMesh來進行發(fā)絲的模擬:
Mesh.Type = PT_LineList;
1
1
但是使用這種方法所構(gòu)建的發(fā)絲所需要的圖元數(shù)量太多,消耗不起。
TriangleList
因此最后還是決定了使用TriangleList。但是如果是使用平常的三角面片則還是無法應(yīng)對多角度的視線,例如當相機與面片相切時,則完全看不到該面片。
所以最終決定將該網(wǎng)格朝向攝像機展開,使面片時刻朝向攝像機:
這樣達到的效果我個人還是非常滿意的。
后續(xù)開發(fā)
后續(xù)的開發(fā)將會著重幾個方面:
Interpolation,在發(fā)絲間進行插值,減少樣條曲線的運算量。
GPU Simulation,準備將Verlet Integration和Constraint Solve放到GPU上進行運算,應(yīng)該回更快一些。
多線程加速,不同的發(fā)絲應(yīng)該可以放到其他的線程中去達成線程加速。
后記
HairStrandPlugin只由我一個人開發(fā),從最初的什么都沒有到現(xiàn)在能夠或多或少看出海飛絲的效果,這樣的成果我個人其實已經(jīng)很滿意。
開發(fā)過程中再次感覺到數(shù)學對于游戲程序員實在是太重要了,在閱讀論文的過程中幾乎把所有的大學時代學到的數(shù)學都過了一遍。日后看來還是要好好過一遍數(shù)學了。
-
分享到:
相關(guān)文章
網(wǎng)友評論
全部評論:0條
推薦
熱門