在Axiom中,Animation类用于管理动画,在此对象中主要管理着AnimationTrack对象,此对象用于管理动画的各种类型的每一桢.在Axiom中,动画类型主要有变形动画,姿态动画,骨骼动画以及他们之间的混合.而此对象的各子类如NodeAnimationTrack常用于骨骼动画.而VertexAnimationTrack常用于顶点动画(包括变形动画与姿态动画),还有一种是NumericAnimationTrack用于扩展动画功能.而KeyFrame管理一桢,主要属性是当前桢的位置(time).AnimationTrack子类与KeyFrame子类有对应关系,其中NumbericAnimationTrack对应NumericKeyFrame,NodeAnimationTrack对应的是TransformKeyFrame,先说一句,Bone这个类就是继承的Node这个类.而VertexAnimationTrack对应VertexMorphKeyFrame(变形动画桢)和VertexPoseKeyFrame(姿态动画桢).可以简单看下,TransformKeyFrame对应骨骼桢,在骨骼动画中,每桢不同的是骨骼的位置,所以他增加(Rotaton,Scale,Translate)用来表示骨骼的位置变动.而变形动画桢每桢都有不同的顶点集合,所以他增加了VertexBuffer用来表示顶点集合.  

  如上面图中,AnimationTrack对象主要管理多个桢(KeyFrame),在AnimationTrack中提供一个关键方法,根据GetKeyFrameAtTime,传入一个时间点,获取这个时间点在动画中的前一桢与后一桢,以及在这二桢之间的比例.还提供一个抽象方法Apply,供子类实现,让子类本身AnimationTrack结合对应的子类KeyFrame得到正确的展张属性.简单来说,GetKeyFrameAtTime当前桢的位置,而Apply是得到当前桢上的数据.

简单说下变形动画,在VerterAnimationTrack这个类,其中他的属性AnimationType指出对应实体是变形动画还是姿态动画,变形动画就如MD2动画格式,请参看MD2关键桢动画3D模型加载.在这里面,对应的VertexMorphKeyFrame用HardwareVertexBuffer保存了每一桢的数据.根据父类前面的GetKeyFrameAtTime得到当前所需要的二桢,然后实现父类Apply混合二桢正确以得到正确的HardwareVertexBuffer,在Axiom中,可以分别交给GPU处理和CPU处理,二者的实现过程一样,根据二桢以及在二桢间的位置来计算混合桢的数据,交给GPU的话,在此处只需传入二个桢的数据,以及二桢间的位置,上面的实现交给相关着色器代码实现.姿态动画了解不多,相关代码可以参考ApplyToVertexData与ApplyPoseToVertexData,大致意思应该混合每桢里的参考,和骨骼动画有些类似,会有权重,顶点间偏移信息.姿态动画多用于面部表情.

再来说下骨骼动画,可以先参考MD5骨骼动画模型加载, 骨骼动画用到的控制类是NodeAnimationTrack,他对应用的动画桢是TransformKeyFrame,不同顶点动画,根据线性插值当前二桢与二桢位置得到当前桢,在NodeAnimationTrack中,求得当前桢需要父类Animation里定义的二种插值算法,分别对应是旋转插值与常用插值.常用插值分为线性插值与平滑插值.旋转插值分为线性插值与球面插值.实际上旋转插值实用球面插值相当于常用的线性插值,我们简单想一下,旋转留下的曲线是一条球面曲线,他在单位时间内走的是球面,而不是线性的.这二种算法分别对应的是Quaternion里的Nlerp与Slerp,具体讲解一些网站都有详细介绍.不同的插值算法会有不同的结果,然后和上面的VerterAnimationTrack一样,在Apply里当前桢结合Node中计算骨骼坐标.

Node这个类比较重要,这里不详细说,只说一些和此处有关的,Node里面包含自己的集合类,就是树那一类型的结构,Node里Orientation,Position用来表示他自己的方法,有方法Transform与Rotate,默认这二个方法都是针对父Node来进行操作的.而Bone继承Node,也继承了这些元素.

重温下MD5骨骼动画模型加载,大致过程如下,静态文件包含一些mesh,mesh由一些三角形(面,相当于顶点索引),而每个顶点索引是关联上对应1-4个权重点,权重点有实际的位置,并关联到对应骨骼上.而在动画文件中,每桢中多个骨骼随着改变位置,相应的权重点跟着改变,跟着顶点变,顶点构成的面也随之变化了.

