松原骨骼动画的驱动制作介绍及案例父子骨骼变换火系
第3章 角色始27 图3.3 人体骨骼组织结构图矩阵,借以更新全局变换矩阵。最终,通过该结构中的数据来更新皮 肤顶点信息,实现动画效果。 针对骨骼动画所涉及的每块骨骼,需要保存其关键帧数据,每个关键帧数据的内容包括:该帧的 编号,该帧中骨骼相对于父骨骼的平移信息以及旋转信息。由于此类信息上文中已经做出总结,这里 就不再多加讨论。
动画数据多种多样,比如在一个典型的高尔夫游戏中,其中一个角色,可能需要他的各种动画, 比如走动、击球、推杆、捡球、庆祝动作等。对于个人角色扮演类的游戏应用,需要的动作更多,如 果每个动画对应于一个文件,那么就需要很多个文件来保存动画数据。对于这些数据,选择适当的时 机对其进行载人是一个重要的问题。因为一款游戏可能有许多不同的角色,如果是在应用程序启动的 时候一次装载所有的数据,那么会造成比较慢的启动速度,更致命的是,它们将会占用大量的内存, 导致内存开销过大,而有些角色可能从前到后都没有使用过,造成内存资源的浪费。因此,在合适的 时间内对数据进行载人显得极为关键。
比如在游戏应用中,一般会有人物选择界面,可以根据用户的 选择动态地载入角色的全部动画或者部分动画。3.2.6 骨骼动画的驱动 在应用程序播放某一具体的动画过程中,骨骼动画引擎需要动态地根据指定的动画播放速度正常 驱动动画效果的产生。骨骼动画的驱动过程就是骨骼动画实时计算的过程。在交互式应用中,一般是 在用户输入某些控制命令后,角色模型开始完成相应动画。这就要求应用程序在接受命令后,需要动 态实时地完成这些工作。 当动画确定之后,一个具体的动画,在某一具体的时刻,其驱动步骤分述如下。 8 丧flash动画创作与后期视频处理技术*
1)对骨骼局部变换信息进行更新 确定动画在该时刻的两个插值关键帧,即找到该时刻之前之后的两个关键帧。然后按照时间对这 两个关键帧进行插值(应用中使用最多的是对其进行线性插值),从而确定每一块骨骼该时刻在父骨 骼坐标系下的变换信息(平移和旋转信息)。
2)对骨骼全局变换信息进行更新 对骨架层次结构进行遍历,从根骨骼开始,计算每一块骨骼相对于身体坐标的全局变换信息(一 般是用矩阵形式来表示),这一步骤是基于上一步骤完成的,由于第一步巾已经得出丁每一块骨骼的 相对变换信息,本步骤中只需从根进行递归遍历即可。
3)对网格顶点进行更新 对于皮肤网格中的所有顶点,计算其在身体坐标系下的位置和法线信息。根据每个顶点所关联的 骨骼以及对应的权值,就可以利用每块骨骼的全局变换信息对顶点进行变换。 每根骨骼存在两个相关的变换矩阵:局部变换矩阵和全局变换矩阵。局部变换矩阵记录了该骨骼 在父骨骼坐标系空间中的位置和朝向。全局变换矩阵用来决定该骨骼在整个角色空间中的位置和朝向 。在骨骼动画文件中存储的是骨骼的局部变换矩阵序列,骨骼的全局变换矩阵则需要通过额外的计算 来获得。由于骨骼的运动实现是通过层次结构互相影响的,所以全局变换矩阵不能一步获得。
下面举例说明全局变换矩阵的生成,如图3.4所示。首先看旋转变换,在图中有两块骨骼,左边的 父骨骼和右边的子骨骼,目标是获得两个骨骼的全局变换矩阵来更新皮肤顶点。于骨骼的局部变换矩 阵保存的是它相对于父骨骼旋转信息,但其父骨骼也有自己的变换信息,也做了旋转。因此,子骨骼 对于整个角色的全局变换矩阵,需要将其局部变换矩阵与父骨骼的变换矩阵相乘。如果矩阵中加入了 平移变换,可以执行同样的过程。 从例子中可以了解到父骨骼的局部变换矩阵不仅会影响到自身,而且还会影响到它的于骨骼。而 在根骨骼节点,它的全局变换矩阵就等于其自身的局部变换矩阵。这样旋转、平移变┏━━━━━━ ━━━━━━━━━━━━━━━━━━━━━┓┃ 九 ┃┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫┃厂,’V………一厂 T\r………— ┃┣━━━━━━━━━━━━━━━━━━━━━━━━ ━━━┫┃\,。1 - - - - - - - - - - - -\i.4_- - - - - -- -. ┃┣━━━━━━━━━━ ━━━━━━━━━━━━━━━━━┫┃ 儿 ┃┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫┃《八+ ┃┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ ┃\:i ┃┗━━━━━━━━━━━━━━ ━━━━━━━━━━━━━┛图3.,1 父子骨骼变换火系
转载请注明:
松原flash动画制作公司:http://www.flash520.com/city98/