2D 動畫 spine 渲染原理解析與源碼解讀
作者:曾培森
來源:SegmentFault 思否社區(qū)
前言:什么是spine?
為了讓初學(xué)者有更加直觀的初步的了解,筆者提供了一個簡單的示意圖如下:

實際開發(fā)中,由設(shè)計人員提供對應(yīng)的spine編輯器所導(dǎo)出的動畫素材,開發(fā)人員選用對應(yīng)的spine運行庫對素材進行消費和上屏渲渲染,便是spine所做的事,相比gif、css幀動畫、apng具備更加強大的靈活性。
簡單比較如下:

GIF由于其本身的色彩限制,一般不能滿足設(shè)計的要求,因此目前大多采用CSS幀動畫和APNG的方式處理頁面動畫,小區(qū)域動畫采用apng,大區(qū)域動畫可以考慮采用CSS幀動畫或JS動畫處理。而厘米秀這里由于業(yè)務(wù)本身復(fù)雜且形象裝扮多變,故不得不采用spine2D動畫的方案。
注釋:
1)、JSON文件/二進制文件:存儲骨架信息,見下文介紹。
2)、素材圖片:類似雪碧圖,也可單一素材,可導(dǎo)出一張或多張。
3)、與素材圖片對應(yīng)的atlas文件:記錄素材圖片在雪碧圖上的位置信息特征等。一個atlas文件可對應(yīng)多個素材圖片。
一、基本概念
1、骨架Skeleton:指代的是數(shù)據(jù)的集合,包含構(gòu)成此骨架的所有骨骼、插槽、附件及其他信息。
2、骨骼bones:以官方示意圖為例,一個人物本身由多個關(guān)節(jié)的骨骼組成。除了根骨骼以外,每個骨骼都有對應(yīng)的父骨骼,骨骼與骨骼之間的關(guān)系最終構(gòu)造成類似樹的結(jié)構(gòu)。

1、區(qū)域附件:普通的圖片展示附件。
2、點附件:空間中的一個點和旋轉(zhuǎn),相比骨頭的優(yōu)勢可以為不同的皮膚設(shè)置更改位置和旋轉(zhuǎn),例如不同的槍從不同的位置射擊。
3、網(wǎng)格附件:支持在圖片內(nèi)設(shè)置多邊形,之后可操縱多邊形的頂點,以有效的方式讓圖片彎曲和變形。
4、邊界框附件:附加到骨骼上的多邊形,骨骼變化的時候也會隨之變形,可用于撞擊檢測,創(chuàng)建物理主體等。
5、剪裁附件:剪裁功能讓你可以定義一個多邊形區(qū)域,與邊界框附件類似,它會屏蔽繪制順序中的其他插槽。
6、路徑附件:用于設(shè)置路徑。
1、IK約束:反向動力學(xué)約束 子骨頭終點固定的場景。
2、變換約束:變換約束指的是將對骨骼的世界旋轉(zhuǎn)、移動縮放等復(fù)制到多個骨骼上。
3、路徑約束:使用路徑來調(diào)整骨骼變換,骨骼可以沿著路徑,也可以調(diào)整旋轉(zhuǎn)以指向路徑。
二、spine架構(gòu)和核心類解讀


三、spine源碼解讀
(deform屬性是針對mesh附件的處理信息。)
(通過setToSetUpPose設(shè)置初始動作)
(在slot實例里可以直接getAttachment和setAttachment)
由于是數(shù)據(jù)對象,僅提供了一些findbone、findslot的方法。
有個update方法,更新time時間。
處理bone和slot構(gòu)造對應(yīng)的實例data。
處理skins借助loader生成對應(yīng)附件實例。
處理 animations生成不同的timeline實例對象。
最終構(gòu)造出對應(yīng)的SkeletonData實例。
AtlasAttachmentLoader實現(xiàn)了對應(yīng)方法。
借助外部傳入的textureLoader回調(diào)來獲取對應(yīng)的紋理。
每塊小素材對應(yīng)一個TextureAtlasPage,素材信息讀取解析后構(gòu)造對應(yīng)TextureAtlasRegion。
分多個track存儲動畫、區(qū)分不同動畫的timeline,針對event事件的處理邏輯等。
四、渲染庫代碼解讀
1、AssetManager:沒有做啥,直接沿用core里的AssetManager
2、canvasTexture:繼承Texture。
3、SkeletonRender:傳入skeleton數(shù)據(jù),渲染畫布,
drawImage會遍歷drawOrder中的slot,逐個渲染region附件,借助ctx.drawImage API來裁剪和渲染圖片。
drawTriangles會計算頂點,渲染調(diào)試模式的綠色線條。
1、ThreeJsTexture:針對threesjs本身的texture做了一層包裹,處理了一下filter。
2、MeshBatcher:MeshBatcher繼承自Threejs本身的Mesh。調(diào)用SkeletonMeshMaterial獲取材質(zhì)。
3、SkeletonMesh:SkeletonMeshMaterial繼承自ShaderMaterial,這里包含了著色器代碼,頂點著色器和片元著色器。
SkeletonMesh繼承自O(shè)bject3D類。
核心渲染函數(shù)updateGeometry,skeleton更新世界變化后,調(diào)用渲染函數(shù),遍歷drawOrder。
RegionAttachment和MeshAttachment會進行渲染,渲染借助MeshBatcher,紋理作為素材傳入batchMaterial。
1、GLTexture:獲取畫布,渲染對應(yīng)的image到畫布上。
2、Camera:設(shè)置相機位置
3、WebGL:定義了ManagedWebGLRenderingContext,其實就是獲取webgl的context上下文。
4、Input:對元素做事件監(jiān)聽,鼠標(biāo)、touch事件。
5、Shader:自行實現(xiàn)的著色器,片元和頂點。
6、SkeletonRenderer:負責(zé)skeleton的上屏渲染,渲染函數(shù)需要借助PolygonBatcher來上屏渲染,同樣的,只會對RegionAttachment和MeshAttachment會進行渲染。
7、PolygonBatcher:在這里綁定著色器,設(shè)置混合模式,綁定一個Mesh實例對象,Mesh為單獨封裝的mesh類,最終調(diào)用的是Mesh暴露的渲染方法。
8、Mesh:單獨封裝的Mesh類,允許設(shè)置指數(shù)和頂點,上屏渲染借助context的drawElements和drawArrays方法。
9、SceneRenderer:最上層的調(diào)用類,實例化batcher、webgl上下文、shader,實例化SkeletonRenderer,暴露不同的渲染方法,包括drawSkeleton,drawSkeletonDebug、drawTexture、drawRegion等。
五、spine渲染整體流程圖


評論
圖片
表情
