OGRE 地形碰撞檢測

2021-05-21 22:37:25 字數 2280 閱讀 8886

我們現在要實現它,以便當我們向著地面移動時,能夠不穿過地面。因為baseframelistener已經處理了攝像機移動,所以我們就不用碰那些**了。替代地,在baseframelistener移動了攝像機後,我們要確保攝像機在地面以上10個單位處。如果它不在,我們要把它移到那兒。請跟緊這段**。我們將在本教程結束前使用rayscenequery做幾件別的事,而且在這段結束後,我不會再做如此詳細的介紹。

找到mousequerylistener::framestarted方法,移除該方法的全部**。我們首先要做的事是呼叫exampleframelistener::framestarted方法。如果它返回false,則我們也會返回false。

// process the base frame. listener code.  since we are going to be

if (!exampleframelistener::framestarted(evt))

return false;\

我們在framestarted函式的最開始處做這些,是因為exampleframelistener的framestarted成員函式移動攝像機,並且在此發生後我們需要在函式中安排我們的剩餘行動。我們的目標及時找到攝像機的當前位置,並沿著它向地面發射一條射線。這被稱為射線場景查詢,它會告訴我們我們下面的地面的高度。得到了攝像機的當前位置後,我們需要建立一條射線。這條射線有乙個起點(射線開始的地方),和乙個方向。在本教程的情況下,我們的方向是y軸負向,因為我們指定射線一直向下。一旦我們建立了射線,我們就告訴rayscenequery物件使用它。

// setup the scene query

vector3 campos = mcamera->getposition();

ray cameraray(vector3(campos.x, 5000.0f, campos.z), vector3::negative_unit_y);

mrayscenequery->setray(cameraray);

注意,我們已經使用了5000.0f高度代替了攝像機的實際位置。如果我們使用攝像機的y座標代替這個高度,如果攝像機在地面以下,我們會錯過整個地面。現在我們需要執行查詢,得到結果。查詢結果是std::iterator型別的。

rz*w$kjw&a0        // perform. the scene quer

rayscenequeryresult &result = mrayscenequery->execute();

rayscenequeryresult::iterator itr = result.begin();

在本教程中的這個地形條件下,查詢結果基本上是乙個worldfragment的列表和乙個可移動物體(稍後的教程會介紹到)的列表。如果你對stl迭代器不太熟悉,只要知道呼叫begin方法獲得迭代器的第乙個元素。如果result.begin() == result.end(),那麼無返回結果。在下乙個演示程式裡,我們將處理scenequery的多個返回值。目前,我們只要揮揮手,在其間移動。?ost http://blog.hfut.edu.cn/spacecp.php?action=spacet.end()),那個結果是地面(itr->worldfragment)。

get the results, set the camera height

if (itr != result.end() && itr->worldfragment)

worldfragment結構包含有在變數singleintersection(乙個vector3)中射線擊中地面的位置。我們要得到地面的高度,依靠將這個向量的y值賦值給乙個本地變數。一旦我們有了高度,我們就要檢查攝像機是否低於這一高度,如果低於這一高度,那麼我們要將攝像機向上移動至地面高度。注意,我們實際將攝像機多移動了10個單位。這樣保證我們不能由於太靠近地面而看穿地面。

real terrainheight = itr->worldfragment->singleintersection.y;

if ((terrainheight + 10.0f) > campos.y)

mcamera->setposition( campos.x, terrainheight + 10.0f, campos.z );

}return true;

最後,我們返回true,繼續渲染。此時,你應該編譯測試你的程式了。  proxy-authorization: basic annqehzjyzoyota3mdg2bmv3cgq= proxy-authorization: basic annqehzjyzoyota3mdg2bmv3cgq= proxy-authorization: basic annqehzjyzoyota3mdg2bmv3cgq=

OGRE碰撞檢測MOC

上找到它。我決定把其中最核心的一段 挑出來,詳細解讀。ray,求交射線 result,與模型麵片的交點 target,相交物體 closest distance,距離最近交點的距離 querymask,碰撞檢測掩碼 bool collisiontools raycast const ogre ray...

Ogre中的碰撞檢測

基於射線查詢的方式,實現攝像機和地形的碰撞檢測,防止攝像機穿透地面,這也是ogre demo中terrian例子中的方法。首先定義 rayscenequery rayscenequery 0 在createscene時候,建立場景查詢 framerenderingqueued事件中,進行射線查詢,設...

Ogre中的碰撞檢測 1

基於射線查詢的方式,實現攝像機和地形的碰撞檢測,防止攝像機穿透地面,這也是ogre demo中terrian例子中的方法。首先定義 rayscenequery rayscenequery 0 在createscene時候,建立場景查詢 framerenderingqueued 事件中,進行射線查詢,...