b3PgsJacobiSolver.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #ifndef B3_PGS_JACOBI_SOLVER
  2. #define B3_PGS_JACOBI_SOLVER
  3. struct b3Contact4;
  4. struct b3ContactPoint;
  5. class b3Dispatcher;
  6. #include "b3TypedConstraint.h"
  7. #include "b3ContactSolverInfo.h"
  8. #include "b3SolverBody.h"
  9. #include "b3SolverConstraint.h"
  10. struct b3RigidBodyData;
  11. struct b3InertiaData;
  12. class b3PgsJacobiSolver
  13. {
  14. protected:
  15. b3AlignedObjectArray<b3SolverBody> m_tmpSolverBodyPool;
  16. b3ConstraintArray m_tmpSolverContactConstraintPool;
  17. b3ConstraintArray m_tmpSolverNonContactConstraintPool;
  18. b3ConstraintArray m_tmpSolverContactFrictionConstraintPool;
  19. b3ConstraintArray m_tmpSolverContactRollingFrictionConstraintPool;
  20. b3AlignedObjectArray<int> m_orderTmpConstraintPool;
  21. b3AlignedObjectArray<int> m_orderNonContactConstraintPool;
  22. b3AlignedObjectArray<int> m_orderFrictionConstraintPool;
  23. b3AlignedObjectArray<b3TypedConstraint::b3ConstraintInfo1> m_tmpConstraintSizesPool;
  24. b3AlignedObjectArray<int> m_bodyCount;
  25. b3AlignedObjectArray<int> m_bodyCountCheck;
  26. b3AlignedObjectArray<b3Vector3> m_deltaLinearVelocities;
  27. b3AlignedObjectArray<b3Vector3> m_deltaAngularVelocities;
  28. bool m_usePgs;
  29. void averageVelocities();
  30. int m_maxOverrideNumSolverIterations;
  31. int m_numSplitImpulseRecoveries;
  32. b3Scalar getContactProcessingThreshold(b3Contact4* contact)
  33. {
  34. return 0.02f;
  35. }
  36. void setupFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB,
  37. b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2,
  38. b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation,
  39. b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.);
  40. void setupRollingFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB,
  41. b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2,
  42. b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation,
  43. b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.);
  44. b3SolverConstraint& addFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, b3Scalar desiredVelocity = 0., b3Scalar cfmSlip = 0.);
  45. b3SolverConstraint& addRollingFrictionConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias, const b3Vector3& normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, b3ContactPoint& cp, const b3Vector3& rel_pos1, const b3Vector3& rel_pos2, b3RigidBodyData* colObj0, b3RigidBodyData* colObj1, b3Scalar relaxation, b3Scalar desiredVelocity = 0, b3Scalar cfmSlip = 0.f);
  46. void setupContactConstraint(b3RigidBodyData* bodies, b3InertiaData* inertias,
  47. b3SolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB, b3ContactPoint& cp,
  48. const b3ContactSolverInfo& infoGlobal, b3Vector3& vel, b3Scalar& rel_vel, b3Scalar& relaxation,
  49. b3Vector3& rel_pos1, b3Vector3& rel_pos2);
  50. void setFrictionConstraintImpulse(b3RigidBodyData* bodies, b3InertiaData* inertias, b3SolverConstraint& solverConstraint, int solverBodyIdA, int solverBodyIdB,
  51. b3ContactPoint& cp, const b3ContactSolverInfo& infoGlobal);
  52. ///m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction
  53. unsigned long m_btSeed2;
  54. b3Scalar restitutionCurve(b3Scalar rel_vel, b3Scalar restitution);
  55. void convertContact(b3RigidBodyData* bodies, b3InertiaData* inertias, b3Contact4* manifold, const b3ContactSolverInfo& infoGlobal);
  56. void resolveSplitPenetrationSIMD(
  57. b3SolverBody& bodyA, b3SolverBody& bodyB,
  58. const b3SolverConstraint& contactConstraint);
  59. void resolveSplitPenetrationImpulseCacheFriendly(
  60. b3SolverBody& bodyA, b3SolverBody& bodyB,
  61. const b3SolverConstraint& contactConstraint);
  62. //internal method
  63. int getOrInitSolverBody(int bodyIndex, b3RigidBodyData* bodies, b3InertiaData* inertias);
  64. void initSolverBody(int bodyIndex, b3SolverBody* solverBody, b3RigidBodyData* collisionObject);
  65. void resolveSingleConstraintRowGeneric(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
  66. void resolveSingleConstraintRowGenericSIMD(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
  67. void resolveSingleConstraintRowLowerLimit(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
  68. void resolveSingleConstraintRowLowerLimitSIMD(b3SolverBody& bodyA, b3SolverBody& bodyB, const b3SolverConstraint& contactConstraint);
  69. protected:
  70. virtual b3Scalar solveGroupCacheFriendlySetup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
  71. virtual b3Scalar solveGroupCacheFriendlyIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
  72. virtual void solveGroupCacheFriendlySplitImpulseIterations(b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
  73. b3Scalar solveSingleIteration(int iteration, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
  74. virtual b3Scalar solveGroupCacheFriendlyFinish(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, const b3ContactSolverInfo& infoGlobal);
  75. public:
  76. B3_DECLARE_ALIGNED_ALLOCATOR();
  77. b3PgsJacobiSolver(bool usePgs);
  78. virtual ~b3PgsJacobiSolver();
  79. // void solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts);
  80. void solveContacts(int numBodies, b3RigidBodyData* bodies, b3InertiaData* inertias, int numContacts, b3Contact4* contacts, int numConstraints, b3TypedConstraint** constraints);
  81. b3Scalar solveGroup(b3RigidBodyData* bodies, b3InertiaData* inertias, int numBodies, b3Contact4* manifoldPtr, int numManifolds, b3TypedConstraint** constraints, int numConstraints, const b3ContactSolverInfo& infoGlobal);
  82. ///clear internal cached data and reset random seed
  83. virtual void reset();
  84. unsigned long b3Rand2();
  85. int b3RandInt2(int n);
  86. void setRandSeed(unsigned long seed)
  87. {
  88. m_btSeed2 = seed;
  89. }
  90. unsigned long getRandSeed() const
  91. {
  92. return m_btSeed2;
  93. }
  94. };
  95. #endif //B3_PGS_JACOBI_SOLVER