MultiBodySoftContact.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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 = 270;
  21. float yaw = 21;
  22. float targetPos[3]={0,0,0};
  23. m_guiHelper->resetCamera(dist,pitch,yaw,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
  52. +btIDebugDraw::DBG_DrawContactPoints
  53. +btIDebugDraw::DBG_DrawAabb
  54. );//+btIDebugDraw::DBG_DrawConstraintLimits);
  55. //create a static ground object
  56. if (1)
  57. {
  58. btVector3 groundHalfExtents(50,50,50);
  59. btBoxShape* box = new btBoxShape(groundHalfExtents);
  60. box->initializePolyhedralFeatures();
  61. m_guiHelper->createCollisionShapeGraphicsObject(box);
  62. btTransform start; start.setIdentity();
  63. btVector3 groundOrigin(0,0,-50.5);
  64. start.setOrigin(groundOrigin);
  65. // start.setRotation(groundOrn);
  66. btRigidBody* body = createRigidBody(0,start,box);
  67. //setContactStiffnessAndDamping will enable compliant rigid body contact
  68. body->setContactStiffnessAndDamping(300,10);
  69. btVector4 color = colors[curColor];
  70. curColor++;
  71. curColor&=3;
  72. m_guiHelper->createRigidBodyGraphicsObject(body,color);
  73. }
  74. {
  75. btCollisionShape* childShape = new btSphereShape(btScalar(0.5));
  76. m_guiHelper->createCollisionShapeGraphicsObject(childShape);
  77. btScalar mass = 1;
  78. btVector3 baseInertiaDiag;
  79. bool isFixed = (mass == 0);
  80. childShape->calculateLocalInertia(mass,baseInertiaDiag);
  81. btMultiBody *pMultiBody = new btMultiBody(0, 1, baseInertiaDiag, false, false);
  82. btTransform startTrans;
  83. startTrans.setIdentity();
  84. startTrans.setOrigin(btVector3(0,0,3));
  85. pMultiBody->setBaseWorldTransform(startTrans);
  86. btMultiBodyLinkCollider* col= new btMultiBodyLinkCollider(pMultiBody, -1);
  87. col->setCollisionShape(childShape);
  88. pMultiBody->setBaseCollider(col);
  89. bool isDynamic = (mass > 0 && !isFixed);
  90. short collisionFilterGroup = isDynamic? short(btBroadphaseProxy::DefaultFilter) : short(btBroadphaseProxy::StaticFilter);
  91. short collisionFilterMask = isDynamic? short(btBroadphaseProxy::AllFilter) : short(btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
  92. m_dynamicsWorld->addCollisionObject(col,collisionFilterGroup,collisionFilterMask);//, 2,1+2);
  93. pMultiBody->finalizeMultiDof();
  94. m_dynamicsWorld->addMultiBody(pMultiBody);
  95. btAlignedObjectArray<btQuaternion> scratch_q;
  96. btAlignedObjectArray<btVector3> scratch_m;
  97. pMultiBody->forwardKinematics(scratch_q,scratch_m);
  98. btAlignedObjectArray<btQuaternion> world_to_local;
  99. btAlignedObjectArray<btVector3> local_origin;
  100. pMultiBody->updateCollisionObjectWorldTransforms(world_to_local,local_origin);
  101. }
  102. m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
  103. }
  104. void MultiBodySoftContact::stepSimulation(float deltaTime)
  105. {
  106. if (0)//m_once)
  107. {
  108. m_once=false;
  109. m_multiBody->addJointTorque(0, 10.0);
  110. btScalar torque = m_multiBody->getJointTorque(0);
  111. b3Printf("t = %f,%f,%f\n",torque,torque,torque);//[0],torque[1],torque[2]);
  112. }
  113. m_dynamicsWorld->stepSimulation(deltaTime);
  114. }
  115. class CommonExampleInterface* MultiBodySoftContactCreateFunc(struct CommonExampleOptions& options)
  116. {
  117. return new MultiBodySoftContact(options.m_guiHelper);
  118. }