Ogre中场景查询和碰撞检测

Ogre中场景查询相关类

基类SceneQuery、其子类RegionSceneQuery区域查询、RaySceneQuery射线查询、IntersectionSceneQuery相交查询

每种场景查询都有对应的SceneQueryResult和SceneQueryListener

查询结果分为场景中可移动的物体元素(MovableObject)和世界信息(复杂场景中的地形等不变的元素)


RegionSceneQuery区域查询的基本使用

//1.建立场景查询对象,根据查询区域分为球、AABB六面体、平面
//球
SphereSceneQuery* sQuery = mSceneMgr->createSphereQuery(Ogre::Sphere(mDynamicNode->getPosition(),100));
//AABB
AxisAlignedBoxSceneQuery* bQuery = mSceneMgr->createAABBQuery(mDynamicNode->_getWorldAABB());
//平面
PlaneBoundedVolumeListSceneQuery * pQuery = mSceneMgr->createPlaneBoundedVolumeQuery(PlaneBoundedVolumeList());

//2.调用execute(),查询所求区域内的对象
SceneQueryResult QResult = sQuery->execute();

//3.遍历查询结果,执行相应操作(本例子为增大区域内对象的大小)
for(SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end(); ++ iter)
{
	MovableObject* pObj = static_cast<MovableObject*> (*iter);
	if(pObj == NULL)
		break;

	if(pObj->getMovableType() == "Entity")
	{
		Entity* ent = static_cast<Entity*> (pObj);
		if(ent->getName() == "StaticModel")
		{
			mDynamicNode->setScale(mDynamicNode->getScale() + 0.0001f);
			break;
		}
	}
}

RaySceneQuery射线查询的基本使用

//1.创建射线
Ray ray = Ray("射线起点","射线方向");

//2.建立射线查询
RaySceneQuery* rQuery = mSceneMgr->createRayQuery(ray);

//3.调用execute(),查询与射线相交的对象
RaySceneQueryResult result = rQuery->execute();

//4.遍历查询结果,执行相应操作(本例子为增大相交对象的大小)
for(RaySceneQueryResult::iterator it = result.begin(); it != result.end(); it++)
{
	SceneNode* pNode = it->movable->getParentSceneNode();
	pNode->setScale(2,2,2);
}

IntersectionSceneQuery相交查询的基本使用

//1.建立相交查询
IntersectionSceneQuery* iQuery = mSceneMgr->createIntersectionQuery();

//2.调用execute(),查询整个场景的所有相交情况
IntersectionSceneQueryResult result = iQuery->execute();

//3.设置mask使得只查询指定对象的相交情况		ps:通过entity->setQueryFlags(1);设置对象的mask
iQuery->setQueryMask(1);

//4.遍历查询结果,执行相应操作(本例子为显示相交的对象的名字)
for(SceneQueryMovableIntersectionList::iterator it = result.movables2movables.begin(); it != result.movables2movables.end(); it++)
{
	SceneQueryMovableObjectPair pObj = static_cast<SceneQueryMovableObjectPair>(*it);
	std::cout<<pObj.first->getName()<<" : "<<pObj.second->getName()<<std::endl;
}


利用intersects方法直接计算两个对象是否相交

AxisAlignedBox spbox = mNode1->_getWorldAABB();
AxisAlignedBox cbbox = mNode2->_getWorldAABB();
if(spbox.intersects(cbbox))//相交
{
		Node2->setScale(0.5,0.5,0.5);
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值