您的位置:首页 > 其它

OGRE关于 Demo_FacialAnimation 例子的分析

2011-04-29 13:21 429 查看
G主要是关于姿势动画的学习, 注意本例的姿势动画只用了一个帧

1. 注意CEGUI窗口的处理函数 参数必须为 const CEGUI::EventArgs& e, 否则会出现错误.
2. CEGUI窗口的EventSelectStateChanged事件, EventScrollPositionChanged事件等等, 都有相关的处理事件函数
3. 使用帧监听器的鼠标缓冲来拦截鼠标事件, 实现对CEGUI窗口的点击和处理
4. 重点函数为 handleScrollChanged, 里面处理了姿态动画的变化
manualKeyFrame->updatePoseReference
步骤: 1) 加载mesh纹理
2) 创建动画 createAnimation
3) 创建顶点轨迹跟踪 createVertexTrack
4) 创建顶点姿势关键帧 createVertexPoseKeyFrame, 只用了一个帧
5) 增加所有的姿势关联 addPoseReference
6) 关键帧的更新姿势关联 updatePoseReference
7) 调用动画状态的父通知来更新动画 getParent()->_notifyDirty();

1. FacialApplication 类
函数 createScene
设置环境光
创建两个光Light - MainLight, MainLight2
加载facial.mesh
创建动画 "manual"
该动画创建顶点轨迹 createVertexTrack - VertexAnimationTrack *track
该顶点轨迹再创建顶点姿势关键帧 createVertexPoseKeyFrame - manualKeyFrame
创建顶点姿势关键帧的姿势关联, 初始化为0
安装GUI系统
创建实体 facial.mesh
设置一些动画变量, speak, manual
创建节点挂接实体
设置相机
通过SchemeManager加载方案 "TaharezLookSkin.scheme" loadScheme
该系统缺省鼠标光标 TaharezLook MouseArrow
该系统缺省字体 BlueHighway-12
通过WindowManager创建CEGUI窗口 布局为facial.layout loadWindowLayout - sheet
该GUI系统表单为sheet
得到CEGUI的WindowManager wmgr
循环 SI_COUNT次数
得到各自的Scrollbar窗口 scrollbars[i]
订阅事件 handleScrollChanged
设置其不可用 false
得到按钮 Facial/Radio/Play - CEGUI::RadioButton* btn
设置其可选 为真 setSelected
订阅事件 handleRadioChanged
mPlayAnimation 为真

函数 handleScrollChanged
// 处理 scrollbar的变化
如果mPlayAnimation不为真
将参数 转换为 const CEGUI::WindowEventArgs&
得到该窗口名称 name
循环SI_COUNT, 得到等于name的scrollbar索引
如果i 不等于最后一个
manualKeyFrame要更新姿态关联
manualAnimState 调用其父的_notifyDirty函数: manualAnimState->getParent()->_notifyDirty();
返回真

函数 handleRadioChanged
mPlayAnimation 翻转其值
根据 mPlayAnimation 设置 speakAnimState 和 manualAnimState, scrollbar子窗口的状态
返回真

2. GuiFrameListener 类
基类: ExampleFrameListener , OIS::MouseListener
构造函数: 设置鼠标回调, 使用缓冲
函数 frameEnded
根据mShutdownRequested的值是否继续渲染
函数 frameRenderingQueued
首先调用基类的同函数
给speakAnimState增加时间
返回真

其余就是实现OIS::MouseListener的鼠标监听函数

重要函数和类
Ogre
VertexPoseKeyFrame 类
KeyFrame 类的特殊实现, 和一个Mesh::Pose相关 , 存储缓存中顶点子集的偏移, 用于提供一个可混合的POSE

Mesh 类
函数createAnimation
创建一个新的动画, 该动画是mesh的顶点运动产生的

VertexAnimationTrack 类
AnimationTrack 类的特殊实现, 用于处理顶点位置信息的变化

Animation 类
函数 createVertexTrack
创建 VertexAnimationTrack 用于实现顶点动画的位置数据
参数:
hanlde - 用于轨迹的句柄, 在之后可以访问轨迹. 在该Animation中 该句柄必须唯一, 用于标识出目标.
举例: 在mesh中, 该句柄必须关联到被修改的几何体索引, 0用于共享几何体, 1+用于等同于(index - 1)的SubMesh几何体
animType - 变体(morph)或者姿势(pose)动画: VAT_NONE, VAT_MORPH, VAT_POSE
函数 setTimePosition
设置该动画的时间位置

AnimationStateSet 类
函数_notifyDirty
在该状态集中设置dirty标识和dirty帧号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: