(本文旨在记录图形学相关学习过程中的点滴,不保证正确性以及专业性)
Mesh动画的实现大体有两种,一种是基于顶点变换,将所有顶点在不同时间的状态记录下来,然后进行逐帧播放。还有一种是基于绑定骨骼,将Mesh顶点与多个骨骼进行绑定,通过骨骼的变化带动顶点运动,需要在每帧计算骨骼位置,再计算各个顶点随骨骼变化后的位置,实时渲染大多采用这种方式。之前有了解过动作捕捉数据BVH,是一种用来保存骨骼位置信息的树形数据结构,以为骨骼动画的数据组织形式应该是差不多的,但实际上还真是差不多。
作案工具:
基于 C++,OpenGL,Assimp(数据读取),GLM(数学计算库)
骨骼动画原理:
我们从一个顶点vertex出发,假设vertex受到bone2的影响,bone2具有一个父节点bone1,也知道bone2到其父节点bone1的transform矩阵(在不使用骨骼动画时,这个矩阵就是绑定姿势下bone2到bone1的变换矩阵,但在动画过程中这个矩阵是会不断被插值计算得到),同时还知道bone2到世界坐标系下的offset矩阵(这个矩阵会帮我们把处于世界坐标下的mesh顶点转化到bone2的坐标系下),以及,bone1到世界坐标的transToWorld矩阵,那么一个顶点的最终位置是如何计算的呢?
我们先把被bone2影响的顶点(世界空间下)转化到bone2空间(offset),然后将bone2空间下的顶点位置进行相对bone1的位移变换(transform),然后将bone1空间下的点转化到世界空间(transToWorld),似乎绕了个大圈,如果我们采用绑定姿态的transform,其实这个过程是在做无用工,因为 transToWorld*transform 就是offset的逆矩阵,但是如果我们改变transform矩阵呢?这意味着,bone2相对bone1发生了变化,他可能进行了一定程度的旋转,这样我们计算得到的结果会是,这个受bon