Unity-帶蒙皮的網格渲染器 (Skinned Mesh Renderer)
Unity 使用__帶蒙皮的網格渲染器 (Skinned Mesh Renderer)__ 組件來渲染骨骼動畫;此類動畫中的網格形狀由動畫骨骼進行變形。這種技術對于關節(jié)彎曲的角色和其他對象(與關節(jié)更像鉸鏈的機器相反)非常有用。
__骨骼__是蒙皮網格內的不可見對象,會影響網格在動畫過程中的變形方式。骨骼連接在一起形成分層的“骨架”,并通過旋轉骨架的關節(jié)使骨架移動來定義動畫。每個骨骼都附著在周圍網格的一些頂點上。播放動畫時,頂點會隨著它們所連接的一個或多個骨骼移動,因此“皮膚”也跟隨骨架移動。在簡單的關節(jié)(例如肘部)處,網格頂點受到在此處相交的兩個骨骼的影響,當關節(jié)彎曲時,網格將逼真地伸展和旋轉。在更復雜的情況下,兩個以上的骨骼會影響網格的特定區(qū)域,從而產生更微妙的移動。

雖然蒙皮網格最常用于動畫,但也可將剛體組件附加到骨架中的每個骨骼,從而將其置于物理引擎的控制之下。這種做法通常用于創(chuàng)建“布娃娃”效果;在此效果中,角色在被拋出或被爆炸擊中后,四肢胡亂擺動。
屬性
其中一些屬性也會出現(xiàn)在網格渲染器 (Mesh Renderer)?參考頁面上。下表提供了藍色框中顯示的其余屬性的相關信息。
屬性:????????????????????????????????????????????????????????????????????????????????功能:
BlendShapes????????存儲此網格上定義的混合形狀。
Rendering Layer Mask????????確定該渲染器所在的渲染層。使用可編程渲染管線時,可以額外指定一個特定于渲染的層遮罩。這將根據(jù)渲染器具有的遮罩和傳遞給?DrawRenderers?命令的遮罩篩選渲染器。
Renderer Priority????????按優(yōu)先級對渲染器排序。首先渲染較小值,最后渲染較大值。
Quality????????定義蒙皮時每個頂點使用的最大骨骼數(shù)。骨骼數(shù)量越多,渲染器的質量越高。
Unity 可以使用從 1 到 32 的任意數(shù)量的骨骼為每個頂點蒙皮,但多于四個骨骼會降低性能。使用的骨骼越多,獲得的效果就越好,但是每增加一個骨骼都會帶來更高的處理開銷。????Auto使用?Blend Weights?Quality?設置。
注意:如果導入了自定義數(shù)量的?Skin Weights,并且您希望允許四個以上的骨骼產生影響力,則必須選擇此選項并確保?Blend Weights?設置為 Unlimited。???
????????????????1 Bone????????????僅使用一個骨骼來影響每個頂點。????
????????????????2 Bones??????????每個頂點使用最多兩個骨骼。這是游戲的通用設置,因為這個設置可以在視覺質量與性能之間實現(xiàn)良好折衷。????
????????????????4 Bones????????? 每個頂點使用最多四個骨骼。如果需要允許四個以上的骨骼影響單個頂點,請使用?Blend Weights?Quality?設置。
Update When Offscreen????????啟用此選項可計算每幀的包圍體積(即使對攝像機不可見)。禁用此選項可在游戲對象不在屏幕上時停止運行動畫。
默認情況下,Unity 不會更新對攝像機不可見的蒙皮網格。當網格返回屏幕時,Unity 會再次更新蒙皮。這樣可以節(jié)省系統(tǒng)資源。有關更多信息,請參閱下面的確定游戲對象的可見性。
Skinned Motion Vectors????????啟用此選項將對網格蒙皮數(shù)據(jù)進行雙重緩沖,以便 Unity 能夠插入蒙皮運動并將其置于運動矢量紋理中。這會使用更多的 GPU 內存,但會帶來更正確的運動矢量。
Mesh????????????????設置該渲染器使用的網格(皮膚)。
Root Bone???????設置作為動畫“根”的骨骼(即,所有其他骨骼移動時參照的相對骨骼)。
Bounds????????????設置 Unity 用于判定網格是否超出屏幕外的包圍體積。在模型文件中導入網格和動畫時,Unity 會預先計算構成此包圍體積的邊界,并在 Scene 視圖中將這些邊界顯示為模型周圍的線框。有關更多信息,請參閱下面的確定游戲對象的可見性。
確定游戲對象的可見性
Unity 使用網格的?Bounds?屬性來確定游戲對象是否可見。也就是說,整個包圍體積必須在所有激活的攝像機的視野之外。但是,動畫網格的真實包圍體積可能隨著動畫的播放而變化(例如,如果角色將手舉到空中,則包圍體積會變高)。Unity 在計算最大包圍體積時會考慮所有附加的動畫,但有時無法通過計算包圍體積邊界來預測每個可能的用例。
以下每個示例情況在 Unity 將骨骼或頂點推出預先計算的包圍體積時都可能出現(xiàn)問題:
在運行時添加的動畫
附加動畫
使用程序從腳本中更改骨骼的位置
使用的頂點著色器可將頂點推到預先計算的包圍邊界之外
使用布娃娃
在這些情況下,可以嘗試使用以下任一解決方案來解決問題:
修改 Bounds 的值以匹配網格的潛在包圍體積。
盡可能使用此選項,因為它對性能更有利。
啟用?Update When Offscreen?以始終進行蒙皮和渲染蒙皮網格。
如果性能不是主要問題,或者如果無法預測包圍體積的大?。ɡ?,使用布娃娃時),則可使用此選項。
為了使蒙皮網格在使用布娃娃時有更好的表現(xiàn),Unity 會在導入帶蒙皮的網格渲染器時自動將其重新映射到根骨骼。但是,僅當模型文件中只有一個帶蒙皮的網格渲染器,Unity 才會執(zhí)行此操作。如果使用布娃娃,并且無法將所有帶蒙皮的網格渲染器附加到根骨骼或子項,則應關閉此優(yōu)化。