骨骼动画

来源:互联网 发布:mac序列号查询激活日期 编辑:程序博客网 时间:2024/04/30 06:49
这回介绍另一种资源:骨骼动画.这部分主要是由我的同事写的.不过大致我也了解一些,所以在这里介绍一下.
一个骨骼动画资源会包含多个动画序列,我们叫它AnimPiece(这名字有点土).每一段AnimPiece通常相当于一个角色的动作.一个AnimPiece包括:

 

1.一个名字,使用字符串ID表示
2.骨骼的关键帧信息,存储格式见下图:

 

(挺象一张吉他谱吧,不错的旋律)

 

3.事件信息,一个AnimPiece可以包含多个事件,每个事件有一个名字(字符串ID)和一个时间.在播放动画到这个时间时会发出这个事件,外部可以响应这个事件做一些事情.

 

骨骼动画数据的内容并不复杂.不过它的生成方式还是有点麻烦的.

 

首先是它的导出方式.在这个engine里,我们会尽量只用一个步骤生成资源,换句话说就是尽量不使用多个步骤来制作资源.所谓多个步骤,举个例子,比如我们先从max里导出一段多个动作的骨骼动画,存在一个文件里,这是第一个步骤;然后由一个骨骼动画编辑器读入这个文件,在编辑器中把它分割为多个AnimPiece,再为每个AnimPiece设置事件点,再对它进行压缩,最后保存为一个骨骼动画资源.这是第二个步骤.这样做的坏处是,一旦有某个动作的动画作出了修改,这两个步骤就要从头走一遍,而我们之前在骨骼动画编辑器里做的所有工作都白做了.当然你可以用很多方法解决这个问题,比如写一个功能足够强大的编辑器,支持导入单个的动作动画,并能替换原有的某个AnimPiece的动画数据(而不影响其它配置信息).但这显然增加了编辑器的复杂度.我们的解决方法是,把这个编辑器直接挪到max内部去,直接在数据的源头进行编辑工作,而这个编辑器的功能可以相对简单许多.这样我们只需要一个步骤就可以生成我们需要的资源.

 

具体到骨骼动画资源的导出上,我们是这么做的.

 

我们通过插件的方式写了一个新的max的对象,(上图中的abone01),这个对象用来记录骨骼动画的各种相关信息,这些信息可以和骨骼数据一起被保存在.max文件里.我们可以通过max的编辑面板来编辑这些信息.而在资源导出时,导出插件会根据这些信息来对骨骼数据进行处理,来直接生成最终的骨骼动画资源.把资源生成的相关信息以自定义的数据格式保存在max文件里面,这样做既简化了编辑器的开发,又简化了美术导出资源的步骤,我觉得是一个值得推荐的方式.配合上资源热加载的机制,目前使用我们的导出插件,美术在max中作的修改只需要几秒钟后就可以在地图编辑器/游戏中看到效果.这会使美术更乐于去做一些细微的调节,以达到更为完美的效果.

 

骨骼动画资源生成的另一个问题是数据的压缩.从上面AnimPiece的数据存储方式你已经可以大致知道骨骼数据的压缩方式了, 首先我们会以固定的频率(目前是30帧/秒)对max中的骨骼动画进行采样.然后以每根骨骼作为一个Track分别进行压缩,(比如这个骨骼动画有40根骨骼,那么我们一共会有40x3个Track).压缩的方式就是普通的线性压缩,(假设有三个Key,K0,K1,K2,它们对应的时间分别是t0,t1,t2,我们用t1在K0,K2之间线性插值,得到K1', 如果K1和K1'之间的误差在容许范围内,则认为K1是可以丢弃的).此外,我们对旋转的数据采用了精简的方式存储,一个旋转是一个四元数,我们把它归一化后,用short类型来存储它的四个分量.这样可以节省一半的内存.

 

骨骼动画的压缩最近经历了一次大改,上面描述的是修改以后的方式,之前的方式是这样:

 

(这个旋律性差点)

 

我们把骨架上所有的骨骼的数据作为一个Key来处理,(无论有多少骨骼,我们一共只会有3个Track:Pos/Rotation/Scale),这样做的好处是在计算骨骼动画时,可以大大减少Key的查找次数,只有三个Track,意味着我们只需要进行三次二分查找,而修改后的方法将会需要多的多的查找次数.但是坏处也是显而易见的:压缩率太低,一个Key中有几十根骨骼,它们同时满足压缩的条件是比较难的,我们的测试数据大概只有不到10%(记不清是10%还是10个了,总之是很少)的Key可以被压缩掉.

 

下面是两种方法的比较:

 

测试环境是: 3500帧的骨骼动画,30帧/秒,42根骨骼的骨架系统,分为60个左右的AnimPiece.CPU为 Genuine Intel(R) 2140 @1.6GHz,都在保证压缩后动画没有明显变形的前提下.

 

最终我们还是选择了现在的方式.有一个需要注意的地方就是,同一个AnimPiece的骨骼数据在内存上要尽量紧密的排在一起,不要有空隙,这样可以提高计算动画时的性能.我估计是内存cache的命中率的影响.

 

在具体压缩的时候,我们还对不同部分的骨骼的压缩精度作了调整,越靠近根部的骨骼的误差限制会越严格,以避免动作走样,而骨架末端的骨骼(比如手腕,脚腕)则可以放宽限制.

 

此外,不同的AnimPiece可以设定不同的压缩精度,有些动作可能对误差不敏感,我们可以提高它们的压缩率.当然这需要美术来控制,上面的测试中没有做这方面的优化.

 

骨骼动画大致就是这样,下回介绍路径动画.
原创粉丝点击