欢迎来到NiceSpace!祝大家开心每一天!
  • C++
  • 图形学
基于Assimp的骨骼动画实现

运行截图:

 

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库的矩阵规则有关系,行列主序,变换规则。

  *************************

  好吧,piapia自己打脸,我写这条的时候我又检查了下转置,发现有一个矩阵漏掉了,改好后所有模型动画都没问题了。我还把原因归结于assimp加载fbx有问题,羞愧。

  果然记录博客是真有用呀,要不然我可能以后也发现不了这个问题。/手动捂脸

  *************************

  emmm...感觉趟过的坑就这些吧。然后再就是说说对教程的看法。

  教程中的骨骼动画难理解的地方就在于各种矩阵变换,实际它讲的远没有代码写得明白,所以直接看他的源码就会明白。

  assimp每个骨骼关节保存了顶点从模型空间到骨骼空间的变换矩阵记作Mbone,所以计算最终的变换矩阵时,需要用单位矩阵先乘以这个Mbone,然后在骨骼空间中就可以随着骨骼在每一帧进行变换了,先乘当前骨骼的变换矩阵然后递归乘父亲骨骼,爷爷骨骼。。。等等向上递归到根节点。而每一层级的骨骼变换矩阵都应该按照 Mscale * Mrotation * Mtransformation这个顺序生成,就是相对空间向绝对(世界)空间的变换。

  实际教程中记录根节点的变换矩阵并求逆保存了,emmm...没感觉到用处,自己的想法是为了递归时跟根节点的矩阵中和,变成了单位矩阵,保证根节点为单位矩阵?自己没有按照教程做这步,自己直接写死了根节点单位矩阵。

  差不多就这些吧,写的乱糟糟,没白写,哈哈,找到自己的问题了。

随机文章
Django本地配置ckeditor(windows系统) 3D图形学总结(六)—背面消除与物体剔除 深入理解字符串(编码,解码,乱码问题) 3D图形学总结(一)—世界坐标转换 Apache+mod_wsgi本地部署Django(Windows系统)
推荐文章