运行截图:
emmm...模型资源是在淘宝花5个大洋买的。实际有很多模型,带动画的只有6个,实际最后用3DMax导出fbx的模型assimp只有两个加载出来是正常的(现在已经都可以加载正常了,之前是自己的代码问题)。
assimp加载骨骼动画网上有很详细的教程,地址:http://ogldev.org,tutorial38。
这里只说下自己踩了坑的地方:
首先创建assimp的导入对象Assimp::Importer importer,这个导入对象不要在栈区创建,因为栈区创建的局部对象析构后,importer会把它加载的aiScene* scene 对象一起释放了,但是计算插值骨骼信息是需要保存aiScene指针的。
其次就是教程中每个顶点有4个骨骼插槽,测试教程中的模型没有问题,但是实际很多模型4个骨骼是不够的,比如自己测试的王昭君和李白模型,测试的时候各种乱各种蒙各种调,最后拓展成了16个骨骼插槽。
然后就是教程中直接用的是assimp库的矩阵,assimp库的矩阵对象是行主序,而自己程序也是行矩阵,但是但是但是,assimp的矩阵变换的规则是 Matrix * vector,来变换向量的,而自己工程中的是vector * matrix来变换,所以就有坑了,而且这个坑还不太好发现,所以就是要想在自己工程中用,需要把assimp中存储的矩阵都转置下。当然这个要看自己的math库的矩阵规则有关系,行列主序,变换规则。
emmm...感觉趟过的坑就这些吧。然后再就是说说对教程的看法。
教程中的骨骼动画难理解的地方就在于各种矩阵变换,实际它讲的远没有代码写得明白,所以直接看他的源码就会明白。
assimp每个骨骼关节保存了顶点从模型空间到骨骼空间的变换矩阵记作Mbone,所以计算最终的变换矩阵时,需要用单位矩阵先乘以这个Mbone,然后在骨骼空间中就可以随着骨骼在每一帧进行变换了,先乘当前骨骼的变换矩阵然后递归乘父亲骨骼,爷爷骨骼。。。等等向上递归到根节点。而每一层级的骨骼变换矩阵都应该按照 Mscale * Mrotation * Mtransformation这个顺序生成,就是相对空间向绝对(世界)空间的变换。
实际教程中记录根节点的变换矩阵并求逆保存了,emmm...没感觉到用处,自己的想法是为了递归时跟根节点的矩阵中和,变成了单位矩阵,保证根节点为单位矩阵?自己没有按照教程做这步,自己直接写死了根节点单位矩阵。
差不多就这些吧,写的乱糟糟。