一个动画状态类的对象对应一个动画类的对象, AnimationState的数据成员mAnimationName与Animation类的数据成员mName是相对应的。它保存相应动画的状态。
动画状态包括动画名、当前时间点,动画长度(总时间)、动画权重和动画的enable开关。
AnimationState(const String& animName, Real timePos, Real length, Real weight = 1.0, bool enabled = false);
设置动画是否启用。
void setEnabled(bool enabled);
如果动画当前被激活,返回真。
bool getEnabled(void) const;
移动当前时间点,让动画状态在动画时间线上向前移动。参数为移动量。
void addTime(Real offset);
还可以复制别的动画状态,可保留动画名,拷贝除此之外的所有东西。
void copyStateFrom(const AnimationState& animState);
还可以拷贝一个子集动画状态从源到目标。这一个常规假设目标是源的一个子集,它将会拷贝所有的动画状态和来自源的设定目标。
_OgreExport void CopyAnimationStateSubset(AnimationStateSet& target, const AnimationStateSet& source);
Ogre::SceneManager继承关系图
若图片无法显示请联系QQ752018766图3.7
这个类定义了场景管理体系的基本行为,它可以创建场景中的物体并将他们
发送给渲染系统。
Ogre::SceneManager继承关系图若图片无法显示请联系QQ752018766
图3.8
场景管理器负责动画和动画状态的创建与文护。在场景管理器里保存有
mAnimationsList(动画列表)和mAnimationStates(动画状态列表),其中每个动画和动画状态通过名字一一对应。
场景管理器中有一个很重要的方法_applySceneAnimations ,它在每次渲染时(_renderScene函数里)都会被调用(自动调用不需要程序员控制),它的任务是在每一帧渲染前根据动画状态更新动画,完成动作。_applySceneAnimations方法遍历全部的动画状态,并根据这些状态找出与之一一对应的动画,再找出每个动画中的全部动画轨迹,在每个轨迹里都保存有该轨迹控制的节点。_applySceneAnimations方法先将这些被动画控制的节点都还原为初始状态,而后再调用动画的apply方法将全部节点更新到新的位置、大小或方向,从而使动画向前进行。
通过FrameLisener调用动画状态的addTime方法,可以完成动画状态的更新。场景管理器的_applySceneAnimations方法会根据新的动画状态将对应动画的相关节点的位置、大小和方向也更新,这就是OGRE中实现动画的基本原理和方法。
一个entity是指能在场景中移动的物体,3D游戏中的角色模型就是一个entity。一个entity可以是一辆车,一个人,一条狗等等的可动角色,entity的唯一条件就是在世界坐标系中是变化的。
不同的物体模型(Entities)都是基于一些不同的网格模型(meshes)创建,一个entity基于自己的一个mesh创建。但是,多个相同entity(物体模型)能基于同一个mesh(网格模型)创建,因此你可以在场景中创建多个相同的物体模型(entity),而这些物体模型(entity)都是基于同一个网格模型(mesh)创建的。
你可以通过调用 SceneManager::createEntity方法来创建一个entity,SceneManager::createEntity函数中有几个参数,你需要给出一个名字,这个名字就是你创建的entity的名字,还有你要给出这个entity是基于那个mesh创建的(例如 : createEntity(firstentity , ninja.mesh))。不过在这里SceneManager(场景管理器)必须保证这个mesh(ninja.mesh)被MeshManager资源管理器加载。
如果你不把这个物体模型(entity)绑定到场景节点(SceneNode),这些Entities是不会在场景中显示的。
当一个mesh(网格模型)被加载,将自动定义一系列材质,因为一个mesh(网格模型)需要许多材质,不同的部分是需要不同的材质的,就像一个人身体每部分穿的衣服颜色都不同一样,因此这里也需要许多不同的材质来渲染一个物体模型。任何一个由mesh创建的entity都将自动的使用默认的材质,但是,也可以自己去改变,因此,你可以在基于同一个mesh创建的多个entity中拥有不同的材质,也就是每一个entity都有不同于其他entity的材质,虽然这些entity都是基于同一个mesh创建的。
所有的mesh模型实际上都是由SubMesh构成,每一个SubMesh都是一种材质所对应的mesh中的一部分,如果一个mesh只使用了一种材质,那它将只拥有一个SubMesh。
当你基于Mesh创建了一个Entity,这个Entity也是由许多的SubEntity构成的,每一个SubEntity跟SubMesh是一一对应的,这些SubMesh集合即构成一个Mesh。你可以通过Entity::getSubEntity方法访问这些SubEntity 。还有,一旦你能访问这些SubEntity,你也可以通过Entity的setMaterialName方法改变材质,使用这种方法可以改变它的默认材质属性,创建自己个性化的模型。
Skeletal animation是通过移动一组分层级的骨架mesh模型来达到动画效果,通常创建这些动画是通过一些3D建模工具来实现的,比如Softimage XSI,Milkshape3D,Blender,3D Studio ,Maya等等,OGRE提供插件来允许你从这些模型中取得有用数据来为引擎所用。
OGRE支持以下一些特征:
1. 每一个Mesh对应一个skeleton-骨架
2. 每一个skeleton不限制骨头数量
3. 这些骨头是分层的,并且是符合正向运动学的
4. 每一个skeleton可以允许拥有多个动画状态序列,比如:走、跳、跑、射击等等不同的动作
5. 每一个动画状态是不限制关键帧数目的
6. 在各关键帧之间支持线性或者样条曲线的插补,使之动作连贯,逼真
7. 一个顶点可以分配或者说赋值给多个骨头并且每一个顶点都赋值了一个权重,这样可以做到关节处的连贯,不出现裂缝,光滑皮肤。
8. 当混合权重时,在同一时刻,多个动画状态能施加于同一mesh。
骨骼定义部分和骨骼动画状态序列都是保存在以 . skeleton为后缀名的文件中的,这是由OGRE插件产生的。当你基于一个mesh创建一个Entity时,将会自动产生这些以 . skeleton为后缀名的文件。骨骼动画可以在软件上工作,或者在独立的硬件上工作,如果有硬件支持的话。很明显有硬件支持是更好的选择,这样可以分担CPU许多工作,来让图形处理器来处理,会使得速度更加流畅,当然这同时意味着顶点数据将不再需要在每帧渲染时都要重新加载。当处理非常大的、复杂的模型时,这是非常重要的,因为这样的模型顶点数据将是巨量的。
骨骼动画可以与顶点动画相结合形成一种新的动画。
在模型文件中比较重要是人物Mesh,人物动画一般是通过关键帧或者骨骼动画实现的,现在的游戏大都采用骨骼动画。下面部分我们主要来分析骨骼动画。
在OGRE中,骨骼动画用骨架(由一系列骨头构成的继承体系)来单独保存动作信息,这样就将动作信息与网络、皮肤信息分割成两种数据结构分别进行处理,从而比以住的动画技术效率更高。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>