转载自: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);
}