通過設定不同的掩碼,可以實現有選擇的碰撞檢測,下面的**中,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...