我的本科毕设做的是一个BVH文件解析,角色关节也是一个多叉树,层次变换树。孩子节点依赖于结点的变换。上图中的角色以躯干Torso为根节点,脖子和头属于一个子树;左右手臂、左右腿分别属于四个子树,所以上图是一个五叉层次变换树。尤其强调的是手臂支持三个维度的运动,所以需要需要增加x,y,z的三层虚节点。右手臂的子树为:
Torso/RShoulderX / RShoulderY/RShoulderZ (RUpperArm) / RLowerArm
骨架建模:多层变换树的构建
程序中humanskeleton::buildSkeleton 函数用来创建骨架。
Skeleton体系中定义了NodeVisitor和ArcVisitor的虚基类,通过访问器模式修改层次树的数据。
关键帧驱动器:骨架动画的实现
虚基类Framer,主要保存骨架的各个分支的旋转角度,update函数表示更新帧数据,FKramer表示前向动力学,IKFramer表示逆向动力学。
FKFramer::update(std::map<std::string, double> & angles) 函数根据时间对关键帧数据进行插值处理,将插值结果存储到angles中传出。angles中保存SkelArc名字到旋转角度的映射。
人物角色定义:骨架+帧驱动器
Animation类内部的Actor是角色类,其内部包含了三个数据成员:
Animation类中定义两个SkelArc的访问器:
最后说明一下Animation和Actor的关系,Animation可以对应多个Actor,本文代码一个Animation里面添加了两个Actor,每个Actor包含一个Skeleton和一个Framer。
代码下载
参考
1,Computer Animation http://dgraves.org/coursework/cs266
2,Human Motion Simulation Philip Yen, Spring 1998
http://www.nbb.cornell.edu/neurobio/land/OldStudentProjects/cs490-97to98/yen/