unity 蒙皮的實現方式

原理:

蒙皮,三維動畫術語,也用於3D遊戲中。三維動畫的一種製作技術。在三維軟件中創建的模型基礎上,爲模型添加骨骼。由於骨骼與模型是相互獨立的,爲了讓骨骼驅動模型產生合理的運動。把模型綁定到骨骼上的技術叫做蒙皮。

因爲蒙皮動畫要改動的是我們的骨骼的縮放,平移,渲染。是跟骨骼有關係的。但是我們的模型是一個mesh,是由很多頂點組成的,那麼要讓骨骼改動的時候mesh也變化的話就需要改動mesh上的頂點。那麼自然就需要骨骼和頂點間有一個關聯關係。

蒙皮一般是美術做出來的骨骼與頂點的關聯關係,也就是說蒙皮就是骨骼與頂點間的關係。

實現方式:

在unity中,我們要獲取這個關聯關係可以通過Mesh下的boneWeights來獲取,這裏獲取的是每個頂點的關聯骨骼信息。就包括boneIndex0到3和weight0到3。分別是頂點的關聯骨骼索引和關聯骨骼索引的權重。unity支持4個關聯骨骼。

要做蒙皮的話我們需要把骨骼的頂點與他的有關聯的骨骼索引關聯起來。所以需要做一次所有骨骼的座標轉換到動畫做動畫的座標系,需要做一次矩陣左乘。

我們要獲取骨骼的矩陣信息,首先需要獲取骨骼座標下的骨骼矩陣,通過Mesh的bindposes可以獲取所有的骨骼座標信息。然後左乘動畫世界座標bones[j].localToWorldMatrix * bindPoses[j]。這樣可以轉換到世界座標下。

然後把頂點跟各骨骼索引矩陣相乘得到該頂點的矩陣信息後乘上骨骼索引的權重,讓各權重加起來就可以得到蒙皮後的信息了

蒙皮方式默認是在cpu做的。當然也可以在gpu做,類似unity有gpuskinning,也可以自己些一些gpuanimation來實現(https://blog.csdn.net/llsansun/article/details/101790272

優化:

如果在不需要控制骨骼的情況下可以開啓Optimize GameObject。他能把部分主線程(Main Thread)裏原來運行的函數,放到了子線程(Worker Thread)裏來運行。因此主線程的壓力得到了極大的緩解,所以優化性能看起來就非常大。

也可以指定一些骨骼讓他顯示出來控制

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章