简单的Camera动画

转载自: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值