原創(chuàng) 韓舉
http://www.hjpdiy.com
Ogre采用樹(shù)樁管理場(chǎng)景中的各種"元素"(攝像機(jī)、燈光、物體等),所有的東西都掛在"樹(shù)"上,不在"樹(shù)"上的東西不會(huì)被渲染。
Ogre::SceneManager就是"樹(shù)"的管理者,Ogre::SceneNode是從SceneManager中創(chuàng)建的(當(dāng)然BSP和8*樹(shù)的管理也和這兩個(gè)類有關(guān),這暫時(shí)不討論)。
AABB(軸對(duì)齊包圍盒)
這個(gè)東西是碰撞檢測(cè)的基礎(chǔ)(怎么總想起JJYY呢),和它類似的還有OBB(有向包圍盒),由于OBB創(chuàng)建復(fù)雜,所以O(shè)gre采用了AABB。
最簡(jiǎn)單的碰撞檢測(cè):
通
過(guò)Ogre::SceneNode::_getWorldAABB()可以取得這個(gè)葉子節(jié)點(diǎn)的AABB(Ogre::AxisAlignedBox),
Ogre::AxisAlignedBox封裝了對(duì)AABB的支持,該類的成員函數(shù)Ogre::AxisAlignedBox::intersects
()可以判斷一個(gè)AABB和"球體、點(diǎn)、面以及其他面"的相交情況(碰撞情況)。
m_SphereNode樹(shù)的葉子,掛了一個(gè)"球"
m_CubeNode樹(shù)的葉子,掛了一個(gè)"正方體"
AxisAlignedBox spbox=m_SphereNode->_getWorldAABB();
AxisAlignedBox cbbox=m_CubeNode->_getWorldAABB();
if(spbox.intersects(cbbox))
{
//相交
}
區(qū)域查詢:
簡(jiǎn)單的講就是,查詢某一區(qū)域中有什么東西,分為AABB、球體、面查詢。
//創(chuàng)建一個(gè)球體查詢,這里的100是m_SphereNode掛著的那個(gè)球體的半徑
SphereSceneQuery * pQuery=m_SceneMgr->createSphereQuery(Sphere(m_SphereNode->getPosition(),100));
//執(zhí)行這個(gè)查詢
SceneQueryResult QResult=pQuery->execute();
//遍歷查詢列表找出范圍內(nèi)的物體
for (std::list<MovableObject*>::iterator iter = QResult.movables.begin(); iter != QResult.movables.end();++iter)
{
MovableObject* pObject=static_cast<MovableObject*>(*iter);
if(pObject)
{
if(pObject->getMovableType()=="Entity")
{
Entity* ent = static_cast<Entity*>(pObject);
//這里簡(jiǎn)化了操作,由于只有一個(gè)"球體"和一個(gè)"正方體",
//所以只判斷了球體和正方體的相交
if(ent->getName()=="cube")
{
//改變位置防止物體重疊
vtl=-vtl;
m_SphereNode->translate(vtl);
break;
}
}
}
}
相交查詢
遍歷所有的對(duì)象,找到一對(duì)一對(duì)的相交物體(廢話呀,相交當(dāng)然至少兩個(gè)物體)。
//創(chuàng)建相交檢測(cè)
IntersectionSceneQuery* pISQuery=m_SceneMgr->createIntersectionQuery();
//執(zhí)行查詢
IntersectionSceneQueryResult QResult=pISQuery->execute();
//遍歷查詢列表找出兩個(gè)相交的物體
for (SceneQueryMovableIntersectionList::iterator iter = QResult.movables2movables.begin();
iter != QResult.movables2movables.end();++iter)
{
SceneQueryMovableObjectPair pObject=static_cast<SceneQueryMovableObjectPair>(*iter);
//if(pObject)
{
String strFirst=pObject.first->getName();
String strSecond=pObject.second->getName();
//下面加入你自己的兩個(gè)物體相交判斷代碼,或者簡(jiǎn)單的用AABB的判斷方法,
}
}