Skinmesh 蒙皮 在最終的渲染結(jié)果中妙啃,蒙皮將完全顯示出來彬祖,蒙皮實(shí)際上就是頂點(diǎn)储笑、法線和紋理坐標(biāo)等將被渲染的元素圆恤。 而其中腔稀,最關(guān)鍵的當(dāng)然是頂點(diǎn)焊虏,頂點(diǎn)將直接被骨頭牽扯運(yùn)動(dòng)诵闭,因而使得整個(gè)模型呈現(xiàn)骨骼所決定的樣子疏尿。
Skeleton 骨骼 骨骼是一種抽象的概念褥琐,在最終的渲染結(jié)果中晤郑,它不可見。類如人體骨骼,骨骼是若干骨頭(Bone)成樹狀的集合體磕洪,而每塊骨頭又分別與若干數(shù)量的蒙皮頂點(diǎn)關(guān)聯(lián)褐鸥。 當(dāng)骨頭運(yùn)動(dòng)的時(shí)候赐稽,與之關(guān)聯(lián)的所有蒙皮頂點(diǎn)也會(huì)受骨骼的影響而運(yùn)動(dòng)姊舵。
骨頭與蒙皮頂點(diǎn)的關(guān)聯(lián)需要考慮到每塊骨頭對(duì)蒙皮頂點(diǎn)的影響括丁。盡管大部分情況下史飞,一個(gè)頂點(diǎn)將僅僅被一個(gè)骨頭的影響构资,但是關(guān)節(jié)處的頂點(diǎn)往往被多根骨頭影響吐绵,例如踝關(guān)節(jié),可能會(huì)分別受小腿骨50%和腳骨50%的影響唉窃,這種影響叫作權(quán)重(Weight)纹份。在這種情況下蔓涧,我們稱踝關(guān)節(jié)的這些頂點(diǎn)蠢笋,受小腿骨影響的權(quán)重是50%昨寞,受腳骨影響的權(quán)重也是50%援岩。Bone 骨頭 spine 是骨骼編輯器,所以骨頭是基礎(chǔ)享怀。每個(gè)骨頭都會(huì)有 位移T/縮放S/旋轉(zhuǎn)R 的屬性(TSR屬性)。骨頭可以有子節(jié)點(diǎn)趟咆,最終形成了一個(gè)樹型結(jié)構(gòu)添瓷。可以對(duì)應(yīng)2dx 里面的 node值纱。
插槽 骨頭上的一個(gè)掛載點(diǎn)鳞贷。不是所有的骨頭上都能放置東西的,因?yàn)楹芏喙穷^其實(shí)只參與計(jì)算虐唠,真正重要的骨頭搀愧,也就是需要掛載其他東西的骨頭上必須放置插槽。slot 只是用來標(biāo)記特殊的骨頭位置疆偿,本身只有一個(gè)顏色屬性咱筛,也可以說,重要的骨頭節(jié)點(diǎn)可以稱為 slot杆故。Attachment 附件 掛在插槽上的內(nèi)容迅箩,可以是圖片,也可以是判定區(qū)域沙热,只要是你能想到的東西,都可以當(dāng)成附件敷鸦。
Draw order 描畫順序 骨架上插槽的一個(gè)順序列表。用來控制描畫的先后順序碟案。
Animation 動(dòng)畫 基于時(shí)間軸的一個(gè)骨頭狀態(tài)列表鳖目。
Skin 皮膚 一套Attachment(附件)的集合,類似于換裝。
Bounding Box 邊界框 用來指定骨頭上的邊界的多邊形的區(qū)域尘喝。
atlas 圖集 貼圖集合,小圖片合并在一起骑科,就成了圖集
二、實(shí)現(xiàn)
上面大致介紹了一些基本概念符糊,然后我們從實(shí)現(xiàn)角度上來說下為啥這么設(shè)計(jì)模闲。
(1)首先,假設(shè)我們需要一個(gè)骨骼系統(tǒng)。于是,我們就設(shè)計(jì)了一個(gè)樹狀的骨架,每個(gè)節(jié)點(diǎn)就是(Bone)宴猾。
(2)再想下,骨頭上要放圖片啥的,于是我們就需要訪問到特定的骨頭,遍歷太傻了由捎,好吧心肪,我們給這些骨頭加個(gè)名字,這樣就能訪問到具體的骨頭了,那這些名字就叫slot。
(3)好吧,可能有些人覺得,slot 和 bone 本質(zhì)上一樣,為啥需要分開呢,沒必要的。我只能說事情其實(shí)并不簡(jiǎn)單。來想下,我們已經(jīng)有了一個(gè)完美的骨架缨历,圖片也在應(yīng)該在的骨頭上了。那我們?cè)撊绾物@示圖片么?遍歷么嚼隘,從根結(jié)點(diǎn)開始卧檐,一直到最下層的節(jié)點(diǎn),不管你用啥排序暖呕,這個(gè)順序是固定的,但是現(xiàn)實(shí)總是很殘酷,很多時(shí)候,我們需要不停調(diào)整圖片描畫的順序宵晚,也就是調(diào)整樹的節(jié)點(diǎn)排序。那怎么辦哟沫,我們指定下骨頭描畫的順序吧(Draw order),這些特定的骨頭也就是 slot孔祸。
(4)你看,這下完美了,也就是 bone 用來計(jì)算位置皇钞,slot 用來控制描畫馆里。
(5)完美的骨骼系統(tǒng)慢哈,一定要有碰撞區(qū)域(bounding box)键俱,這和圖片差不多,一個(gè)用于顯示,一個(gè)用于邊界判斷,好吧,那就抽象成一個(gè)概念叫(attachment)畅蹂,于是,slot 上就可以附加不同的 attachment 了嚷硫。
(6)終于可以換附件了屎媳,但是一個(gè)一個(gè)換好累。于是论巍,我們把一組附件合在一起烛谊,組成了 skin。這下簡(jiǎn)單了嘉汰,一換 skin丹禀,整個(gè)世界就變樣了。
(7)啊,做著做著双泪,就發(fā)現(xiàn)圖片太多了持搜,要優(yōu)化啊。怎么辦焙矛,簡(jiǎn)單葫盼,把小圖片合在一起,每個(gè)圖片對(duì)應(yīng)了一個(gè)大圖里面的一個(gè)區(qū)域村斟,這就是 atlas贫导。