Unity 之 人物換裝

2022-02-24 04:02:06 字數 2873 閱讀 4054

原理

一、 skinedmeshrender:該物件負責網格繪製。主要資料成員包括

var bones : transform 骨骼

var materials : material 材質

var sharedmesh : 

mesh

網格其中mesh的主要成員是

vertices : vector3 頂點

boneweights : 

boneweight

骨骼權重

boneweights陣列與vertices陣列對應,表示對應下標的頂點運動受骨骼影響的權重。boenweight結構記錄了骨骼在skinedmeshrender.bones陣列中的索引。 

二、網格和材質的對應關係

一張實際的網格只能施加乙個材質。因此,當render所使用的mesh包含多個實際網格(sub mesh),它對每個sub mesh所施加的材質實際上是materials陣列中對應下標的材質。

三、合併網格(combinemeshes)函式的第二個引數是設定是否將多個子網格合併成一張實際的網格。

正如前面所述,乙個實際的網格只能施加乙個材質,所以只有被合併的所有網格原來使用的就是同乙個材質(即共享材質)時,將它們真正合併才能正確應用材質。否則,應該將該引數置為false,表示不實際合併這些submesh,而是將它們作為被合併後mesh物件的sub mesh。

四、陣列對應問題:

網格頂點和骨骼、sub mesh和材質之間的對應都是通過陣列下標進行的,所以操作時保證新生成的個陣列下標對應關係正確是非常重要的。

操作2.基礎模型生成

基礎模型是從characters目錄下找fbx模型(名稱裡面不帶@),如果找到(如female.fbx),則把模型下所有有skinnedmeshrenderer的gameobject刪除,然後給模型本身加了個skinnedmeshrenderer。

因為female是帶animation的,所以這樣乙個基礎模型就生成了,此模型帶animations, 並且帶乙個skinnedmeshrenderer。

3.子模型包的生成

子模型包是根據前面找到的fbx模型的子模型,主要包括face, eye, shoes, top ,pants, hair幾個部分,子模型包包括三個部分:乙個pretab,用到的所有的material, bonenames, 

4.生成過程

生成過程主要在兩個函式:

public gameobject generate()                                  //生成基礎模型    

public gameobject generate(gameobject root)         //生成root下的子模型

每乙個子模型包對應的類是characterelement,整個模型的構成過程,就是集合所有子模型skinnedmeshrenderer的materials, mesh的combineinstance,還有bonenames,

skinnedmeshrenderer r = root.getcomponent();

r.sharedmesh = new mesh();

r.sharedmesh.combinemeshes(combineinstances.toarray(), false, false);

r.bones = bones.toarray();

r.materials = materials.toarray();

全部賦值到了基礎模型的skinnedmeshrenderer上

在複雜的模型中,我們可以查詢子元件的skinnedmeshrenderer,然後進行操作就可以了。想換**就替換**的skinnedmeshrenderer的資訊,更新對應的骨骼列表和組合一下網格就行了。

listcombineinstances = new list();

combineinstance ci = new combineinstance();

ci.mesh = srcskinmeshrender.sharedmesh;

combineinstances.add(ci);

還有乙個想法是這樣的,源資源中是否需要骨頭。我發現重組骨頭結構的時候其實只是讀取了骨頭的列表資訊,所以我覺得可以寫成乙個配置資訊,直接讀取配置資訊來重組

>

對乙個人物模型裡的個別模組換裝,可分為:材質更換,模型更換和骨架更換。

就像下面這段程式那樣。

在得到人物skinnedmeshrenderer後,它的模型進行更換,對其骨架進行更換,最後對其材質球進行更換。

蒙皮繫結到骨架

來自為知筆記(wiz)

Unity 之 人物換裝

原理 一 skinedmeshrender 該物件負責網格繪製。主要資料成員包括 var bones transform 骨骼 var materials material 材質 var sharedmesh mesh 網格 其中mesh的主要成員是 vertices vector3 頂點 bone...

Unity換裝功能

前文再續 如何給角色更換部件,發現前文的不太科學。特意重發 更換骨骼部件 必須獲取skinnedmeshrenderer元件,如果不存在這個屬性 請按照前文替換方式 儲存mesh和material進行替換 首先說說 skinnedmeshrenderer 不得不說 前文的方法是對了一部分,只是由於骨...

《白銀帝國》之人物篇

帝國 的故事背景發生在晚清,故事裡有八國聯軍進京 初年的革命,基本上處在乙個戰亂紛飛,世道不太平的年代。康家的祖宗在窮困僚倒時,依靠路過的乙個陌生人的一碗粥和30兩 而發家。到康老爺子這代,有4個兒子,老大聾啞,而且信篤佛教,基本上不管家事 老二手腳利落,衝動好勝,結果在老四的老婆四娘被綁架以後,從...