在球体场景查询的基础上,增加了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,可以对包围盒的形状、颜色进行改变,下图是将包围盒设为红色。