參考
Unity手游開發(fā)札記——布料系統(tǒng)原理淺析和在Unity手游中的應(yīng)用履恩,轉(zhuǎn)載了部分內(nèi)容我衬。
一抵代、什么是布料系統(tǒng)
隨著時(shí)代的發(fā)展和移動(dòng)設(shè)備硬件性能的提升句喜,物理引擎被越來越多的移動(dòng)游戲所使用飒泻。物理引擎處理的對(duì)象主要可以分為剛體(Rigid Bodies)和柔體(Soft Bodies)兩大部分,剛體主要應(yīng)用在物理碰撞噪窘、破碎笋庄、布娃娃等系統(tǒng)中,而柔體最為重要的應(yīng)用代表就是布料系統(tǒng)倔监。
在物理引擎中直砂,通過物理計(jì)算來模擬布料效果的系統(tǒng)可以稱之為布料系統(tǒng)。雖然名為布料系統(tǒng)浩习,但并不僅僅用于表現(xiàn)角色衣服的布料效果静暂,而且可以應(yīng)用于毛發(fā)、墜飾谱秽,甚至女性的某些柔軟部位……下面的幾張圖就給出了一些游戲中應(yīng)用了布料效果的地方洽蛀。
二、為什么要使用布料系統(tǒng)
在物理引擎被廣泛使用之前疟赊,游戲中的絕大部分動(dòng)態(tài)效果都是通過固定的動(dòng)畫來表現(xiàn)郊供。這個(gè)做法非常容易理解——角色身上的飄帶也好,頭發(fā)也好近哟,在動(dòng)畫師的眼中驮审,與角色的手腳四肢沒有任何區(qū)別,添加骨骼,進(jìn)行蒙皮头岔,制作動(dòng)畫塔拳,無論一幀一幀自己手K還是用Max的柔體效果插件生成,都可以制作出逼真的布料運(yùn)行的效果峡竣。(在更早的使用網(wǎng)格動(dòng)畫的年代靠抑,原理也相差不多。)如果你覺得效果不夠好适掰?那簡單颂碧,再多加一些控制骨骼,多給美術(shù)一些時(shí)間类浪,就可以做出更好的效果载城。
基于動(dòng)畫的制作方法雖然可以滿足大部分的需求,但隨著時(shí)代的發(fā)展费就,無論玩家還是游戲開發(fā)者都在追求更好更真實(shí)的效果诉瓦,這種制作方式表現(xiàn)出來的布料效果的缺點(diǎn)慢慢顯現(xiàn)出來:
1. 布料效果不夠真實(shí)
雖然在單個(gè)的動(dòng)畫中,布料的表現(xiàn)效果足夠好力细,但是在各個(gè)動(dòng)作之間轉(zhuǎn)換睬澡,甚至多個(gè)動(dòng)作融合到一起進(jìn)行表現(xiàn)的時(shí)候,用于表現(xiàn)布料效果的骨骼融合結(jié)果就會(huì)不那么自然眠蚂,真實(shí)感也就大打折扣煞聪。
2. 無法應(yīng)對(duì)越來越多的變化
當(dāng)角色有移動(dòng)速度的變化時(shí),我們通呈呕郏可以通過改變動(dòng)畫的播放速度提供對(duì)應(yīng)的表現(xiàn)昔脯,但是移動(dòng)速度很快和移動(dòng)速度很慢時(shí),裙擺頭發(fā)的飄揚(yáng)效果都是完全一樣的笛臣,甚至當(dāng)玩家面對(duì)一堵墻按下移動(dòng)按鈕云稚,角色開始播放跑步動(dòng)畫,雖然并沒有移動(dòng)沈堡,但仍然可以看到角色的裙擺和頭發(fā)在迎風(fēng)飄揚(yáng)……
3. 限制時(shí)裝的設(shè)計(jì)和制作
目前大部分游戲在設(shè)計(jì)角色的時(shí)候由于要考慮到角色未來可能會(huì)出的時(shí)裝碱鳞,可能采用最大化骨骼的制作方案。所謂最大化骨骼踱蛀,就是在角色制作初期就確定好角色最多可能有哪些骨骼,在之后制作角色時(shí)裝的時(shí)候贵白,要完全在最初定義的最大化骨骼范圍內(nèi)率拒。如果超出了這個(gè)范圍,就需要修改所有時(shí)裝的模型以及角色的所有動(dòng)作禁荒,并全部重新導(dǎo)出猬膨,這種修改的代價(jià)是非常大的。
這些預(yù)留的最大化骨骼,有很多是在角色默認(rèn)設(shè)計(jì)的時(shí)裝中沒有被使用的勃痴,但是為了給未來預(yù)留更多的可能谒所,因此需要留好控制裙擺、長發(fā)等部件的各種最大化骨骼沛申,而且注意劣领,這些骨骼上都需要制作對(duì)應(yīng)的動(dòng)畫效果,或者在未來制作某套需要這一骨骼的時(shí)裝的時(shí)候铁材,把所有的動(dòng)畫添加上對(duì)應(yīng)骨骼的動(dòng)作尖淘,重新導(dǎo)出。在美術(shù)工作量著觉、美術(shù)資源的大小村生、游戲的運(yùn)行效率等方面,這種做法都有一定的負(fù)面影響饼丘。
當(dāng)然趁桃,大部分引擎都已經(jīng)支持了子模型的方式,也就是引擎可以把一些子模型動(dòng)態(tài)地合并到一套骨架上肄鸽。但是《劍靈》的制作人員提供了另外一種思路——主角的動(dòng)畫只制作身體主要部位的動(dòng)畫效果卫病,對(duì)于所有的裙擺、墜飾這樣的物體贴捡,都統(tǒng)一使用布料系統(tǒng)來制作忽肛。這一制作方案可以完美解決設(shè)計(jì)角色時(shí)裝時(shí)要考慮是否有骨骼可以驅(qū)動(dòng)的問題,從而解放美術(shù)的想象力烂斋,節(jié)省美術(shù)的冗余工作屹逛,運(yùn)行時(shí)的效率也得到一定的提升。
4. 無法支持動(dòng)畫重定向之后的動(dòng)作
動(dòng)畫重定向是一種常用的動(dòng)畫復(fù)用技術(shù)汛骂,可以讓一個(gè)模型A使用另外一個(gè)模型B的動(dòng)畫數(shù)據(jù)罕模,但是如果模型A帶有裙擺、長發(fā)這樣的額外部分帘瞭,而模型B的動(dòng)畫中并沒有驅(qū)動(dòng)對(duì)應(yīng)網(wǎng)格的骨骼淑掌,那么重定向之后的裙擺就會(huì)非常僵硬
三、插件調(diào)研
需要提前說明的是蝶念,前文所描述的布料系統(tǒng)及其原理抛腕,主要是針對(duì)在主機(jī)和端游上使用的物理模型的布料效果,它們基于網(wǎng)格頂點(diǎn)媒殉,可以做到非常精細(xì)的效果担敌。其實(shí)還有一種制作布料效果的方法——基于骨骼進(jìn)行物理模擬。這種方法的原理更加簡單廷蓉,把骨骼當(dāng)做一個(gè)個(gè)通過關(guān)節(jié)連接在一起的鉸鏈全封,給予一定的物理參數(shù),來模擬動(dòng)畫之外的動(dòng)態(tài)效果,而最終效果是通過蒙皮反應(yīng)到模型網(wǎng)格上的刹悴。由于骨骼數(shù)量通常都比頂點(diǎn)數(shù)量少很多行楞,因此這種方法具有更高的運(yùn)行效率,在手游中使用得也比較多土匀,前面對(duì)于《王者榮耀》中妲己的辮子截圖子房,筆者猜想就是使用的類似的方法。
沿著這兩個(gè)不同的思路恒削,筆者查看了幾個(gè)相關(guān)的插件池颈。
a. 基于骨骼的方案。基于骨骼的方案在Unity的AssetStore上有多個(gè)實(shí)現(xiàn)钓丰,原理都差不多:Dynamic Bone躯砰、Swing Bone、PhysicsBone
b. 基于質(zhì)子-彈簧模型的方案携丁。主要看了兩個(gè)琢歇,一個(gè)是官方的Cloth Component,一個(gè)是Obi Cloth梦鉴。
在質(zhì)點(diǎn)-彈簧模型中李茫,布料被當(dāng)做網(wǎng)格上的粒子來進(jìn)行模擬,這些粒子之間由彈簧減震器進(jìn)行連接肥橙。每一個(gè)彈簧連接兩個(gè)粒子魄宏,并且基于粒子的位置和速度來產(chǎn)生作用力。粒子可以受重力影響存筏,彈簧可以設(shè)置為不同的類型宠互,比如拉伸彈簧(stretch springs)、剪切彈簧(Shear Springs)和彎曲彈簧(bend springs)等椭坚。
1.Obi Cloth
效果可以參考 https://www.bilibili.com/video/BV1zX4y1w7Mg
2.Magica Cloth
《Unity Magica Cloth從入門到乳搖》之(1)基礎(chǔ)設(shè)置
https://www.bilibili.com/video/BV1Ah411Q7MF/
https://www.bilibili.com/video/BV1Tz4y127Hp/
Magica Cloth 布料模擬使用心得予跌,以及插件功能介紹(一)
Magica Cloth 布料模擬使用心得,以及插件功能介紹(二)
四善茎、官方的Cloth
基本步驟包括:
- 在Mesh Renderer所在的GameObject上添加Cloth組件券册;
- 點(diǎn)擊Edit Constraints按鈕在彈出的Cloth Constraints界面中編輯Mesh頂點(diǎn)上的常量,比如最大距離垂涯、表面滲透烁焙。也可以通過筆刷來刷出漸變的值。
- 在Cloth組件中設(shè)置參數(shù)和碰撞來提升效果耕赘。
Cloth組件的效果因?yàn)槭腔诰W(wǎng)格的骄蝇,因此不需要綁定骨骼也可以做出動(dòng)態(tài)的效果,而且飄動(dòng)的單元是mesh頂點(diǎn)鞠苟,因此效果也比較細(xì)膩。(我們的角色面數(shù)也比較省,當(dāng)然做不到像端游那么精細(xì)的效果当娱。)
參考https://docs.unity.cn/cn/2019.4/Manual/class-Cloth.html
布料 (Cloth) 組件與帶蒙皮的網(wǎng)格渲染器 (Skinned Mesh Renderer) 協(xié)同工作吃既,從而提供基于物理的面料模擬解決方案。此組件是專為角色服裝設(shè)計(jì)的跨细,僅對(duì)蒙皮網(wǎng)格有效鹦倚。如果向非蒙皮網(wǎng)格中添加 Cloth 組件,則 Unity 會(huì)刪除非蒙皮網(wǎng)格并添加蒙皮網(wǎng)格冀惭。
布料不響應(yīng)場景中的任何碰撞體震叙,也不會(huì)將力反射回世界。添加 Cloth 組件后散休,該組件完全不會(huì)響應(yīng)和影響任何其他實(shí)體媒楼。因此在手動(dòng)將碰撞體從世界添加到 Cloth 組件之前,布料和世界無法識(shí)別或看到彼此戚丸。即使執(zhí)行了此操作划址,模擬仍是單向的:布料可以響應(yīng)實(shí)體,但不會(huì)反向施力限府。
此外夺颤,只能對(duì)布料使用三種類型的碰撞體:球體、膠囊體以及使用兩個(gè)球形碰撞體構(gòu)造而成的圓錐膠囊碰撞體胁勺。之所以存在這么多限制是為了幫助提高性能世澜。
Cloth只能必須和Skinned Mesh Renderer搭配使用, 但是這不代表使用簡單的物體時(shí)還必須在Max中導(dǎo)出一個(gè)帶有蒙皮信息的FBX, 其實(shí)可以新建一個(gè)GameObject然后賦予Cloth組件, 這會(huì)自動(dòng)添加Skinned Mesh Renderer組件, 然后在Skinned Mesh Renderer組件中賦予基本體的Mesh上去并且設(shè)置正確的材質(zhì)也完全可以。布料可以接受外部影響,但完全不會(huì)將影響賦予外部剛體, 換句話說, 布料系統(tǒng)的物理模擬是單向的署穗。
參考Unity3D 布料系統(tǒng) And Cloth Constraint 及 Mesh雙面渲染
1.簡單示例
效果如圖寥裂,這塊布固定在一個(gè)點(diǎn)上,受重力影響來回?fù)u晃蛇捌。
先創(chuàng)建一個(gè)Plane抚恒,然后添加Cloth組件。然后Edit cloth constraints:
現(xiàn)在能看到很多小黑點(diǎn)络拌,隨便選一個(gè)俭驮,勾上Max Distance,即可實(shí)現(xiàn)上述效果春贸。
也可以使用鼠標(biāo)左鍵拖動(dòng)框選混萝,或者SHIFT多選。如果把一條線上的黑點(diǎn)全部選中萍恕,勾上Max Distance逸嘀,就是下面這個(gè)效果:
2.屬性,這個(gè)可以參考官方文檔
- Stretching Stiffness 布料的拉伸剛度允粤。數(shù)值范圍為0~1崭倘,值越大翼岁,越不容易拉伸。
- Bending Stiffness 布料的彎曲剛度司光。數(shù)值范圍為0~1琅坡,值越大,越不容易彎曲残家。
- Use Tethers 施加約束以幫助防止移動(dòng)的布料粒子離開固定粒子的距離太遠(yuǎn)榆俺。此屬性有助于減少過度拉伸。
- Use Gravity 是否應(yīng)該對(duì)布料施加重力
- Damping 運(yùn)動(dòng)阻尼系數(shù)坞淮。阻尼會(huì)應(yīng)用于每個(gè)布料頂點(diǎn). 要想打造看上去抖動(dòng)更小或更大的布料, 可以設(shè)置這個(gè)屬性茴晋。設(shè)置為1時(shí),可以看到布料受重力影響回窘,落下速度會(huì)慢很多诺擅。
- External Acceleration 施加在布料上的恒定外部加速度。
- Random Acceleration 施加在布料上的隨機(jī)外部加速度毫玖∠苹ⅲ可以模擬風(fēng)吹。
- World Velocity Scale(定義角色在世界空間的移動(dòng)對(duì)布料頂點(diǎn)的影響):值越大付枫,布料對(duì)角色在世界移動(dòng)的反應(yīng)越劇烈烹玉。這個(gè)參數(shù)基本是用于定義蒙皮布料的空氣阻力。
- World Acceleration Scale(定義角色在世界空間的加速度對(duì)布料頂點(diǎn)的影響):值越大阐滩,布料對(duì)角色在世界空間的加速度反應(yīng)越劇烈二打。如果布料看起來很生硬,那么可試著將該值增加掂榔。當(dāng)布料在角色加速時(shí)表現(xiàn)的不穩(wěn)定時(shí)继效,那么可試著將該值減少。
- Friction(摩擦系數(shù)):數(shù)值范圍為0~1装获。當(dāng)布料與其他對(duì)象碰撞時(shí)產(chǎn)生的摩擦力瑞信,只會(huì)影響到布料的模擬,并不會(huì)影響到剛體對(duì)象(單向模擬)穴豫。
- Collision Mass Scale:用來設(shè)置碰撞質(zhì)量縮放凡简。
- Use Continuous Collision 啟用連續(xù)碰撞來提高碰撞穩(wěn)定性。
- Use Virtual Particles 每個(gè)三角形添加一個(gè)虛擬粒子精肃,從而提高碰撞穩(wěn)定性秤涩。
- Solver Frequency 解算器每秒迭代次數(shù)。
- Sleep Threshold 布料的睡眠閾值司抱。
3.Capsule Colliders Sphere Colliders
要對(duì)布料產(chǎn)生交互的ClothSphereColliderPairs筐眷,比如一個(gè)人物模型,或者小球习柠。
可以理解為他是按照一組來的, 一組中可以只有一個(gè)SphereCollider, 也可以有兩個(gè), 當(dāng)有兩個(gè)的時(shí)候, 那么這兩個(gè)SphereCollider會(huì)在布料的碰撞系統(tǒng)中被”焊接”起來. 這樣就允許通過兩個(gè)大小不同的SphereCollider來組合成一個(gè)圓錐形狀的碰撞體了匀谣。
至于碰撞體放在Cloth自身照棋、子物體、外部都可以武翎,根據(jù)需求來必怜。
4.上面示例中用的約束工具
Max Distance可以設(shè)置每個(gè)頂點(diǎn)最大可移動(dòng)距離. 最常用的用法是將不能動(dòng)的頂點(diǎn)的Max Distance設(shè)置為0
Surface Penetration控制的是頂點(diǎn)最大可以嵌入到Mesh里面的程度. 在布料網(wǎng)格頂點(diǎn)比較稀疏的情況下可以明顯對(duì)比出差別
Visualization這里能夠選擇當(dāng)前在Scene視圖中預(yù)覽Max Distance還是Surface Penetration. (這兩者二選一), 還能選擇是否讓操作影響視口背面的頂點(diǎn)
5.使用 3 種不同的模式來編輯布料約束值
- Select 將固定約束值應(yīng)用于預(yù)先選擇的粒子組。
- Paint 通過用畫筆繪制布料粒子來施加固定的約束值后频。
- Gradient 將約束值的從左到右線性漸變應(yīng)用于預(yù)先選擇的粒子組。
根據(jù)使用的模式暖途,工具屬性和所需執(zhí)行的步驟會(huì)有所不同卑惜。在所有情況下,最后一步都對(duì)應(yīng)于應(yīng)用約束值的操作驻售。
Select編輯模式要先通過框選, 或者Shift+點(diǎn)擊來多選, 來選中頂點(diǎn), 然后勾選Max Distance或者Surface Penetration前面的復(fù)選框, 代表我現(xiàn)在要改變選中的頂點(diǎn)的值了! 然后再在后面的數(shù)值里面輸入想要的數(shù)值露久。
要想將當(dāng)前有數(shù)值的頂點(diǎn)設(shè)置為Unconstrained, 只需要選中那些帶有數(shù)值的頂點(diǎn)然后將對(duì)應(yīng)復(fù)選框取消勾選即可。
6.色譜
根據(jù)當(dāng)前在整塊布料中應(yīng)用的最小值和最大值欺栗,為上述選定的約束類型提供粒子顏色和約束值之間的對(duì)應(yīng)關(guān)系毫痕。黑色始終表示粒子沒有約束。
注:這里會(huì)在所有球中找最大值迟几,作為色譜的最大值消请。然后其他球會(huì)根據(jù)最新的色譜,改變顏色类腮。
7.Constraint Size
代表布料粒子的球體的顯示大小臊泰。在方便時(shí)可以調(diào)整此值以便簡化約束版本。這個(gè)屬性對(duì)約束本身沒有任何影響蚜枢。
注意缸逃,這個(gè)值過大,會(huì)導(dǎo)致球全疊在一起厂抽,面板黑了需频,如圖:
那些紅色的斑點(diǎn),實(shí)際上就是Max Distance=0的紅球筷凤,但是被黑球蓋住了昭殉,只有一點(diǎn)點(diǎn)邊緣,根據(jù)選不到嵌施。把球弄小點(diǎn)就能看到了:
注:上圖示例來源于https://github.com/BenVanCitters/UnityClothExample饲化,效果如圖:
8.自碰撞和互碰撞
布料碰撞使游戲中的角色服裝和其他面料更加逼真。在 Unity 中吗伤,布料有幾種處理碰撞的布料粒子吃靠。可將布料粒子設(shè)置為:
- 自碰撞足淆,防止布料穿透自身巢块。
- 互碰撞礁阁,允許布料粒子相互碰撞。
要為布料設(shè)置碰撞粒子族奢,請(qǐng)?jiān)?Cloth Inspector 中選擇 Self Collision and Intercollision 按鈕:
更多設(shè)置細(xì)節(jié)參考官方文檔https://docs.unity.cn/cn/2019.4/Manual/class-Cloth.html
還有B站視頻:https://www.bilibili.com/video/BV15W411n7H3