The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (iterative LCP) method. More...
#include <btSequentialImpulseConstraintSolver.h>
Public Member Functions | |
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, btStackAlloc *stackAlloc, btDispatcher *dispatcher) |
btSequentialImpulseConstraintSolver Sequentially applies impulses | |
virtual void | reset () |
clear internal cached data and reset random seed | |
unsigned long | btRand2 () |
int | btRandInt2 (int n) |
void | setRandSeed (unsigned long seed) |
unsigned long | getRandSeed () const |
Protected Member Functions | |
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, btScalar desiredVelocity=0., btScalar cfmSlip=0.) |
void | setupRollingFrictionConstraint (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, 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, btScalar desiredVelocity=0., btScalar cfmSlip=0.) |
btSolverConstraint & | addRollingFrictionConstraint (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, btScalar desiredVelocity=0, btScalar cfmSlip=0.f) |
void | setupContactConstraint (btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal, btVector3 &vel, btScalar &rel_vel, btScalar &relaxation, btVector3 &rel_pos1, btVector3 &rel_pos2) |
void | setFrictionConstraintImpulse (btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal) |
btScalar | restitutionCurve (btScalar rel_vel, btScalar restitution) |
void | convertContact (btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal) |
void | resolveSplitPenetrationSIMD (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
void | resolveSplitPenetrationImpulseCacheFriendly (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
int | getOrInitSolverBody (btCollisionObject &body) |
void | initSolverBody (btSolverBody *solverBody, btCollisionObject *collisionObject) |
void | resolveSingleConstraintRowGeneric (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
void | resolveSingleConstraintRowGenericSIMD (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
void | resolveSingleConstraintRowLowerLimit (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
void | resolveSingleConstraintRowLowerLimitSIMD (btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint) |
virtual void | solveGroupCacheFriendlySplitImpulseIterations (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer, btStackAlloc *stackAlloc) |
virtual btScalar | solveGroupCacheFriendlyFinish (btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal) |
btScalar | solveSingleIteration (int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer, btStackAlloc *stackAlloc) |
virtual btScalar | solveGroupCacheFriendlySetup (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer, btStackAlloc *stackAlloc) |
virtual btScalar | solveGroupCacheFriendlyIterations (btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer, btStackAlloc *stackAlloc) |
Protected Attributes | |
btAlignedObjectArray < btSolverBody > | m_tmpSolverBodyPool |
btConstraintArray | m_tmpSolverContactConstraintPool |
btConstraintArray | m_tmpSolverNonContactConstraintPool |
btConstraintArray | m_tmpSolverContactFrictionConstraintPool |
btConstraintArray | m_tmpSolverContactRollingFrictionConstraintPool |
btAlignedObjectArray< int > | m_orderTmpConstraintPool |
btAlignedObjectArray< int > | m_orderNonContactConstraintPool |
btAlignedObjectArray< int > | m_orderFrictionConstraintPool |
btAlignedObjectArray < btTypedConstraint::btConstraintInfo1 > | m_tmpConstraintSizesPool |
int | m_maxOverrideNumSolverIterations |
unsigned long | m_btSeed2 |
m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction |
The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (iterative LCP) method.
Definition at line 32 of file btSequentialImpulseConstraintSolver.h.
btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver | ( | ) |
Definition at line 38 of file btSequentialImpulseConstraintSolver.cpp.
btSequentialImpulseConstraintSolver::~btSequentialImpulseConstraintSolver | ( | ) | [virtual] |
Definition at line 44 of file btSequentialImpulseConstraintSolver.cpp.
btSolverConstraint & btSequentialImpulseConstraintSolver::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, | |||
btScalar | desiredVelocity = 0. , |
|||
btScalar | cfmSlip = 0. | |||
) | [protected] |
Definition at line 420 of file btSequentialImpulseConstraintSolver.cpp.
btSolverConstraint & btSequentialImpulseConstraintSolver::addRollingFrictionConstraint | ( | 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, | |||
btScalar | desiredVelocity = 0 , |
|||
btScalar | cfmSlip = 0.f | |||
) | [protected] |
Definition at line 506 of file btSequentialImpulseConstraintSolver.cpp.
btSequentialImpulseConstraintSolver::BT_DECLARE_ALIGNED_ALLOCATOR | ( | ) |
unsigned long btSequentialImpulseConstraintSolver::btRand2 | ( | ) |
Definition at line 243 of file btSequentialImpulseConstraintSolver.cpp.
int btSequentialImpulseConstraintSolver::btRandInt2 | ( | int | n | ) |
Definition at line 252 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::convertContact | ( | btPersistentManifold * | manifold, | |
const btContactSolverInfo & | infoGlobal | |||
) | [protected] |
avoid collision response between two static objects
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 745 of file btSequentialImpulseConstraintSolver.cpp.
int btSequentialImpulseConstraintSolver::getOrInitSolverBody | ( | btCollisionObject & | body | ) | [protected] |
Definition at line 516 of file btSequentialImpulseConstraintSolver.cpp.
unsigned long btSequentialImpulseConstraintSolver::getRandSeed | ( | ) | const [inline] |
Definition at line 130 of file btSequentialImpulseConstraintSolver.h.
void btSequentialImpulseConstraintSolver::initSolverBody | ( | btSolverBody * | solverBody, | |
btCollisionObject * | collisionObject | |||
) | [protected] |
Definition at line 281 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::reset | ( | ) | [virtual] |
clear internal cached data and reset random seed
Implements btConstraintSolver.
Definition at line 1645 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric | ( | btSolverBody & | bodyA, | |
btSolverBody & | bodyB, | |||
const btSolverConstraint & | contactConstraint | |||
) | [protected] |
Definition at line 93 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD | ( | btSolverBody & | bodyA, | |
btSolverBody & | bodyB, | |||
const btSolverConstraint & | contactConstraint | |||
) | [protected] |
Definition at line 59 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit | ( | btSolverBody & | bodyA, | |
btSolverBody & | bodyB, | |||
const btSolverConstraint & | contactConstraint | |||
) | [protected] |
Definition at line 154 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD | ( | btSolverBody & | bodyA, | |
btSolverBody & | bodyB, | |||
const btSolverConstraint & | contactConstraint | |||
) | [protected] |
Definition at line 123 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::resolveSplitPenetrationImpulseCacheFriendly | ( | btSolverBody & | bodyA, | |
btSolverBody & | bodyB, | |||
const btSolverConstraint & | contactConstraint | |||
) | [protected] |
Definition at line 177 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::resolveSplitPenetrationSIMD | ( | btSolverBody & | bodyA, | |
btSolverBody & | bodyB, | |||
const btSolverConstraint & | contactConstraint | |||
) | [protected] |
Definition at line 206 of file btSequentialImpulseConstraintSolver.cpp.
btScalar btSequentialImpulseConstraintSolver::restitutionCurve | ( | btScalar | rel_vel, | |
btScalar | restitution | |||
) | [protected] |
Definition at line 319 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse | ( | btSolverConstraint & | solverConstraint, | |
int | solverBodyIdA, | |||
int | solverBodyIdB, | |||
btManifoldPoint & | cp, | |||
const btContactSolverInfo & | infoGlobal | |||
) | [protected] |
Definition at line 699 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::setRandSeed | ( | unsigned long | seed | ) | [inline] |
Definition at line 126 of file btSequentialImpulseConstraintSolver.h.
void btSequentialImpulseConstraintSolver::setupContactConstraint | ( | btSolverConstraint & | solverConstraint, | |
int | solverBodyIdA, | |||
int | solverBodyIdB, | |||
btManifoldPoint & | cp, | |||
const btContactSolverInfo & | infoGlobal, | |||
btVector3 & | vel, | |||
btScalar & | rel_vel, | |||
btScalar & | relaxation, | |||
btVector3 & | rel_pos1, | |||
btVector3 & | rel_pos2 | |||
) | [protected] |
warm starting (or zero if disabled)
Definition at line 548 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::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, | |||
btScalar | desiredVelocity = 0. , |
|||
btScalar | cfmSlip = 0. | |||
) | [protected] |
Definition at line 348 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::setupRollingFrictionConstraint | ( | 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, | |||
btScalar | desiredVelocity = 0. , |
|||
btScalar | cfmSlip = 0. | |||
) | [protected] |
Definition at line 430 of file btSequentialImpulseConstraintSolver.cpp.
btScalar btSequentialImpulseConstraintSolver::solveGroup | ( | btCollisionObject ** | bodies, | |
int | numBodies, | |||
btPersistentManifold ** | manifold, | |||
int | numManifolds, | |||
btTypedConstraint ** | constraints, | |||
int | numConstraints, | |||
const btContactSolverInfo & | info, | |||
btIDebugDraw * | debugDrawer, | |||
btStackAlloc * | stackAlloc, | |||
btDispatcher * | dispatcher | |||
) | [virtual] |
btSequentialImpulseConstraintSolver Sequentially applies impulses
Implements btConstraintSolver.
Reimplemented in btParallelConstraintSolver.
Definition at line 1630 of file btSequentialImpulseConstraintSolver.cpp.
btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish | ( | btCollisionObject ** | bodies, | |
int | numBodies, | |||
const btContactSolverInfo & | infoGlobal | |||
) | [protected, virtual] |
Definition at line 1550 of file btSequentialImpulseConstraintSolver.cpp.
btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations | ( | btCollisionObject ** | bodies, | |
int | numBodies, | |||
btPersistentManifold ** | manifoldPtr, | |||
int | numManifolds, | |||
btTypedConstraint ** | constraints, | |||
int | numConstraints, | |||
const btContactSolverInfo & | infoGlobal, | |||
btIDebugDraw * | debugDrawer, | |||
btStackAlloc * | stackAlloc | |||
) | [protected, virtual] |
this is a special step to resolve penetrations (just for contacts)
Definition at line 1530 of file btSequentialImpulseConstraintSolver.cpp.
btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup | ( | btCollisionObject ** | bodies, | |
int | numBodies, | |||
btPersistentManifold ** | manifoldPtr, | |||
int | numManifolds, | |||
btTypedConstraint ** | constraints, | |||
int | numConstraints, | |||
const btContactSolverInfo & | infoGlobal, | |||
btIDebugDraw * | debugDrawer, | |||
btStackAlloc * | stackAlloc | |||
) | [protected, virtual] |
setup the btSolverConstraints
the size of btSolverConstraint needs be a multiple of btScalar
finalize the constraint setup
fix rhs todo: add force/torque accelerators
Definition at line 907 of file btSequentialImpulseConstraintSolver.cpp.
void btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySplitImpulseIterations | ( | btCollisionObject ** | bodies, | |
int | numBodies, | |||
btPersistentManifold ** | manifoldPtr, | |||
int | numManifolds, | |||
btTypedConstraint ** | constraints, | |||
int | numConstraints, | |||
const btContactSolverInfo & | infoGlobal, | |||
btIDebugDraw * | debugDrawer, | |||
btStackAlloc * | stackAlloc | |||
) | [protected, virtual] |
Definition at line 1490 of file btSequentialImpulseConstraintSolver.cpp.
btScalar btSequentialImpulseConstraintSolver::solveSingleIteration | ( | int | iteration, | |
btCollisionObject ** | bodies, | |||
int | numBodies, | |||
btPersistentManifold ** | manifoldPtr, | |||
int | numManifolds, | |||
btTypedConstraint ** | constraints, | |||
int | numConstraints, | |||
const btContactSolverInfo & | infoGlobal, | |||
btIDebugDraw * | debugDrawer, | |||
btStackAlloc * | stackAlloc | |||
) | [protected] |
solve all joint constraints, using SIMD, if available
solve all contact constraints using SIMD, if available
solve all friction constraints, using SIMD, if available
solve all joint constraints
solve all contact constraints
solve all friction constraints
Definition at line 1254 of file btSequentialImpulseConstraintSolver.cpp.
unsigned long btSequentialImpulseConstraintSolver::m_btSeed2 [protected] |
m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction
Definition at line 69 of file btSequentialImpulseConstraintSolver.h.
Definition at line 45 of file btSequentialImpulseConstraintSolver.h.
btAlignedObjectArray<int> btSequentialImpulseConstraintSolver::m_orderFrictionConstraintPool [protected] |
Definition at line 43 of file btSequentialImpulseConstraintSolver.h.
btAlignedObjectArray<int> btSequentialImpulseConstraintSolver::m_orderNonContactConstraintPool [protected] |
Definition at line 42 of file btSequentialImpulseConstraintSolver.h.
Definition at line 41 of file btSequentialImpulseConstraintSolver.h.
btAlignedObjectArray<btTypedConstraint::btConstraintInfo1> btSequentialImpulseConstraintSolver::m_tmpConstraintSizesPool [protected] |
Definition at line 44 of file btSequentialImpulseConstraintSolver.h.
btAlignedObjectArray<btSolverBody> btSequentialImpulseConstraintSolver::m_tmpSolverBodyPool [protected] |
Definition at line 35 of file btSequentialImpulseConstraintSolver.h.
Definition at line 36 of file btSequentialImpulseConstraintSolver.h.
btConstraintArray btSequentialImpulseConstraintSolver::m_tmpSolverContactFrictionConstraintPool [protected] |
Definition at line 38 of file btSequentialImpulseConstraintSolver.h.
btConstraintArray btSequentialImpulseConstraintSolver::m_tmpSolverContactRollingFrictionConstraintPool [protected] |
Definition at line 39 of file btSequentialImpulseConstraintSolver.h.
btConstraintArray btSequentialImpulseConstraintSolver::m_tmpSolverNonContactConstraintPool [protected] |
Definition at line 37 of file btSequentialImpulseConstraintSolver.h.