PhysicsHingeConstraint.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "PhysicsHingeConstraint.h"
  2. #include "Node.h"
  3. namespace gameplay
  4. {
  5. void PhysicsHingeConstraint::setLimits(float minAngle, float maxAngle, float bounciness)
  6. {
  7. // Use the defaults for softness (0.9) and biasFactor (0.3).
  8. ((btHingeConstraint*)_constraint)->setLimit(minAngle, maxAngle, 0.9f, 0.3f, bounciness);
  9. }
  10. PhysicsHingeConstraint::PhysicsHingeConstraint(PhysicsRigidBody* a, const Quaternion& rotationOffsetA, const Vector3& translationOffsetA,
  11. PhysicsRigidBody* b, const Quaternion& rotationOffsetB, const Vector3& translationOffsetB)
  12. : PhysicsConstraint(a, b)
  13. {
  14. // Take scale into account for the first node's translation offset.
  15. Vector3 sA;
  16. a->getNode()->getWorldMatrix().getScale(&sA);
  17. Vector3 tA(translationOffsetA.x * sA.x, translationOffsetA.y * sA.y, translationOffsetA.z * sA.z);
  18. if (b)
  19. {
  20. // Take scale into account for the second node's translation offset.
  21. Vector3 sB;
  22. b->getNode()->getWorldMatrix().getScale(&sB);
  23. Vector3 tB(translationOffsetB.x * sB.x, translationOffsetB.y * sB.y, translationOffsetB.z * sB.z);
  24. btTransform frameInA(BQ(rotationOffsetA), BV(tA));
  25. btTransform frameInB(BQ(rotationOffsetB), BV(tB));
  26. _constraint = new btHingeConstraint(*a->_body, *b->_body, frameInA, frameInB);
  27. }
  28. else
  29. {
  30. btTransform frameInA(BQ(rotationOffsetA), BV(tA));
  31. _constraint = new btHingeConstraint(*a->_body, frameInA);
  32. }
  33. }
  34. PhysicsHingeConstraint::~PhysicsHingeConstraint()
  35. {
  36. // Unused
  37. }
  38. }