而Ogre中相应骨骼动画过程也差不多,我们可以理解MD5中的静态文件是Ogre中的mesh文件,在Axiom3D:Ogre中Mesh文件格式分析(一)在mesh文件中会保存面(顶点索引),顶点(实际位置),顶点与骨骼关联对象VertexBoneAssignment(顶点索引,骨骼索引,权重).其实这里的顶点就相当于MD5中的权重点,而在VertexBoneAssignment记录了对应的顶点与骨骼的联系.其实是和MD5算起来是一样的.

而在MD5中的动画文件是Ogre中的skeleton,在MD5中,每桢记录了不同的骨骼位置,Ogre中的skeleton也是如此,记录了每桢的不同位置.不同MD5的是,他每个骨骼桢的记录是单独分开的,如骨骼点一有八桢,而骨骼点二有十桢.MD5所有的骨骼点是一起记录的.

可能这么说有些不清楚,先看下相关的Ogre中的带骨骼动画的.mesh文件和skeleton的文件.(本来为二进制文件,图是转成的XML文件,请看OgreXmlConverter)

如上中,相关节点与代码关系.

类对象 节点 备注
IndexData faces 顶点索引
VertexData geometry 顶点数据
VertexBoneAssignment boneassignments 顶点,骨骼,权重信息
     
Animation animation length,动画时间
NodeAnimationTrack track node指向那个骨骼
TransformKeyFrame keyframe translate,rotate指定位置

结合整个处理过程,Ogre中骨骼动画会分别加载对应mesh文件与skeleton文件.在代码中骨骼动画是Entity对象,加载文件后,里的Mesh对象保存有顶点,纹理坐标,顶点索引,骨骼与顶点索引及权重信息.而Mesh关联的Skeleton会保存所有的Bone信息,以及每个Bone的NodeAnimationTrack.然后会调用Mesh中的CompileBoneAssignments,其中会编历Mesh的boneAssignments,把各个顶点关联的骨骼,权重存入VertexData中,大约如下操作,对应的VertexDeclaration增加一个4个字节(骨骼索引),4个float(4个权重),然后添加一个新的HarderVertexBuffer(OpenGL中),就是上面的骨骼索引与权重(4Byte+4float).至于为什么是4,这是因为每个顶点最多关联4个骨骼,如果过多,前面会对多余的去除,并重新分配权重最大的四个骨骼,不到4的部分都填充0.在这初始化过后就是动画部分.在Entity里的UpdateAnimation方法转到mesh中的skeleton中的NodeAnimationTrack,如变形动画中,GetKeyFrameAtTime得到当前桢的位置.而Apply会根据当前桢的位置求得当前骨骼位置(TransformKeyFrame中的translate,rotate.骨骼位置是在父节点的基础上求得,请看Node相关实现),在这里,如果是用CPU的方式计算顶点,就会调用Mesh的SoftwareVertexBlend,里面会对所有顶点执行BlendPosVector,这个过程就是上面说的MD5中的,骨骼位置变了(SoftwareVertexBlend方法中的matrices,代表各个骨骼的位置),然后每个顶点根据关联的骨骼与权重求得实际的位置.

可以看到,Ogre中的骨骼动画格式与MD5的区别不大,处理Ogre与我原来中的MD5关于顶点混合计算有些不同,Ogre的这种处理能很好的实现CPU与GPU处理共用大部分代码.

