PyOpenGL骨骼动画(skeleton animation) 一 Collada模型格式简单解读

Collada简介

collada格式文件是一种比较流行的3D模型文件存储格式,Blender默认的默认导出格式就是.dae格式的,相比obj文件,dae文件不仅存储了顶点,法向量,面,贴图坐标,材质信息,还存储了整个3D场景的结构信息以及骨骼动画信息。

Collada格式

PyOpenGL骨骼动画(skeleton animation) 一 Collada模型格式简单解读_第1张图片
上图所是为Collada的基本结构,可以看到,文件是以XML格式进行存储的。
library_geometries包含3D场景中各个模型的顶点,法线,贴图坐标信息。
PyOpenGL骨骼动画(skeleton animation) 一 Collada模型格式简单解读_第2张图片
我这里用的dae文件是在Blender中勾选生成三角形得到的,简单介绍一下结构,triangles节点里是索引信息(红线标注),依次为VERTEX NORMAL TEXCOORD COLOR 索引,具体值在上面的source中。
绿色线标注的为顶点信息,顶点总共740个,stride为3,绿色框内为一个顶点的信息(X Y Z)坐标。
蓝色线标注的为法线信息,法线总共1414个,stride为3,蓝色框内为一个法线的信息(X Y Z)坐标。
黄色线标注的为贴图坐标信息,总共4260个,stride为2,黄色框内为一个贴图坐标的信息(S T)坐标。
以索引信息(红色框内数字为例),第一个三角形由第97 36 93的顶点组成,法线,纹理坐标以此类推。

library_visual_scenes包含整个3D场景的结构信息,我们可以从中得到模型的骨骼结构信息。
PyOpenGL骨骼动画(skeleton animation) 一 Collada模型格式简单解读_第3张图片
骨骼信息保存在type为JOINT的节点中,可以看到图中骨骼根节点为Armature_Torso,它包含了matrix(该节点的局部变幻矩阵)node(字节点,其中包含子关节)。在代码中可以通过遍历该树形结构得到整个模型的骨架信息。

library_animations 顾名思义就是保存关键帧动画的地方,展开它可以看到里面出现了所有关节点。
PyOpenGL骨骼动画(skeleton animation) 一 Collada模型格式简单解读_第4张图片
查看其中一个关节点:其中对于动画比较有用的的是matrix-input和matrix-output,分别表示该关节进行动画时的关键帧时间和每个关键帧对应的局部坐标变幻矩阵。

library_controllers 有了节点信息和关节信息,剩下的就是它们之间的绑定关系和权值。
PyOpenGL骨骼动画(skeleton animation) 一 Collada模型格式简单解读_第5张图片
vertex_weights下面存储了顶点受哪些关节影响,权值的索引是多少, 表示该节点受几个关节影响,比如第一个顶点对应1,表示它受一个结点影响,则看第一个红框的数字为3 0,则影响该节点的关节索引为3 权值索引为0,所以可以到 Armature_Cube-skin-joints 和Armature_Cube-skin-weights下利用索引获得具体的值。
这里指的注意的一点是Armature_Cube-skin-bind_poses节点,它下面是所有关节的逆变换矩阵,也就是在进行动画插值的时候,我们其实是通过父关节的变幻矩阵乘以该关节的局部矩阵乘以逆变换矩阵得到最终的变幻矩阵。可以这么理解,先看这三个矩阵相乘的后半部分,其结果可以想象为关节局部左边变幻到到父节点坐标空间下,再用父节点变幻矩阵乘以它,就得到了原始局部坐标到新的坐标位置的变幻矩阵(有点太饶了,推荐大家看一下这个教程,讲得很好)。

下一节开始编写代码实现简单的骨骼动画

你可能感兴趣的:(PyOpenGL)