在球体场景查询的基础上,增加了AABB场景查询,并给与了碰撞次数的显示。
需要设置的全局变量是
int mCollisionNumber;
// OgreBites
OgreBites::ParamsPanel* mCollisionPanel;
下面的函数是设置碰撞次数的显示
//-------------------------------------------------------------------------------------
void Ogre_Rigid_Simple::SetupWidgets()
{
// Display the SdkTrays caption and value
Ogre::FontManager::getSingleton().getByName("SdkTrays/Caption")->load();
Ogre::FontManager::getSingleton().getByName("SdkTrays/Value")->load();
// Create name and value for query results
Ogre::StringVector names;
names.push_back("Collision");
char value[256];
sprintf(value, "%d", mCollisionNumber);
// Create a params panel to display the query results
mCollisionPanel = mTrayMgr->createParamsPanel(OgreBites::TL_BOTTOMRIGHT, "Collisions", 130, names);
mCollisionPanel->setParamValue(0, value);
}
下面的函数是根据AABB进行场景查询
//-------------------------------------------------------------------------------------
void Ogre_Rigid_Simple::SceneQueryByAABB()
{
// Setup AABB scene query for the dynamic node
Ogre::AxisAlignedBoxSceneQuery* pQuery=mSceneMgr->createAABBQuery(mDynamicModel->getWorldBoundingBox());
pQuery->setQueryMask(1);
// Execute this query
Ogre::SceneQueryResult QResult=pQuery->execute();
// Iterate objects in the query results
for (Ogre::SceneQueryResultMovableList::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
{
Ogre::MovableObject* pObject=static_cast<Ogre::MovableObject*>(*iter);
if(pObject)
{
if(pObject->getMovableType()=="Entity")
{
Ogre::Entity* ent = static_cast<Ogre::Entity*>(pObject);
if(ent->getName()==mDynamicModel->getName())
{
continue;
}
else
{
// Set the collision number
mCollisionNumber++;
char value[256];
sprintf(value, "%d", mCollisionNumber);
mCollisionPanel->setParamValue(0, value);
// Scale the dynamic node if the name of the entity is "StaticModel"
mDynamicNode->scale(1.0002f,1.0002f,1.0002f);
break;
}
}
}
}
}
下面是程序的运行截图
Updata 2012-06-15
扩展了Debug Drawing,可以对包围盒的形状、颜色进行改变,下图是将包围盒设为红色。