|
virtual void | solveGroupCacheFriendlySplitImpulseIterations (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) BT_OVERRIDE |
|
virtual btScalar | solveSingleIteration (int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) BT_OVERRIDE |
|
virtual btScalar | solveGroupCacheFriendlySetup (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) BT_OVERRIDE |
|
virtual btScalar | solveGroupCacheFriendlyFinish (btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal) BT_OVERRIDE |
|
void | internalInitMultipleJoints (btTypedConstraint **constraints, int iBegin, int iEnd) |
|
void | internalConvertMultipleJoints (const btAlignedObjectArray< JointParams > &jointParamsArray, btTypedConstraint **constraints, int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
| BT_DECLARE_ALIGNED_ALLOCATOR () |
|
| btSequentialImpulseConstraintSolverMt () |
|
virtual | ~btSequentialImpulseConstraintSolverMt () |
|
btScalar | resolveMultipleJointConstraints (const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd, int iteration) |
|
btScalar | resolveMultipleContactConstraints (const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd) |
|
btScalar | resolveMultipleContactSplitPenetrationImpulseConstraints (const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd) |
|
btScalar | resolveMultipleContactFrictionConstraints (const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd) |
|
btScalar | resolveMultipleContactRollingFrictionConstraints (const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd) |
|
btScalar | resolveMultipleContactConstraintsInterleaved (const btAlignedObjectArray< int > &contactIndices, int batchBegin, int batchEnd) |
|
void | internalCollectContactManifoldCachedInfo (btContactManifoldCachedInfo *cachedInfoArray, btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal) |
|
void | internalAllocContactConstraints (const btContactManifoldCachedInfo *cachedInfoArray, int numManifolds) |
|
void | internalSetupContactConstraints (int iContactConstraint, const btContactSolverInfo &infoGlobal) |
|
void | internalConvertBodies (btCollisionObject **bodies, int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
void | internalWriteBackContacts (int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
void | internalWriteBackJoints (int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
void | internalWriteBackBodies (int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
| BT_DECLARE_ALIGNED_ALLOCATOR () |
|
| btSequentialImpulseConstraintSolver () |
|
virtual | ~btSequentialImpulseConstraintSolver () |
|
virtual btScalar | solveGroup (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher) |
| btSequentialImpulseConstraintSolver Sequentially applies impulses More...
|
|
virtual void | reset () |
| clear internal cached data and reset random seed More...
|
|
unsigned long | btRand2 () |
|
int | btRandInt2 (int n) |
|
void | setRandSeed (unsigned long seed) |
|
unsigned long | getRandSeed () const |
|
virtual btConstraintSolverType | getSolverType () const |
|
btSingleConstraintRowSolver | getActiveConstraintRowSolverGeneric () |
|
void | setConstraintRowSolverGeneric (btSingleConstraintRowSolver rowSolver) |
|
btSingleConstraintRowSolver | getActiveConstraintRowSolverLowerLimit () |
|
void | setConstraintRowSolverLowerLimit (btSingleConstraintRowSolver rowSolver) |
|
btSingleConstraintRowSolver | getScalarConstraintRowSolverGeneric () |
| Various implementations of solving a single constraint row using a generic equality constraint, using scalar reference, SSE2 or SSE4. More...
|
|
btSingleConstraintRowSolver | getSSE2ConstraintRowSolverGeneric () |
|
btSingleConstraintRowSolver | getSSE4_1ConstraintRowSolverGeneric () |
|
btSingleConstraintRowSolver | getScalarConstraintRowSolverLowerLimit () |
| Various implementations of solving a single constraint row using an inequality (lower limit) constraint, using scalar reference, SSE2 or SSE4. More...
|
|
btSingleConstraintRowSolver | getSSE2ConstraintRowSolverLowerLimit () |
|
btSingleConstraintRowSolver | getSSE4_1ConstraintRowSolverLowerLimit () |
|
virtual | ~btConstraintSolver () |
|
virtual void | prepareSolve (int, int) |
|
virtual btScalar | solveGroup (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, class btIDebugDraw *debugDrawer, btDispatcher *dispatcher)=0 |
| solve a group of constraints More...
|
|
virtual void | allSolved (const btContactSolverInfo &, class btIDebugDraw *) |
|
virtual void | reset ()=0 |
| clear internal cached data and reset random seed More...
|
|
virtual btConstraintSolverType | getSolverType () const =0 |
|
|
virtual void | randomizeConstraintOrdering (int iteration, int numIterations) |
|
virtual btScalar | resolveAllJointConstraints (int iteration) |
|
virtual btScalar | resolveAllContactConstraints () |
|
virtual btScalar | resolveAllContactFrictionConstraints () |
|
virtual btScalar | resolveAllContactConstraintsInterleaved () |
|
virtual btScalar | resolveAllRollingFrictionConstraints () |
|
virtual void | setupBatchedContactConstraints () |
|
virtual void | setupBatchedJointConstraints () |
|
virtual void | convertJoints (btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal) BT_OVERRIDE |
|
virtual void | convertContacts (btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal) BT_OVERRIDE |
|
virtual void | convertBodies (btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal) BT_OVERRIDE |
|
int | getOrInitSolverBodyThreadsafe (btCollisionObject &body, btScalar timeStep) |
|
void | allocAllContactConstraints (btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal) |
|
void | setupAllContactConstraints (const btContactSolverInfo &infoGlobal) |
|
void | randomizeBatchedConstraintOrdering (btBatchedConstraints *batchedConstraints) |
|
void | setupSolverFunctions (bool useSimd) |
|
void | setupFrictionConstraint (btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, const btContactSolverInfo &infoGlobal, btScalar desiredVelocity=0., btScalar cfmSlip=0.) |
|
void | setupTorsionalFrictionConstraint (btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, btScalar combinedTorsionalFriction, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.) |
|
btSolverConstraint & | addFrictionConstraint (const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, const btContactSolverInfo &infoGlobal, btScalar desiredVelocity=0., btScalar cfmSlip=0.) |
|
btSolverConstraint & | addTorsionalFrictionConstraint (const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, btScalar torsionalFriction, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0, btScalar cfmSlip=0.f) |
|
void | setupContactConstraint (btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal, btScalar &relaxation, const btVector3 &rel_pos1, const btVector3 &rel_pos2) |
|
void | setFrictionConstraintImpulse (btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal) |
|
btScalar | restitutionCurve (btScalar rel_vel, btScalar restitution, btScalar velocityThreshold) |
|
virtual void | convertContacts (btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal) |
|
void | convertContact (btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal) |
|
virtual void | convertJoints (btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal) |
|
void | convertJoint (btSolverConstraint *currentConstraintRow, btTypedConstraint *constraint, const btTypedConstraint::btConstraintInfo1 &info1, int solverBodyIdA, int solverBodyIdB, const btContactSolverInfo &infoGlobal) |
|
virtual void | convertBodies (btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal) |
|
btScalar | resolveSplitPenetrationSIMD (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
|
btScalar | resolveSplitPenetrationImpulseCacheFriendly (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
|
int | getOrInitSolverBody (btCollisionObject &body, btScalar timeStep) |
|
void | initSolverBody (btSolverBody *solverBody, btCollisionObject *collisionObject, btScalar timeStep) |
|
btScalar | resolveSingleConstraintRowGeneric (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
|
btScalar | resolveSingleConstraintRowGenericSIMD (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
|
btScalar | resolveSingleConstraintRowLowerLimit (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
|
btScalar | resolveSingleConstraintRowLowerLimitSIMD (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
|
btScalar | resolveSplitPenetrationImpulse (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
|
void | writeBackContacts (int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
void | writeBackJoints (int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
void | writeBackBodies (int iBegin, int iEnd, const btContactSolverInfo &infoGlobal) |
|
virtual void | solveGroupCacheFriendlySplitImpulseIterations (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) |
|
virtual btScalar | solveGroupCacheFriendlyFinish (btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal) |
|
virtual btScalar | solveSingleIteration (int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) |
|
virtual btScalar | solveGroupCacheFriendlySetup (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) |
|
virtual btScalar | solveGroupCacheFriendlyIterations (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) |
|
btSequentialImpulseConstraintSolverMt
A multithreaded variant of the sequential impulse constraint solver. The constraints to be solved are grouped into batches and phases where each batch of constraints within a given phase can be solved in parallel with the rest. Ideally we want as few phases as possible, and each phase should have many batches, and all of the batches should have about the same number of constraints. This method works best on a large island of many constraints.
Supports all of the features of the normal sequential impulse solver such as:
- split penetration impulse
- rolling friction
- interleaving constraints
- warmstarting
- 2 friction directions
- randomized constraint ordering
- early termination when leastSquaresResidualThreshold is satisfied
When the SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS flag is enabled, unlike the normal SequentialImpulse solver, the rolling friction is interleaved as well. Interleaving the contact penetration constraints with friction reduces the number of parallel loops that need to be done, which reduces threading overhead so it can be a performance win, however, it does seem to produce a less stable simulation, at least on stacks of blocks.
When the SOLVER_RANDMIZE_ORDER flag is enabled, the ordering of phases, and the ordering of constraints within each batch is randomized, however it does not swap constraints between batches. This is to avoid regenerating the batches for each solver iteration which would be quite costly in performance.
Note that a non-zero leastSquaresResidualThreshold could possibly affect the determinism of the simulation if the task scheduler's parallelSum operation is non-deterministic. The parallelSum operation can be non-deterministic because floating point addition is not associative due to rounding errors. The task scheduler can and should ensure that the result of any parallelSum operation is deterministic.
Definition at line 56 of file btSequentialImpulseConstraintSolverMt.h.
void btSequentialImpulseConstraintSolverMt::internalSetupContactConstraints |
( |
int |
iContactConstraint, |
|
|
const btContactSolverInfo & |
infoGlobal |
|
) |
| |
Bullet has several options to set the friction directions By default, each contact has only a single friction direction that is recomputed automatically very frame based on the relative linear velocity. If the relative velocity it zero, it will automatically compute a friction direction.
You can also enable two friction directions, using the SOLVER_USE_2_FRICTION_DIRECTIONS. In that case, the second friction direction will be orthogonal to both contact normal and first friction direction.
If you choose SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION, then the friction will be independent from the relative projected velocity.
The user can manually override the friction directions for certain contacts using a contact callback, and set the cp.m_lateralFrictionInitialized to true In that case, you can set the target relative motion in each friction direction (cp.m_contactMotion1 and cp.m_contactMotion2) this will give a conveyor belt effect
Definition at line 65 of file btSequentialImpulseConstraintSolverMt.cpp.