Character.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "anki/physics/Character.h"
  2. #include "anki/physics/PhysWorld.h"
  3. #include "anki/physics/MotionState.h"
  4. #include "anki/physics/RigidBody.h"
  5. #include "anki/physics/PhysWorld.h"
  6. #include <algorithm>
  7. #include <bullet/btBulletCollisionCommon.h>
  8. #include <bullet/btBulletDynamicsCommon.h>
  9. #include <bullet/BulletCollision/CollisionDispatch/btGhostObject.h>
  10. #include <bullet/BulletDynamics/Character/btKinematicCharacterController.h>
  11. namespace anki {
  12. //==============================================================================
  13. // Contructor =
  14. //==============================================================================
  15. inline Character::Initializer::Initializer():
  16. characterHeight(2.0),
  17. characterWidth(0.75),
  18. stepHeight(1.0),
  19. jumpSpeed(10.0),
  20. maxJumpHeight(0.0),
  21. sceneNode(NULL),
  22. startTrf(Transform::getIdentity())
  23. {}
  24. //==============================================================================
  25. // Contructor =
  26. //==============================================================================
  27. Character::Character(PhysWorld& masterContainer_,
  28. const Initializer& init)
  29. : masterContainer(masterContainer_)
  30. {
  31. ghostObject = new btPairCachingGhostObject();
  32. motionState = new MotionState(init.startTrf, init.sceneNode);
  33. btAxisSweep3* sweepBp =
  34. dynamic_cast<btAxisSweep3*>(masterContainer.broadphase);
  35. ANKI_ASSERT(sweepBp != NULL);
  36. ghostPairCallback = new btGhostPairCallback();
  37. sweepBp->getOverlappingPairCache()->setInternalGhostPairCallback(
  38. ghostPairCallback);
  39. //collisionShape = new btCapsuleShape(init.characterWidth,
  40. // init.characterHeight);
  41. convexShape = new btCylinderShape(btVector3(init.characterWidth,
  42. init.characterHeight, init.characterWidth));
  43. ghostObject->setCollisionShape(convexShape);
  44. //ghostObject->setCollisionFlags(btCollisionObject::CF_CHARACTER_OBJECT);
  45. ghostObject->setWorldTransform(toBt(init.startTrf));
  46. character = new btKinematicCharacterController(ghostObject, convexShape,
  47. init.stepHeight);
  48. character->setJumpSpeed(init.jumpSpeed);
  49. character->setMaxJumpHeight(init.maxJumpHeight);
  50. // register
  51. masterContainer.dynamicsWorld->addCollisionObject(ghostObject,
  52. btBroadphaseProxy::CharacterFilter,
  53. btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);
  54. masterContainer.dynamicsWorld->addAction(character);
  55. masterContainer.characters.push_back(this);
  56. }
  57. //==============================================================================
  58. // Destructor =
  59. //==============================================================================
  60. Character::~Character()
  61. {
  62. masterContainer.characters.erase(std::find(
  63. masterContainer.characters.begin(),
  64. masterContainer.characters.end(), this));
  65. masterContainer.dynamicsWorld->removeAction(character);
  66. masterContainer.dynamicsWorld->removeCollisionObject(ghostObject);
  67. delete character;
  68. delete convexShape;
  69. delete ghostPairCallback;
  70. delete ghostObject;
  71. }
  72. //==============================================================================
  73. // rotate =
  74. //==============================================================================
  75. void Character::rotate(float angle)
  76. {
  77. btMatrix3x3 rot = ghostObject->getWorldTransform().getBasis();
  78. rot *= btMatrix3x3(btQuaternion(btVector3(0, 1, 0), angle));
  79. ghostObject->getWorldTransform().setBasis(rot);
  80. }
  81. //==============================================================================
  82. // moveForward =
  83. //==============================================================================
  84. void Character::moveForward(float distance)
  85. {
  86. btVector3 forward =
  87. -ghostObject->getWorldTransform().getBasis().getColumn(2);
  88. character->setWalkDirection(forward * distance);
  89. }
  90. //==============================================================================
  91. // jump =
  92. //==============================================================================
  93. void Character::jump()
  94. {
  95. character->jump();
  96. }
  97. } // end namespace