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