bullet 物理引擎的角色控制器(character controller)

来源:互联网 发布:弹弓专卖店淘宝网 编辑:程序博客网 时间:2024/05/01 16:17

转载 :http://hi.baidu.com/ae8506/item/693a7975d4fd502ed6a89c56

作者:CYM  http://hi.baidu.com/ae8506/


角色控制器(character controller)是物理引擎必不可少的一部分

在bullet中可以通过btKinematicCharacterController和btPairCachingGhostObject来实现角色控制

其中btKinematicCharacterController类是致力于解决角色控制的类,他实现了滑动,爬梯子,跳跃等常见的动作.

在使用角色控制器之前先要包含以下几个文件

[cpp] view plaincopyprint?
  1. #include <BulletDynamics\Character\btKinematicCharacterController.h>  
  2. #include <BulletCollision\CollisionDispatch\btGhostObject.h>  


在头文件中声明以下两个对象

[cpp] view plaincopyprint?
  1. btKinematicCharacterController* m_character;  
  2. btPairCachingGhostObject* m_ghostObject;  

m_character就死角色控制器,m_ghostObject则是一个幽灵对象.

创建角色控制器(假设已经创建了物理世界并且可以通过physics对象调用)

[cpp] view plaincopyprint?
  1. //创建胶囊对象以及角色控制器   
  2. {  
  3. m_trans.setIdentity ();  
  4. m_trans.setOrigin (btVector3(0.0, 500.0, 0.0));  
  5.    
  6. m_ghostObject = new btPairCachingGhostObject();  
  7. m_ghostObject->setWorldTransform(m_trans);  
  8. physics->m_overlappingPairCache->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());  
  9. btScalar characterHeight=2.0f;  
  10. btScalar characterWidth =2.0f;  
  11. btConvexShape* capsule = new btCapsuleShape(characterWidth,characterHeight);  
  12. m_ghostObject->setCollisionShape (capsule);  
  13. m_ghostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT);  
  14.    
  15. btScalar stepHeight = btScalar(0.35);  
  16. m_character = new btKinematicCharacterController (m_ghostObject,capsule,stepHeight);  
  17.    
  18. //向世界中添加碰撞对象   
  19. physics->m_dynamicsWorld->addCollisionObject(  
  20. m_ghostObject,  
  21. btBroadphaseProxy::CharacterFilter,   
  22. btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);  
  23. physics->m_dynamicsWorld->addAction(m_character);  
  24. }  


根据用户输入,更新角色


[cpp] view plaincopyprint?
  1. //根据外部输入,更新角色   
  2. if (m_physics->m_dynamicsWorld)  
  3. {  
  4. ///设置行走方向   
  5. btTransform xform;  
  6. xform = m_ghostObject->getWorldTransform ();  
  7. //获取本地坐标向量,并且单位化   
  8. btVector3 forwardDir = xform.getBasis()[2];  
  9. btVector3 upDir = xform.getBasis()[1];  
  10. btVector3 strafeDir = xform.getBasis()[0];  
  11. forwardDir.normalize ();  
  12. upDir.normalize ();  
  13. strafeDir.normalize ();  
  14.    
  15. btVector3 walkDirection = btVector3(0.0, 0.0, 0.0);  
  16. btScalar walkVelocity = btScalar(1.1) * 4.0; // 4 km/h -> 1.1 m/s  
  17. btScalar walkSpeed = walkVelocity* deltaTime*2.0f;  
  18.   
  19. //控制前后行走,以及旋转方向,   
  20. if (m_render->m_keyboard->isKeyDown(OIS::KC_RIGHT))  
  21. {  
  22. float yaw=0.05f;  
  23. btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis();  
  24. orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),yaw));  
  25. m_ghostObject->getWorldTransform ().setBasis(orn);  
  26. }  
  27.    
  28. if (m_render->m_keyboard->isKeyDown(OIS::KC_LEFT))  
  29. {  
  30. float yaw=-0.05f;  
  31. btMatrix3x3 orn = m_ghostObject->getWorldTransform().getBasis();  
  32. orn *= btMatrix3x3(btQuaternion(btVector3(0,1,0),yaw));  
  33. m_ghostObject->getWorldTransform ().setBasis(orn);  
  34. }  
  35.    
  36. if (m_render->m_keyboard->isKeyDown(OIS::KC_UP))  
  37. {  
  38. walkDirection += forwardDir;  
  39. }  
  40.    
  41. if (m_render->m_keyboard->isKeyDown(OIS::KC_DOWN))  
  42. {  
  43. walkDirection -= forwardDir;  
  44. }  
  45.    
  46. if(m_render->m_keyboard->isKeyDown(OIS::KC_SPACE) && m_character && m_character->canJump())  
  47. {  
  48. m_character->jump();  
  49. }  
  50.    
  51. //按照方向移动角色   
  52. m_character->setWalkDirection(walkDirection*walkSpeed);  
  53. }  
  54.    
  55. //更新渲染对象   
  56. m_trans=m_ghostObject->getWorldTransform();  
  57. m_node->setPosition(m_trans.getOrigin().getX(),m_trans.getOrigin().getY(),m_trans.getOrigin().getZ());  
  58. m_node->setOrientation(m_trans.getRotation().getW(),m_trans.getRotation().getX(),m_trans.getRotation().getY(),m_trans.getRotation().getZ());  



优酷视频

http://v.youku.com/v_show/id_XMzc4NTgyODky.html