随笔 - 32  文章 - 94  trackbacks - 0
<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(8)

随笔分类

随笔档案

好友连接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

主要是矩阵空间变换比较复杂,写下大概流程:

首先涉及到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) 阅读(2879) 评论(3)  编辑 收藏 引用 所属分类: 游戏编程

FeedBack:
# re: 终于成功导出蒙皮了 2010-01-19 12:59 陈昱(CY)
觉得有些步骤还写得含糊欠妥,尽量改正....  回复  更多评论
  
# re: 终于成功导出蒙皮了 2010-01-20 11:08 李佳
好吧 我承认 我看不懂  回复  更多评论
  
# re: 终于成功导出蒙皮了 2010-01-21 17:31 陈昱(CY)
厄...
先理解骨骼系统,实际是一棵(多棵?)层次树,树结点包含着变换矩阵,变换矩阵要建立在父节点的矩阵空间中
然后,蒙皮过程就是对那些受影响的顶点进行矩阵变换的操作....

还是先看书吧,我只是大概总结一下~  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理