主要是矩阵空间变换比较复杂,写下大概流程:
首先涉及到4个重要的矩阵
1、各个骨骼的本地矩阵空间,这个在3dmax导出xml中直接得到,是NodeTM结点的信息
2、整个骨骼模型的矩阵空间,在循环过程中,所有骨骼的变换矩阵空间都要转化到整个骨骼模型的矩阵空间,其中根骨骼的本地矩阵空间和整个模型矩阵空间一样,而子骨骼则要一级一级转化到根骨骼的矩阵空间中
3、网格的自身矩阵,即导出的各个顶点数据都是在这个矩阵空间下的。
4、网格模型的矩阵,在3dmax中对物体进行各种旋转、移动操作,会影响到这个矩阵,这个在3dmax导出xml中直接得到,也是NodeTM结点的信息。
循环过程中的矩阵转化:
1、获得各个骨骼初始时刻时,在上面第2点的矩阵空间中的值Mb0,这个直接一级一级乘以父骨骼矩阵空间即可;(这一步在初始化时计算一次即可)
2、同样方法获得各个骨骼的t时刻,在上面第2点矩阵空间中的值Mbt;
3、Mb0到Mbt的变换矩阵Mbx,Mbx=(~Mb0)*Mbt;
4、对各个顶点,获取所绑定的骨骼的Mbx,Mbx和原始顶点相乘即得到这个顶点在t时刻,完全受该骨骼控制时的值,如果有多个骨骼控制,则计算多个值,根据权重进行分配,得出最终需要的顶点位置,这一步我在shader中实现。
这里有一点把我整了好久的就是:3dsmax中,骨骼对顶点影响的方式是:顶点在世界空间中的影响,即上面提到“矩阵转化”的第4步。顶点要乘以‘网格模型的矩阵’(上面提到矩阵的第4个),得到的新顶点才是骨骼要影响的顶点!!!!而我们在导出xml后,一般都是直接把顶点的数据做为Vertex Buffer Object,所以一般都是不改动的。而对于‘网格模型的矩阵’,我则在完成骨骼蒙皮后才乘上去。在3dmax中,骨骼对模型顶点的匹配却能够自动调整,即当你在3dmax中绑定好了骨骼动画后,再对模型进行动画关键帧设置时,动画关键帧是不会生效的!!!!!
于是我在这一点弄了好久才发现,最后我把所有对模型的平移、旋转等操作都设为0,直接在3dmax中对多边形的顶点元素进行移动、缩放、旋转(即相当于直接改变导出顶点数值,在3dmax中用那些旋转、平移、缩放工具是不会影响导出顶点数值的,而是影响了NodeTM标签),以匹配骨骼位置,这样才成功导出了和我程序算法一致的模型。这一点弄了好久。。。。。。。
不过终于还是整出来了,demo的模型是自己随便乱弄的一个模型,用的还是
上一篇日志那个很搞笑的biped动作~~颜色表示的是顶点的权重信息(第4个骨骼被忽略)。
蒙皮demo (关闭程序时,蓝色控制台下面命令行输入‘System.ShutDown’)
posted on 2010-01-18 19:59
陈昱(CY) 阅读(3035)
评论(3) 编辑 收藏 引用 所属分类:
游戏编程