OGRE关于 Demo_FacialAnimation 例子的分析

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帧号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值