您的位置:首页 > 其它

OGRE关于 Demo_FacialAnimation 例子的分析

2011-09-05 22:58 417 查看
转自:/article/2304129.html

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帧号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: