為了能夠更好的使用
cocos
為我們提供的
sprite3d
,我和大家分享一下
sprite3d
中關於骨骼動畫原理的部分,本文使用
cocos2d-x 3.2
版本,這是
cocos
首次出現
3d骨骼動畫的版本,相對與本文寫出來時候最新的
3.5版本,由於沒有其他比如燈光等功能,
3d目前引擎支援
3種動畫格式,分別是
.obj
,.c3b
,.c3t
,由於.obj
沒有骨骼,
.c3b
是二進位制,而
.c3t
是json
格式,所以本文就用官方
test
中自帶的
orc.c3t
的建立以及渲染作為例子。
第一步:讀取檔案,得到數個
struct
,以下說明是對這些
struct
的說明:
注釋:拿
orc.c3t
來舉例說明一下,得到的
attribs
陣列分別是代表:
1、頂點在模型座標系下的位置資訊(
vertex_attrib_position)2
、頂點的法線(
vertex_attrib_normal)3
、頂點的紋理座標(
vertex_attrib_tex_cood)4
、作用於該頂點的某骨骼,對該頂點最終位置的權重(
vertex_attrib_blend_weight)5
、影響該頂點的骨骼在骨骼陣列中的索引(
vertex_attrib_blend_index
)所以乙個頂點共計要16個
float
變數來表示,所以
vertex
陣列中的頂點數目就是陣列大小除以
16,而每個面需要
3個頂點,所以面的數目我們也能確定了。至於
indices
陣列,就是這些個頂點的索引了。
第二步:根據以上解析出來的資料結構,在
sprite3d
中建立mesh
類物件和
meshskin
類物件,下面說明一下這兩個類的作用:
注釋:這裡說一下_matrixpalette這個成員變數。在mesh::buildbuffer()後,已經將所有的頂點傳遞給了gpu,所以接下來的問題就是如何將這些頂點座標,由其初始狀態的模型座標系下的座標,跟隨對應骨骼,變換至當前模型座標系下的座標。而這些變換的矩陣,就是使用_matrixpalette來傳遞的。引擎使用3個vec4來表示這樣乙個矩陣,而_matrixpalette就表示了所有_skinbones的這個變換矩陣。而具體每個skinbone的這個4x3矩陣的計算則在meshskin::updatejointmatrix函式中:
第三步:構建渲染指令,傳遞相應資料至
gpu進行繪製:
我們來分析一下對應的
ccshader_3d_positiontex.vert
檔案,看看經過這些步驟以後,
shader
是如何使用這些資料的:
總結:本文忽略了很多細節,只重點講解了三個關於骨骼動畫原理的部分,希望能對關於這部分有興趣的朋友有所幫助,也特別希望有前輩能指出問題,或者進行補充。下次有時間我會加上
animation
部分,謝謝。
不要為3d而3d
和以前的幾個朋友聊天,也有做game的。發現大家對3d技術都非常熱衷,但是這種熱衷顯得刻意的 為3d而3d,就有點捨本逐末。1 遊戲最重要的是策劃,需要具體的滿足人心底的某種需求,2 3d需要 好顯示卡的支援,這樣就將一部分使用者排斥在外面了。3 現在3d engine已經 很成熟了,通過這些上面的...
如何理解3D渲染引擎
框架的支援 3d引擎只是動力 在外層需要有完整的框架負責輸入輸出,網路通訊等,平台差異性 物件導向設計 外掛程式擴充套件機制,主要是功能擴充套件,引擎只負責3d效果的展出,實際的產品應用要考慮輸入輸出 網路通訊 其他媒介的支援 其中輸入輸出主要是滑鼠鍵盤,kinect等體感式外設 網路通訊主要是遊戲...
3D中帶光照的骨骼動畫原理
常見的模型動畫分為關鍵幀動畫與骨骼動畫,這裡我只關注與骨骼動畫,骨骼動畫又叫頂點混合動畫。頂點混合維護了乙個單獨預設姿勢和許多用來正確旋轉 平移預設姿勢的多邊形網格的各個部分矩陣,這些不同的矩陣變換通常被稱為骨骼。乙個或多個這樣的矩陣控制了再這個預設姿勢的多邊形網格中的每個頂點。每個矩陣被賦予了乙個...