您的位置:首页 > 其它

OGRE碰撞检测之射线查询地形

2009-12-08 02:07 495 查看
//场景射线类:场景射线查询,全局指针变量,
RaySceneQuery* raySceneQuery = 0;

//在侦听器"FrameListener"类(继承于ExampleFrameListener)中,
//在侦渲染"FreameRendering"中执行场景射线一些列动作。

//射线类 静态:用于更新射线。
static Ray updateRay;
//设置射线起点。
updateRay.setOrigin(mCamera->getPosition());
//设置射线方向。
updateRay.setDirection(Vector3::NEGATIVE_UNIT_Y);
//将updateRay射线设置为场景查询射线。
raySceneQuery->setRay(updateRay);
//typedef std::vector<RaySceneQueryResultEntry> RaySceneQueryResult
//执行场景射线查询,并将结果存于qryResult容器中。
RaySceneQueryResult& qryResult = raySceneQuery->execute();
//遍历qryResult容器中的射线查询。
RaySceneQueryResult::iterator i = qryResult.begin();
if (i != qryResult.end() && i->worldFragment)
{ //把摄像机定在地形10个单位高的地方(y值)。
mCamera->setPosition(mCamera->getPosition().x,
i->worldFragment->singleIntersection.y + 10,
mCamera->getPosition().z);
}

//应用"Application"类中析构函数中,删除射线场景查询
delete raySceneQuery;

//在创建场景函数createScene中,定义raySceneQuery,定义为场景中的场景射线查询,
//射线起点为相机原点,方向Y轴负方向,即垂直向下。
raySceneQuery = mSceneMgr->createRayQuery(
Ray(mCamera->getPosition(), Vector3::NEGATIVE_UNIT_Y));

//选择场景管理器,这里我们需要使用地形场景管理器
//场景管理器置于根节点
//TerrainSceneManager在terrainscenemanager.h中定义的一个类

//多场景管理器能支持场景管理器把自己的类型注册为字符串ID
//(比如“OctreeSceneManager”或“TerrainSceneManager”)。
//这样你就可以使用迭代的方法在管理器中找到自己所需要的具体实现,
//亦或者可以简单的使用最后一个被注册进来的管理器类型。

//Ogre自身提供两个场景管理器类型:OctreeSceneManager和TerrainSceneManager。
//OctreeSceneManager是一个通用的场景管理器。TerrainSceneManager是
//一个为高度场场景优化的场景管理器。
mSceneMgr = mRoot->createSceneManager("TerrainSceneManager");

//在创建场景函数createScene中
//将地形置于场景中,地形数据存储于.cfg文件中(默认为terrain.cfg)
//地形数据的制作,通过高度图heightmap的运用。下面语句等同mSceneMgr -> setWorldGeometry("myterrain.cfg");
string terrain_cfg("myterrain.cfg");
mSceneMgr -> setWorldGeometry(terrain_cfg);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: