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

从Sprite3D理解3D骨骼动画原理,第1张

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

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


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

@H_404_108@

注释:拿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部分,谢谢。

总结

以上是内存溢出为你收集整理的从Sprite3D理解3D骨骼动画原理全部内容,希望文章能够帮你解决从Sprite3D理解3D骨骼动画原理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1054851.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存