由下面几个文章引发的欲望,让我自己也试着实现了一个基于2D的骨骼动画。
一篇讲述骨骼动画数学运算的文章
http://www.cnblogs.com/neoragex2002/archive/2007/09/13/891945.html
两篇讲述骨骼动画原理和实现的文章 一篇也是用的2D,老外的那篇用的是DX
http://www.cppblog.com/Leaf/archive/2010/12/31/137818.html
空明流转用C#写的一个,当然也可以下载源码。只是在他的BLOG中,他未解释任何东西。并且我也未曾下载任何源码,不知是否源码中有文档
http://www.cppblog.com/lingjingqiu/archive/2008/06/07/52463.aspx
很不爽的是,许多例子或原理讲的时候没有带旋转。 其实那才是重头戏。 空明流转的貌似有旋转,可惜C#我也看不懂。还不如自己来一个。
为了迎合广大人民群众的取向,先上图和上码。
源码下载地址 (所有源码和执行程序)
本来按照某种意义上来讲,这就算完事儿了。 但还是要简单介绍一下。
白色方块:骨骼位置
白色线条:骨骼空间的X轴(注意这是2D,因此只有X和Y轴)
蓝色方块:顶点
(要跟大家说一下对不起,因为我实在是不想仔细地去给一个让它们看起来会很美的数据。凑合着能表达意思就行)
按键:1 2 3 4 5 6 7 8(非小键盘)你自己按了就知道。
环境:C++ VS 2005 HGE(仅是用于渲染)。
关于那些代码
对于骨骼数据的存储,我并未采用兄弟+孩子节点的表示法。 而是将他们存在了一个数组里。 并标记一个骨骼的父骨骼在数组中的索引。
这样不管是从数据存储还是访问上,都很方便。
另外,骨骼数据并未存放着“它影响了哪些顶点,影响权重”等信息,这些则交由模型持有。 这样一来,骨骼数据本身就是一堆矩阵的数
据运算,并不涉及其它结构。 放哪都是一样的。 目前是2D的数据运算。 若有兄弟有蛋疼,将它换成3D数据试试。本想出一个很好的演示
样例,突然发现数据构建太费劲了,只好省去! 此次也没有做动画,而是做了一个手动控制。
关于这次蛋疼的目的
这次蛋疼的目的仅是想充分理解一下骨骼运算。因为公司的骨骼动画并非由我完成的,所以自己没有实际操刀做过。由此想自己实现一次,而3D
数据构造又太麻烦。 既然仅是数学运算,何必要找3D呢,2D即可。
关于这次的收获
这次写了顺便写了一个2D的向量和一个2D矩阵运算类。矩阵求逆那里很费了一下时间,后来才发现是一个地方写错了。 不过纠结总归有好处,至
少映像更深。 其间参考了许多原码,由此不得不说明一下我遇到的一些TIP
一、骨骼数据的存放一般是分开存放的。分为“位移,缩放,旋转”。 在动画插值时分别插值。 因为矩阵的线性插值形成的旋转效果是不对的。
(因为SIN COS)并非线性。而位移和缩放通常情况下是固定的常量。不需要进行插值,由此还能省去不少运算。
二、骨骼权重和要为1 (这句有点废)
三、用SHADER进行骨骼运算时,由于全都是世界矩阵。 由此可省掉一个(0,0,0,1)。 于是,一个骨骼矩阵可以节约一个寄存器。(这
也是老生常淡了)
四、能有耐心地看完DX的例子的人,一定是强人。 因为我一个也没坚持看完过。
五、多看看DX SDK,即使同一页,每一次你都会有新收获。
关于下一次蛋疼计划
整理一下先前写的那个3D例子。虽然与VCZH那个比起来很逊,但毕竟是自己生的。
有兴趣的朋友就下载来看看吧,一切尽在不言中,我自我感觉那代码比较好懂。不而要我多解释。 加上上面好几篇文章作为“巨人的肩膀”。
谢谢。
GMAIL: BOYUEGAME
时间到,洗洗睡!各位晚安。