MultiBodySoftContact.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "MultiBodySoftContact.h"
  2. #include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h"
  3. #include "BulletDynamics/Featherstone/btMultiBodyJointFeedback.h"
  4. #include "../CommonInterfaces/CommonMultiBodyBase.h"
  5. #include "../Utils/b3ResourcePath.h"
  6. //static btScalar radius(0.2);
  7. struct MultiBodySoftContact : public CommonMultiBodyBase
  8. {
  9. btMultiBody* m_multiBody;
  10. btAlignedObjectArray<btMultiBodyJointFeedback*> m_jointFeedbacks;
  11. bool m_once;
  12. public:
  13. MultiBodySoftContact(struct GUIHelperInterface* helper);
  14. virtual ~MultiBodySoftContact();
  15. virtual void initPhysics();
  16. virtual void stepSimulation(float deltaTime);
  17. virtual void resetCamera()
  18. {
  19. float dist = 5;
  20. float pitch = -21;
  21. float yaw = 270;
  22. float targetPos[3] = {0, 0, 0};
  23. m_guiHelper->resetCamera(dist, yaw, pitch, targetPos[0], targetPos[1], targetPos[2]);
  24. }
  25. };
  26. MultiBodySoftContact::MultiBodySoftContact(struct GUIHelperInterface* helper)
  27. : CommonMultiBodyBase(helper),
  28. m_once(true)
  29. {
  30. }
  31. MultiBodySoftContact::~MultiBodySoftContact()
  32. {
  33. }
  34. void MultiBodySoftContact::initPhysics()
  35. {
  36. int upAxis = 2;
  37. m_guiHelper->setUpAxis(upAxis);
  38. btVector4 colors[4] =
  39. {
  40. btVector4(1, 0, 0, 1),
  41. btVector4(0, 1, 0, 1),
  42. btVector4(0, 1, 1, 1),
  43. btVector4(1, 1, 0, 1),
  44. };
  45. int curColor = 0;
  46. this->createEmptyDynamicsWorld();
  47. m_dynamicsWorld->setGravity(btVector3(0, 0, -10));
  48. m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld);
  49. m_dynamicsWorld->getDebugDrawer()->setDebugMode(
  50. //btIDebugDraw::DBG_DrawConstraints
  51. +btIDebugDraw::DBG_DrawWireframe + btIDebugDraw::DBG_DrawContactPoints + btIDebugDraw::DBG_DrawAabb); //+btIDebugDraw::DBG_DrawConstraintLimits);
  52. //create a static ground object
  53. if (1)
  54. {
  55. btVector3 groundHalfExtents(50, 50, 50);
  56. btBoxShape* box = new btBoxShape(groundHalfExtents);
  57. box->initializePolyhedralFeatures();
  58. m_guiHelper->createCollisionShapeGraphicsObject(box);
  59. btTransform start;
  60. start.setIdentity();
  61. btVector3 groundOrigin(0, 0, -50.5);
  62. start.setOrigin(groundOrigin);
  63. // start.setRotation(groundOrn);
  64. btRigidBody* body = createRigidBody(0, start, box);
  65. //setContactStiffnessAndDamping will enable compliant rigid body contact
  66. body->setContactStiffnessAndDamping(300, 10);
  67. btVector4 color = colors[curColor];
  68. curColor++;
  69. curColor &= 3;
  70. m_guiHelper->createRigidBodyGraphicsObject(body, color);
  71. }
  72. {
  73. btCollisionShape* childShape = new btSphereShape(btScalar(0.5));
  74. m_guiHelper->createCollisionShapeGraphicsObject(childShape);
  75. btScalar mass = 1;
  76. btVector3 baseInertiaDiag;
  77. bool isFixed = (mass == 0);
  78. childShape->calculateLocalInertia(mass, baseInertiaDiag);
  79. btMultiBody* pMultiBody = new btMultiBody(0, 1, baseInertiaDiag, false, false);
  80. btTransform startTrans;
  81. startTrans.setIdentity();
  82. startTrans.setOrigin(btVector3(0, 0, 3));
  83. pMultiBody->setBaseWorldTransform(startTrans);
  84. btMultiBodyLinkCollider* col = new btMultiBodyLinkCollider(pMultiBody, -1);
  85. col->setCollisionShape(childShape);
  86. pMultiBody->setBaseCollider(col);
  87. bool isDynamic = (mass > 0 && !isFixed);
  88. int collisionFilterGroup = isDynamic ? int(btBroadphaseProxy::DefaultFilter) : int(btBroadphaseProxy::StaticFilter);
  89. int collisionFilterMask = isDynamic ? int(btBroadphaseProxy::AllFilter) : int(btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
  90. m_dynamicsWorld->addCollisionObject(col, collisionFilterGroup, collisionFilterMask); //, 2,1+2);
  91. pMultiBody->finalizeMultiDof();
  92. m_dynamicsWorld->addMultiBody(pMultiBody);
  93. btAlignedObjectArray<btQuaternion> scratch_q;
  94. btAlignedObjectArray<btVector3> scratch_m;
  95. pMultiBody->forwardKinematics(scratch_q, scratch_m);
  96. btAlignedObjectArray<btQuaternion> world_to_local;
  97. btAlignedObjectArray<btVector3> local_origin;
  98. pMultiBody->updateCollisionObjectWorldTransforms(world_to_local, local_origin);
  99. }
  100. m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
  101. }
  102. void MultiBodySoftContact::stepSimulation(float deltaTime)
  103. {
  104. if (/* DISABLES CODE */ (0)) //m_once)
  105. {
  106. m_once = false;
  107. m_multiBody->addJointTorque(0, 10.0);
  108. btScalar torque = m_multiBody->getJointTorque(0);
  109. b3Printf("t = %f,%f,%f\n", torque, torque, torque); //[0],torque[1],torque[2]);
  110. }
  111. m_dynamicsWorld->stepSimulation(deltaTime);
  112. }
  113. class CommonExampleInterface* MultiBodySoftContactCreateFunc(struct CommonExampleOptions& options)
  114. {
  115. return new MultiBodySoftContact(options.m_guiHelper);
  116. }