上找到它。
我決定把其中最核心的一段**挑出來,詳細解讀。
//ray,求交射線;result,與模型麵片的交點;target,相交物體;closest_distance,距離最近交點的距離;querymask,碰撞檢測掩碼
bool collisiontools::raycast(const ogre::ray &ray, ogre::vector3 &result,ogre::movableobject* &target,float &closest_distance, const ogre::uint32 querymask)
} else
// 注意哦,到這裡我們已經得到一系列按照包圍盒檢測到的模型了.
// 我們要找到第乙個相交的物體.
// 這就意味著我們不必去檢測後面的物體了,這樣大大節省了時間
// 但是很遺憾,我們不得不遍歷每乙個物體的三角面,聽起來是多麼痛苦,必須得忍
// //初始化最小距離為-1
closest_distance = -1.0f;
ogre::vector3 closest_result;
ogre::rayscenequeryresult &query_result = mrayscenequery->getlastresults();//取回剛才查詢的結果,因為之前並沒有儲存
for (size_t qr_idx = 0; qr_idx < query_result.size(); qr_idx++)
// 我們只關心碰撞的東西是個物體
if ((query_result[qr_idx].movable != null)
&&(query_result[qr_idx].movable->getmovabletype().compare("entity") == 0))
} }
// 釋放剛才申請的記憶體,這種東西當然是在寫申請的時候就要成對編寫的了,正如同時寫下{}
delete vertices;
delete indices;
//如果找到新的點,不要忘了更新相應資訊
if (new_closest_found)
} }
// 返回結果
if (closest_distance >= 0.0f)
else
}
OGRE 地形碰撞檢測
我們現在要實現它,以便當我們向著地面移動時,能夠不穿過地面。因為baseframelistener已經處理了攝像機移動,所以我們就不用碰那些 了。替代地,在baseframelistener移動了攝像機後,我們要確保攝像機在地面以上10個單位處。如果它不在,我們要把它移到那兒。請跟緊這段 我們將在本...
Ogre中的碰撞檢測
基於射線查詢的方式,實現攝像機和地形的碰撞檢測,防止攝像機穿透地面,這也是ogre demo中terrian例子中的方法。首先定義 rayscenequery rayscenequery 0 在createscene時候,建立場景查詢 framerenderingqueued事件中,進行射線查詢,設...
Ogre中的碰撞檢測 1
基於射線查詢的方式,實現攝像機和地形的碰撞檢測,防止攝像機穿透地面,這也是ogre demo中terrian例子中的方法。首先定義 rayscenequery rayscenequery 0 在createscene時候,建立場景查詢 framerenderingqueued 事件中,進行射線查詢,...