基于OpenGL的角色动画实现


我的本科毕设做的是一个BVH文件解析,角色关节也是一个多叉树,层次变换树。孩子节点依赖于结点的变换。上图中的角色以躯干Torso为根节点,脖子和头属于一个子树;左右手臂、左右腿分别属于四个子树,所以上图是一个五叉层次变换树。尤其强调的是手臂支持三个维度的运动,所以需要需要增加x,y,z的三层虚节点。右手臂的子树为:

Torso/RShoulderX / RShoulderY/RShoulderZ (RUpperArm) / RLowerArm

骨架建模多层变换树的构建

  1.  SkelArc是骨架分支类,其内部有一个SkelNode
  2.  SkelNode为骨架结点类, 其内部有一个Shape元素 用来渲染结点的图形样式,其内部还有一个vector。即一个结点的下面又可以添加多个分支。
基于SkelArc和SkelNode可以构建一个层次树。

程序中humanskeleton::buildSkeleton 函数用来创建骨架。

Skeleton体系中定义了NodeVisitor和ArcVisitor的虚基类,通过访问器模式修改层次树的数据

关键帧驱动器骨架动画的实现

虚基类Framer,主要保存骨架的各个分支的旋转角度,update函数表示更新帧数据,FKramer表示前向动力学,IKFramer表示逆向动力学。

FKFramer::update(std::map & angles) 函数根据时间对关键帧数据进行插值处理,将插值结果存储到angles中传出。angles中保存SkelArc名字到旋转角度的映射。

人物角色定义:骨架+帧驱动器

Animation类内部的Actor是角色类,其内部包含了三个数据成员:    

  • Skeleton* skeleton_;  骨架系统
  • Framer* framer_;  帧驱动器
  • angles_t angles_;  骨架分支的角度映射表

Animation类中定义两个SkelArc的访问器:

  • ActorInitializer 初始化骨架各个分支的旋转角度
  • ActorUpdater更新骨架分支的旋转角度

最后说明一下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/


你可能感兴趣的:(三维动画,随想&&感想,算法,C++,OpenGL,三维造型,OpenGL技术专栏)