基于OpenGL的角色动画实现
来源:互联网 发布:结构体网络传输 编辑:程序博客网 时间:2024/05/21 13:59
我的本科毕设做的是一个BVH文件解析,角色关节也是一个多叉树,层次变换树。孩子节点依赖于结点的变换。上图中的角色以躯干Torso为根节点,脖子和头属于一个子树;左右手臂、左右腿分别属于四个子树,所以上图是一个五叉层次变换树。尤其强调的是手臂支持三个维度的运动,所以需要需要增加x,y,z的三层虚节点。右手臂的子树为:
Torso/RShoulderX / RShoulderY/RShoulderZ (RUpperArm) / RLowerArm
骨架建模:多层变换树的构建
- SkelArc是骨架分支类,其内部有一个SkelNode
- SkelNode为骨架结点类, 其内部有一个Shape元素 用来渲染结点的图形样式,其内部还有一个vector<SkelArc*>。即一个结点的下面又可以添加多个分支。
程序中humanskeleton::buildSkeleton 函数用来创建骨架。
Skeleton体系中定义了NodeVisitor和ArcVisitor的虚基类,通过访问器模式修改层次树的数据。
关键帧驱动器:骨架动画的实现
虚基类Framer,主要保存骨架的各个分支的旋转角度,update函数表示更新帧数据,FKramer表示前向动力学,IKFramer表示逆向动力学。
FKFramer::update(std::map<std::string, double> & 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/
- 基于OpenGL的角色动画实现
- OpenGL骨骼动画的实现
- 使用HttpModule实现基于角色的身份验证
- shiro实现基于角色的权限授权
- 骨骼动画的实现(OpenGL实现)
- 利用Opengl实现类似于角色漫游的场景
- 基于OpenGL的随机图动画演示框架与代码
- HDR渲染器的实现(基于OpenGL)
- HDR渲染器的实现(基于OpenGL)
- OpenGL: 基于OpenGL实现的多段Bezier曲线拼接
- 基于角色的安全控制的架构的实现实例
- 简单的RBAC基于角色的用户权限的实现
- RBAC(基于角色的访问控制)的实现
- ASP.net MVC 基于角色的权限控制系统的实现
- Survey Admin 示例:实现 Microsoft .NET 基于角色的安全性
- Acegi+hibernate 动态实现基于角色的权限管理
- Acegi+hibernate 动态实现基于角色的权限管理
- Acegi+hibernate 动态实现基于角色的权限管理
- at org.apache.jsp.index_jsp._jspInit(index_jsp.java:66) 初始化JSP页面时报NULL指针异常
- java.lang.OutOfMemoryError: Java heap space + myeclipse中分配tomcat启动时所占内存大小
- Android开发视频教程-深入浅出系列Lesson20-AFF111029学习Android界面开发的基础
- awk用法小结
- SOAP协议规范
- 基于OpenGL的角色动画实现
- typedef和define的详细区别
- spring spring事务配置的五种方式 此转载仅供个人保存备用
- 获取DataTable指定列的数据
- 星期天买车记
- Lucene相关研究资料
- Linux系统调用--fcntl函数详解
- GCC 选项备忘。
- 程序员真的“编码太多没时间思考”了吗