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);
}