Ogre Moc笔记

Ogre Moc笔记

MOC的资料不多,目前仅限于以下几处:
http://www.ogre3d.org/tikiwiki/Minimal+Ogre+Collision&structure=Libraries
http://www.ogre3d.org/forums/viewtopic.php?t=45267
http://sourceforge.net/projects/moc-collision/
http://www.ogre3d.org/forums/viewtopic.php?t=23440
http://code.google.com/p/minimal-ogre-collision-toolkit/

moc代码只有一个h和一个cpp文件,还算简洁的。也是很多年没有维护了,简单用用也算够了。

使用步骤
1、初始化
1 MOC::CollisionTools *  mCollisionTools;
2 //  init the collision handler
3 mCollisionTools  =   new  CollisionTools(mSceneMgr, mArtifexLoader -> mTerrainInfo);
4
5 //  set how far we want the camera to be above ground
6 mCollisionTools -> setHeightAdjust( 4.5f );
7
8 //  place the camera node on the ground
9 mCollisionTools -> calculateY(mCamNode);

2、碰撞检测
 1 //  calculate the new Y position: check vs. terrain & all objects flagged with ENTITY_MASK
 2 //  multiple masks possible like e.g. ENTITY_MASK|MY_MASK|ETC_MASK
 3 //  doGridCheck casts a 2nd ray, gridWidth=2.0f ogre units away from the exact camera position to 
 4 //  avoid falling through small wholes or gaps in hangbridges for example.
 5 mCollisionTools -> calculateY(mCamNode, true , true , 2.0f ,ENTITY_MASK);
 6
 7 //  check if we are colliding with anything with a collision radius of 2.5 ogre units and we 
 8 //  set the ray origin -1.0 lower towards the ground to get smaller obstacles too
 9 if  (mCollisionTools -> collidesWithEntity(oldPos, mCamNode -> getPosition(),  2.5f - 1.0f , ENTITY_MASK))
10 {
11    // undo move
12    mCamNode->setPosition(oldPos);
13}

3、鼠标拾取,射线查询
 1 void  SampleApp::pickEntity( const  OIS::MouseEvent  & arg,  const  Ogre::uint32 queryMask)
 2 {
 3    Entity *tmpE = NULL;
 4    Vector3 result = Vector3::ZERO;
 5    float distToColl;
 6    if (mCollisionTools->raycastFromCamera(mRenderWin, mCamera, arg, result, (ulong&)tmpE, distToColl, queryMask))
 7    {
 8        SceneNode* node = tmpE->getParentSceneNode();
 9        if (node->getShowBoundingBox()) 
10        {
11            node->showBoundingBox(false);
12        }
 else 
13        {
14            node->showBoundingBox(true);
15        }

16    }

17}

18
19 bool  SampleApp::mousePressed( const  OIS::MouseEvent  & arg, OIS::MouseButtonID id)
20 {
21    if ( id == OIS::MB_Left )
22    {
23        mLMouseDown = true;
24        pickEntity(arg, ENTITY_MASK);
25    }

26}

4、清理
delete mCollisionTools;

5、中文资料
http://archive.cnblogs.com/a/1914145/

你可能感兴趣的:(Ogre Moc笔记)