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

为了能够更好的使用cocos为我们提供的Sprite3D,我和大家分享一下Sprite3D中关于骨骼动画原理的部分,本文使用cocos2d-x 3.2版本,这是cocos首次出现3D骨骼动画的版本,相对与本文写出来时候最新的3.5版本,由于没有其他比如灯光等功能,3D骨骼动画模块读起来要更加的清晰。如果文章有纰漏或者错误的地方,也请大家指教。
目前引擎支持3种动画格式,分别是.obj.c3b.c3t,由于.obj没有骨骼,.c3b是二进制,而.c3tjson格式,所以本文就用官方test中自带的orc.c3t的创建以及渲染作为例子。


第一步:读取文件,得到数个struct,以下说明是对这些struct的说明:


注释:拿orc.c3t来举例说明一下,得到的attribs数组分别是代表:

1、顶点在模型坐标系下的位置信息(VERTEX_ATTRIB_POSITION2、顶点的法线(VERTEX_ATTRIB_NORMAL3、顶点的纹理坐标(VERTEX_ATTRIB_TEX_COOD4、作用于该顶点的某骨骼,对该顶点最终位置的权重(VERTEX_ATTRIB_BLEND_WEIGHT5、影响该顶点的骨骼在骨骼数组中的索引(VERTEX_ATTRIB_BLEND_INDEX

所以一个顶点共计要16float变量来表示,所以vertex数组中的顶点数目就是数组大小除以16,而每个面需要3个顶点,所以面的数目我们也能确定了。至于indices数组,就是这些个顶点的索引了。


第二步:根据以上解析出来的数据结构,在Sprite3D中创建Mesh类对象和MeshSkin类对象,下面说明一下这两个类的作用:




注释:这里说一下_matrixPalette这个成员变量。在Mesh::buildBuffer()后,已经将所有的顶点传递给了GPU,所以接下来的问题就是如何将这些顶点坐标,由其初始状态的模型坐标系下的坐标,跟随对应骨骼,变换至当前模型坐标系下的坐标。而这些变换的矩阵,就是使用_matrixPalette来传递的。引擎使用3Vec4来表示这样一个矩阵,而_matrixPalette就表示了所有_skinBones的这个变换矩阵。而具体每个skinBone的这个4x3矩阵的计算则在MeshSkin::updateJointMatrix函数中:



第三步:构建渲染指令,传递相应数据至GPU进行绘制:

我们来分析一下对应的ccShader_3D_PositionTex.vert文件,看看经过这些步骤以后,shader是如何使用这些数据的:





总结:本文忽略了很多细节,只重点讲解了三个关于骨骼动画原理的部分,希望能对关于这部分有兴趣的朋友有所帮助,也特别希望有前辈能指出问题,或者进行补充。下次有时间我会加上animation部分,谢谢。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...