从Sprite3D理解3D骨骼动画原理

为了能够更好的使用
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
部分,谢谢。

自己顶一下…

好文章支持

图都出不来

图全挂了。。。是我的问题么。。。:12:

已加亮,麻烦楼主再传下图…3Q

上图:2::2::2::2:

终于把图弄好了

格式很考究、化繁为简、很容易引人入胜、一篇负责任的文章,赞!!!

GPU蒙皮就是这样。

太棒了;就需要这样有深度的文章。