Axiom3D:Ogre动画基本流程与骨骼动画的更多相关文章

  1. cocos2dx骨骼动画Armature源码分析(一)

    源码分析一body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-to ...

  2. Unity3D 骨骼动画原理学习笔记

    最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...

  3. 浅谈Unity3D 骨骼动画

    转载请标明出处http://www.cnblogs.com/zblade/ 最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭 ...

  4. cocos2d-x开发记录:二,基本概念(骨骼动画)

    九,骨骼动画 1.骨骼动画vs Sprite sheets 你能使用sprite sheets 创建动画,它很快又容易.直到你意识到你的游戏需要大量的动画并且内存消耗越来越高,并且需要时间载入全部数据 ...

  5. three.js之初探骨骼动画

    今后的几篇郭先生主要说说three.js骨骼动画.three.js骨骼动画十分有意思,但是对于初学者来说,学起来要稍微困难一些,官方文档比较少,网上除了用圆柱体的例子就是引用外部模型的,想要熟练使用骨 ...

  6. Ogre骨骼动画

    转自:http://blog.csdn.net/yanonsoftware/article/details/1281516 OGRE的基本动画控制是很简单的,设置一个动画的操作是这样: // Set ...

  7. 骨骼动画的实现(OpenGL实现)

    人物模型动画一直是游戏中最重要的组成部分, 因此这里我们研究骨骼动画是如何实现的. 原理 首先模型通常是由多个三角形形成的网格构成, 每个三角形有三个顶点, 因此动画的根本原理就在于不同时间内为每个顶 ...

  8. 引擎设计跟踪(九.14.2b) 骨骼动画基本完成

    首先贴一个介绍max的sdk和骨骼动画的文章, 虽然很早的文章, 但是很有用, 感谢前辈们的贡献: 3Ds MAX骨骼动画导出插件编写 1.Dual Quaternion 关于Dual Quatern ...

  9. 【Away3D代码解读】(五):动画模块及骨骼动画

    动画模块核心存放在away3d.animators包里: Away3D支持下面几种动画格式: VertexAnimator:顶点动画 SkeletonAnimator:骨骼动画 UVAnimator: ...

随机推荐

  1. [vt][xen]xenserver初始安装增加第二块硬盘&xen图形界面安装vm&设置xen里vm开机启动

    为XenServer挂载/增加第二块硬盘的方法 注意: xen6.x和xen7.x vm导出导入是不兼容的.这点有点蛋疼 新买机器后安装xenserver(一般都买刻录机+dvd来刻录xen官网的io ...

  2. ssr.js数据模拟工具

    ssr相当于是搭建了一个 Mock Server ,构建假数据,然后把这些假数据存到 JSON 文件上,Mock Server 可以响应请求或者生成页面,当然也可以顺便生成 API 文档. 强制跨域访 ...

  3. UVa 10697 - Firemen barracks

    题目:已知三点.求到三点距离同样的点. 分析:计算几何.分三类情况讨论: 1.三点共线,不成立. 2.多点重叠,有多组解. 3.是三角形,输出中点. 说明:注意绝对值小于0.05的按0计算:负数的四舍 ...

  4. RVM切换ruby版本号

    RVM是Ruby Version Manager的缩写,是一个命令行工具,它能够让你轻松地安装,管理和使用多个版本号的Ruby.不同的rails项目使用等ruby和rails版本号不一样的时候.能够使 ...

  5. rpmverify命令用来验证已安装的rpm软件包的正确性

    -Va:验证所有软件包: 来自: http://man.linuxde.net/rpmverify -Va:验证所有软件包: [root@DB ~]# rpmverify -Va ....L.... ...

  6. 深入理解Java中的逃逸分析

    在Java的编译体系中,一个Java的源代码文件变成计算机可执行的机器指令的过程中,需要经过两段编译,第一段是把.java文件转换成.class文件.第二段编译是把.class转换成机器指令的过程. ...

  7. Docker 入门(Mac环境)- part 4 swarms

    part-4 Swarms 简介 这一节主要是介绍一下如何在集群模式下部署docker应用:集群的概念很好理解了,多台机器共同完成一项任务:和Hadoop那些集群一样,docker也相当于有一个管理机 ...

  8. 2015-07学习总结——网络编程(TCP/IP)

    之前学习的主要内容是单机上的处理,比如编程语言.游戏编程.数据库.多媒体编解码.其实对网络也有些接触,比如WWW.HTTP.UDP/TCP.RTP.RTMP.SNMP.FTP.单播组播.Telnet. ...

  9. Mysql异常问题排查与处理——mysql的DNS反向解析和客户端网卡重启

    中午刚想趴一会,不料锅从天降!!!Mysql连不上了....... 现象如下: 现象1:登录mysql所在服务器,连接MySQL 成功: 现象2:通过客户端远程连接MySQL,返回失败,如下: Ent ...

  10. visual studio如何附加到进程调试python命令

    既然是调试python脚本,那么我首先想到的是附加到进程(python.exe) 至于为什么不用F5直接启动python脚本呢,因为调用命令如下 C:> python test.py < ...