我們現在要實現它,以便當我們向著地面移動時,能夠不穿過地面。因為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 事件中,進行射線查詢,...