PhysicsSpringConstraint.cpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * PhysicsSpringConstraint.cpp
  3. */
  4. #include "PhysicsSpringConstraint.h"
  5. #include "Node.h"
  6. #include "PhysicsRigidBody.h"
  7. namespace gameplay
  8. {
  9. PhysicsSpringConstraint::PhysicsSpringConstraint(PhysicsRigidBody* a, PhysicsRigidBody* b)
  10. {
  11. // Initialize the physics rigid body references since we don't call the PhysicsConstraint constructor that does it properly automatically.
  12. _a = a;
  13. _b = b;
  14. Vector3 origin = centerOfMassMidpoint(a->_node, b->_node);
  15. _constraint = new btGeneric6DofSpringConstraint(*a->_body, *b->_body, getTransformOffset(a->_node, origin), getTransformOffset(b->_node, origin), true);
  16. }
  17. PhysicsSpringConstraint::PhysicsSpringConstraint(PhysicsRigidBody* a, const Quaternion& rotationOffsetA, const Vector3& translationOffsetA,
  18. PhysicsRigidBody* b, const Quaternion& rotationOffsetB, const Vector3& translationOffsetB)
  19. {
  20. // Initialize the physics rigid body references since we don't call the PhysicsConstraint constructor that does it properly automatically.
  21. _a = a;
  22. _b = b;
  23. // Take scale into account for the translation offsets.
  24. Vector3 sA;
  25. a->_node->getWorldMatrix().getScale(&sA);
  26. Vector3 tA(translationOffsetA.x * sA.x, translationOffsetA.y * sA.y, translationOffsetA.z * sA.z);
  27. Vector3 sB;
  28. b->_node->getWorldMatrix().getScale(&sB);
  29. Vector3 tB(translationOffsetB.x * sB.x, translationOffsetB.y * sB.y, translationOffsetB.z * sB.z);
  30. btTransform frameInA(btQuaternion(rotationOffsetA.x, rotationOffsetA.y, rotationOffsetA.z, rotationOffsetA.w), btVector3(tA.x, tA.y, tA.z));
  31. btTransform frameInB(btQuaternion(rotationOffsetB.x, rotationOffsetB.y, rotationOffsetB.z, rotationOffsetB.w), btVector3(tB.x, tB.y, tB.z));
  32. _constraint = new btGeneric6DofSpringConstraint(*a->_body, *b->_body, frameInA, frameInB, true);
  33. }
  34. PhysicsSpringConstraint::~PhysicsSpringConstraint()
  35. {
  36. // DUMMY FUNCTION
  37. }
  38. void PhysicsSpringConstraint::setStrength(SpringProperty property, float strength)
  39. {
  40. if (strength < MATH_EPSILON)
  41. ((btGeneric6DofSpringConstraint*)_constraint)->enableSpring(property, false);
  42. else
  43. {
  44. ((btGeneric6DofSpringConstraint*)_constraint)->enableSpring(property, true);
  45. ((btGeneric6DofSpringConstraint*)_constraint)->setStiffness(property, strength);
  46. ((btGeneric6DofSpringConstraint*)_constraint)->setEquilibriumPoint(property);
  47. }
  48. }
  49. void PhysicsSpringConstraint::setDamping(SpringProperty property, float damping)
  50. {
  51. ((btGeneric6DofSpringConstraint*)_constraint)->setDamping(property, damping);
  52. ((btGeneric6DofSpringConstraint*)_constraint)->setEquilibriumPoint(property);
  53. }
  54. }