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);
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);
相关文章推荐
- Ogre中精确到三角面的碰撞检测(使用射线查询)
- OGRE 地形碰撞检测
- (转载)ue4碰撞检测及射线查询--LineTraceSingleByChannel 和 LineTraceSingleByObjectType
- 射线与地形的碰撞检测
- Ogre1.8.1射线实现碰撞检测例子源代码
- Ogre中场景查询和碰撞检测
- ue4碰撞检测及射线查询
- 3D模型下的鼠标拣选和碰撞检测-射线与圆的相交算法
- U3D Ray射线的创建和碰撞检测
- Ray创建射线,碰撞检测
- 射线使用-碰撞检测
- unity中摄像机跟随主角,摄像机穿墙,射线碰撞检测,摄像机穿墙跟随
- Ogre中的碰撞检测(完整版)
- 场景管理(二):场景上物体间以及物体地图间的碰撞检测(射线碰撞方式检测)
- Box2D 射线和AABB的碰撞检测
- Unity3d·射线·射线检测碰撞
- 在3D世界中创建不同的相机模式——检测相机与模型,墙或地形的碰撞
- C 实现射线检测多边形碰撞
- 利用射线进行碰撞检测做射击效果
- Unity 使用物理射线(Physics.Raycast),实现扇形区域碰撞检测三种方法