Ogre中的碰撞檢測 4

2021-05-12 16:36:27 字數 3149 閱讀 4187

通過設定不同的掩碼,可以實現有選擇的碰撞檢測,下面的**中,ogre頭能被查詢器檢測到,而機械人由於掩碼不同,不能被檢測到。

code

#include ""

rayscenequery

*rayscenequery =0

;//event handler to add ability to alter curvature

class

terrainframelistener : 

public

exampleframelistener

bool

framerenderingqueued(

const

frameevent

&evt)

//建立球形查詢器,第二個引數表示掩碼,預設情況下為-1

spherescenequery 

*pquery

=mscenemgr

->

createspherequery(sphere(mcamera

->

getposition(),

10),

0x01

);scenequeryresult qresult

=pquery

->

execute();

for(std::list

<

movableobject

*>

::iterator iter 

=qresult.movables.begin(); iter 

!=qresult.movables.end();

++iter)

ogre::vector3 v 

=mcamera

->

getposition();

ogre::vector3 d 

=mcamera

->

getdirection();v =

v +d*

(-1);

mcamera

->

setposition(v);}}

}return

true;}

};class

public

public

~protected

:virtual

void

choosescenemanager(

void

)virtual

void

createcamera(

void)//

just override the mandatory create scene method

void

createscene(

void)//

set a nice viewpoint

mcamera

->

setposition(

707,

2500

,528

);mcamera

->

setorientation(quaternion(

-0.3486

, 0.0122

, 0.9365

, 0.0329

));//

mroot -> showdebugoverlay( true );

rayscenequery 

=mscenemgr

->

createrayquery(

ray(mcamera

->

getposition(), vector3::negative_unit_y));

//光線的位置和方向,垂直向下

entity

*ogrehead 

=mscenemgr

->

createentity(

"head", 

"ogrehead.mesh");

ogrehead

->

setqueryflags(

0x01

);//

和球形場景查詢器的掩碼相同,所以該實體能被球形實體檢測到

//建立ogre head實體,測試通過射線查詢movable來實現攝像機碰撞檢測

scenenode

*headnode 

=mscenemgr

->

getrootscenenode()

->

createchildscenenode(

"ogrehead");

headnode

->

attachobject(ogrehead);

headnode

->

setposition(

500.0

, 100.0

, 500.0

);headnode

->

scale(vector3(2,

2,2));

entity

*entrobot 

=mscenemgr

->

createentity(

"robot", 

"robot.mesh");

entrobot

->

setqueryflags(

0x02

);//

掩碼為2,不會和球形場景查詢器檢測到

scenenode

*robotnode 

=mscenemgr

->

getrootscenenode()

->

createchildscenenode(

"noderobot");

robotnode

->

attachobject(entrobot);

robotnode

->

setposition(

400.0

, 50.0

, 400.0

);robotnode

->

scale(vector3(2,

2,2));}//

create new frame listener

void

createframelistener(

void)};

Ogre中的碰撞檢測

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

OGRE 地形碰撞檢測

我們現在要實現它,以便當我們向著地面移動時,能夠不穿過地面。因為baseframelistener已經處理了攝像機移動,所以我們就不用碰那些 了。替代地,在baseframelistener移動了攝像機後,我們要確保攝像機在地面以上10個單位處。如果它不在,我們要把它移到那兒。請跟緊這段 我們將在本...

OGRE碰撞檢測MOC

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