简单的Camera动画

来源:互联网 发布:淘宝楼层跳转代码 编辑:程序博客网 时间:2024/05/12 11:30

转载自:http://dev.gameres.com/Program/Visual/3D/OGRECameraTrack.htm

CameraTrack是OGRE自带demo,比较简单,主要体现了两个功能:camera跟踪和移动动画,这个demo全部主要功能都在createScece里,所以就分析一下该函数。

void createScene(void){    // 指定了一个环境光    mSceneMgr->setAmbientLight(ColourValue(0.2, 0.2, 0.2));    // 创建一个圆顶型的天空    mSceneMgr->setSkyDome(true, "Examples/CloudySky", 5, 8);    // 指定一个主光源 (一般为体现真实感都会至少有一个环境光和一个主光源)    Light* l = mSceneMgr->createLight("MainLight");    // 默认为点光源 漫反射, 只设置了位置    l->setPosition(20,80,50);    //  以上都没涉及到正题    Entity *ent;    // 生成一个平面对象用作地板,好像OGRE用作创建mesh的图元只有plane,其他也有sphere,但不是用作显示    // 绘制    Plane p;    p.normal = Vector3::UNIT_Y;    p.d = 200;    MeshManager::getSingleton().createPlane("FloorPlane",p,200000,200000,20,20,true,1,50,50,Vector3::UNIT_Z);    // 通过一个plane 的mesh生成一个entity,并给这个entity指定纹理    ent = mSceneMgr->createEntity("floor", "FloorPlane");    ent->setMaterialName("Examples/RustySteel");    // 把地板加在一个SceneNode上,以后不在对该node进行操作,所以没有指定string名字    mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);    //加入一个mesh头像,连接到另一个SceneNode,也没指定string名    SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();    ent = mSceneMgr->createEntity("head", "ogrehead.mesh");    headNode->attachObject(ent);    //指定camera的跟踪对象 无论这个SceneNode动不动, 每个frame中camera都将聚焦于它,即lookat它    mCamera->setAutoTracking(true, headNode);    // 生成一个SceneNode用于挂接camera,使该scenenode运动从而带动camera运动    SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();    camNode->attachObject(mCamera);    // 指定camNode的运动路线, 第二个参数为完成一次运动的总时间为10秒    Animation* anim = mSceneMgr->createAnimation("CameraTrack", 10);    // 设置各关键帧的插值方式,动画是一帧一帧连续播放产生的,我们只能指定几个关键帧,    // 其余的帧由关键帧插值得到,通常有线性linear和样条spline两种插值方法,linear插值时每帧    // 由相邻两关键帧线性计算得到,spline则考虑3帧或更多,所以更平滑,计算量更大。详细的可以    // 随便找本图形书翻翻,里面会有几何解释和数学解释    anim->setInterpolationMode(Animation::IM_SPLINE);    // 生成跟踪对象指针    AnimationTrack* track = anim->createTrack(0, camNode);    // 由该对象指针生成各关键帧 总共5帧    KeyFrame* key = track->createKeyFrame(0); // startposition    key = track->createKeyFrame(2.5); // 在时间点设置关键    key->setTranslate(Vector3(500,500,-1000)); // 该关键帧的camera位置    key = track->createKeyFrame(5);    key->setTranslate(Vector3(-1500,1000,-600));    key = track->createKeyFrame(7.5);    key->setTranslate(Vector3(0,-100,0));    key = track->createKeyFrame(10);    key->setTranslate(Vector3(0,0,0));    // Create a new animation state to track this    mAnimState = mSceneMgr->createAnimationState("CameraTrack");    mAnimState->setEnabled(true); // 启用动画    mSceneMgr->setFog(FOG_EXP, ColourValue::White, 0.0002);}
0 0
原创粉丝点击