要弄明白这个例子先让我们来看看OGRE中RaySceneQuery目的和使用方法。RaySceneQuery继承于SceneQueryListener和SceneQuery。这一系列类是用来在场景中执行查询操作的。例如查找与指定区域相交的world geometry。他们的继承结构图如下:
这个Demo中使用的RayScenQuery是查找与指定Ray: updateRay;相交的world geometry。它设置Ray的起点为摄像机的位置
updateRay.setOrigin(mCamera->getPosition());
Ray的方向为垂直向下
updateRay.setDirection(Vector3::NEGATIVE_UNIT_Y);
这样就找出了与地面的交点。从而可以确定高度,既而就可以调整摄像机的高度,模拟出颠簸的感觉。
RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment)
{
SceneQuery::WorldFragment* wf = i->worldFragment;
mCamera->setPosition(mCamera->getPosition().x,
i->worldFragment->singleIntersection.y + 10,
mCamera->getPosition().z);
}