35 for (
int i = 0; i <
infoGlobal.m_numNonContactInnerIterations; ++i)
215 for (
int i = 0; i < numBodies; i++)
220 fcA->m_multiBody->setCompanionId(-1);
231 for (
int i = 0; i <
ndof; ++i)
248 for (
int i = 0; i <
ndofA; ++i)
260 for (
int i = 0; i <
ndofB; ++i)
291#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
304#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
332 ndofA =
cB.m_multiBodyA->getNumDofs() + 6;
333 for (
int i = 0; i <
ndofA; ++i)
336 else if (
cB.m_solverBodyIdA >= 0)
339 deltaVelADotn +=
cB.m_contactNormal1.dot(
bodyA->internalGetDeltaLinearVelocity()) +
cB.m_relpos1CrossNormal.dot(
bodyA->internalGetDeltaAngularVelocity());
344 ndofB =
cB.m_multiBodyB->getNumDofs() + 6;
345 for (
int i = 0; i <
ndofB; ++i)
348 else if (
cB.m_solverBodyIdB >= 0)
351 deltaVelBDotn +=
cB.m_contactNormal2.dot(
bodyB->internalGetDeltaLinearVelocity()) +
cB.m_relpos2CrossNormal.dot(
bodyB->internalGetDeltaAngularVelocity());
369 ndofA =
cA.m_multiBodyA->getNumDofs() + 6;
370 for (
int i = 0; i <
ndofA; ++i)
373 else if (
cA.m_solverBodyIdA >= 0)
376 deltaVelADotn +=
cA.m_contactNormal1.dot(
bodyA->internalGetDeltaLinearVelocity()) +
cA.m_relpos1CrossNormal.dot(
bodyA->internalGetDeltaAngularVelocity());
381 ndofB =
cA.m_multiBodyB->getNumDofs() + 6;
382 for (
int i = 0; i <
ndofB; ++i)
385 else if (
cA.m_solverBodyIdB >= 0)
388 deltaVelBDotn +=
cA.m_contactNormal2.dot(
bodyB->internalGetDeltaLinearVelocity()) +
cA.m_relpos2CrossNormal.dot(
bodyB->internalGetDeltaAngularVelocity());
415 cA.m_appliedImpulse =
sumA;
430 cB.m_appliedImpulse =
sumB;
439 cA.m_appliedImpulse =
sumA;
440 cB.m_appliedImpulse =
sumB;
446#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
452 else if (
cA.m_solverBodyIdA >= 0)
459#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
465 else if (
cA.m_solverBodyIdB >= 0)
473#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
479 else if (
cB.m_solverBodyIdA >= 0)
486#ifdef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
492 else if (
cB.m_solverBodyIdB >= 0)
503 BT_PROFILE(
"setupMultiBodyContactConstraint");
546 cfm =
cp.m_contactCFM;
548 erp =
cp.m_contactERP;
671 for (
int i = 0; i <
ndofA; ++i)
691 for (
int i = 0; i <
ndofB; ++i)
744 for (
int i = 0; i <
ndofA; ++i)
761 for (
int i = 0; i <
ndofB; ++i)
896 BT_PROFILE(
"setupMultiBodyRollingFrictionConstraint");
1024 for (
int i = 0; i <
ndofA; ++i)
1044 for (
int i = 0; i <
ndofB; ++i)
1086 for (
int i = 0; i <
ndofA; ++i)
1101 for (
int i = 0; i <
ndofB; ++i)
1142btMultiBodySolverConstraint&
btMultiBodyConstraintSolver::addMultiBodyFrictionConstraint(
const btVector3&
normalAxis,
const btScalar&
appliedImpulse,
btPersistentManifold*
manifold,
int frictionIndex,
btManifoldPoint&
cp,
btCollisionObject*
colObj0,
btCollisionObject*
colObj1,
btScalar relaxation,
const btContactSolverInfo&
infoGlobal,
btScalar desiredVelocity,
btScalar cfmSlip)
1144 BT_PROFILE(
"addMultiBodyFrictionConstraint");
1181 BT_PROFILE(
"addMultiBodyRollingFrictionConstraint");
1221 BT_PROFILE(
"addMultiBodyRollingFrictionConstraint");
1280 for (
int j = 0;
j <
manifold->getNumContacts();
j++)
1284 if (
cp.getDistance() <=
manifold->getContactProcessingThreshold())
1315#define ENABLE_FRICTION
1316#ifdef ENABLE_FRICTION
1336 cp.m_lateralFrictionDir1.normalize();
1337 cp.m_lateralFrictionDir2.normalize();
1341 if (
cp.m_combinedSpinningFriction > 0)
1345 if (
cp.m_combinedRollingFriction > 0)
1400 addMultiBodyFrictionConstraint(
cp.m_lateralFrictionDir1,
cp.m_appliedImpulseLateral1,
manifold,
frictionIndex,
cp,
colObj0,
colObj1,
relaxation,
infoGlobal,
cp.m_contactMotion1,
cp.m_frictionCFM);
1403 addMultiBodyFrictionConstraint(
cp.m_lateralFrictionDir2,
cp.m_appliedImpulseLateral2,
manifold,
frictionIndex,
cp,
colObj0,
colObj1,
relaxation,
infoGlobal,
cp.m_contactMotion2,
cp.m_frictionCFM);
1413 cp.m_appliedImpulse = 0;
1574#ifndef DIRECTLY_UPDATE_VELOCITY_DURING_SOLVER_ITERATIONS
1590 BT_PROFILE(
"btMultiBodyConstraintSolver::solveGroupCacheFriendlyFinish");
1632 pt->m_appliedImpulseLateral2 = 0;
1730 constr->setEnabled(
false);
1740void btMultiBodyConstraintSolver::solveMultiBodyGroup(
btCollisionObject** bodies,
int numBodies,
btPersistentManifold**
manifold,
int numManifolds,
btTypedConstraint**
constraints,
int numConstraints,
btMultiBodyConstraint**
multiBodyConstraints,
int numMultiBodyConstraints,
const btContactSolverInfo& info,
btIDebugDraw*
debugDrawer,
btDispatcher*
dispatcher)
@ BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED
@ BT_CONTACT_FLAG_HAS_CONTACT_ERP
@ BT_CONTACT_FLAG_HAS_CONTACT_CFM
@ BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING
@ BT_CONTACT_FLAG_FRICTION_ANCHOR
const T & btMax(const T &a, const T &b)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btAtan2(btScalar x, btScalar y)
btScalar btSin(btScalar x)
btScalar btFabs(btScalar x)
btScalar btCos(btScalar x)
static T sum(const btAlignedObjectArray< T > &items)
#define btSimdScalar
Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later,...
void btPlaneSpace1(const T &n, T &p, T &q)
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
void resize(int newsize, const T &fillData=T())
T & expandNonInitializing()
btCollisionObject can be used to manage collision detection objects.
btTransform & getWorldTransform()
@ CF_ANISOTROPIC_ROLLING_FRICTION
@ CF_ANISOTROPIC_FRICTION
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
ManifoldContactPoint collects and maintains persistent contactpoints.
btScalar resolveSingleConstraintRowGeneric(const btMultiBodySolverConstraint &c)
btMultiBodyConstraint ** m_tmpMultiBodyConstraints
void writeBackSolverBodyToMultiBody(btMultiBodySolverConstraint &constraint, btScalar deltaTime)
int m_tmpNumMultiBodyConstraints
btMultiBodyConstraintArray m_multiBodyTorsionalFrictionContactConstraints
void convertContacts(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
btMultiBodySolverConstraint & addMultiBodySpinningFrictionConstraint(const btVector3 &normalAxis, btPersistentManifold *manifold, int frictionIndex, btManifoldPoint &cp, btScalar combinedTorsionalFriction, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, const btContactSolverInfo &infoGlobal, btScalar desiredVelocity=0, btScalar cfmSlip=0)
void applyDeltaVee(btScalar *deltaV, btScalar impulse, int velocityIndex, int ndof)
void setupMultiBodyContactConstraint(btMultiBodySolverConstraint &solverConstraint, const btVector3 &contactNormal, const btScalar &appliedImpulse, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal, btScalar &relaxation, bool isFriction, btScalar desiredVelocity=0, btScalar cfmSlip=0)
btMultiBodyConstraintArray m_multiBodyNormalContactConstraints
virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
btMultiBodyConstraintArray m_multiBodySpinningFrictionContactConstraints
btMultiBodyConstraintArray m_multiBodyFrictionContactConstraints
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btMultiBodySolverConstraint & addMultiBodyFrictionConstraint(const btVector3 &normalAxis, const btScalar &appliedImpulse, btPersistentManifold *manifold, int frictionIndex, btManifoldPoint &cp, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, const btContactSolverInfo &infoGlobal, btScalar desiredVelocity=0, btScalar cfmSlip=0)
btMultiBodySolverConstraint & addMultiBodyTorsionalFrictionConstraint(const btVector3 &normalAxis, btPersistentManifold *manifold, int frictionIndex, btManifoldPoint &cp, btScalar combinedTorsionalFriction, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, const btContactSolverInfo &infoGlobal, btScalar desiredVelocity=0, btScalar cfmSlip=0)
btMultiBodyJacobianData m_data
btScalar resolveConeFrictionConstraintRows(const btMultiBodySolverConstraint &cA1, const btMultiBodySolverConstraint &cB)
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
void convertMultiBodyContact(btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal)
virtual void solveMultiBodyGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, btMultiBodyConstraint **multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher)
void setupMultiBodyTorsionalFrictionConstraint(btMultiBodySolverConstraint &solverConstraint, const btVector3 &contactNormal, btManifoldPoint &cp, btScalar combinedTorsionalFriction, const btContactSolverInfo &infoGlobal, btScalar &relaxation, bool isFriction, btScalar desiredVelocity=0, btScalar cfmSlip=0)
btMultiBodyConstraintArray m_multiBodyNonContactConstraints
virtual btScalar solveGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher)
this method should not be called, it was just used during porting/integration of Featherstone btMulti...
virtual void createConstraintRows(btMultiBodyConstraintArray &constraintRows, btMultiBodyJacobianData &data, const btContactSolverInfo &infoGlobal)=0
void internalSetAppliedImpulse(int dof, btScalar appliedImpulse)
static btMultiBodyLinkCollider * upcast(btCollisionObject *colObj)
void addBaseConstraintForce(const btVector3 &f)
void addLinkConstraintForce(int i, const btVector3 &f)
void addLinkConstraintTorque(int i, const btVector3 &t)
void addBaseConstraintTorque(const btVector3 &t)
void setCompanionId(int id)
void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
void applyDeltaVeeMultiDof2(const btScalar *delta_vee, btScalar multiplier)
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
The btRigidBody is the main class for rigid body objects.
virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
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
static void applyAnisotropicFriction(btCollisionObject *colObj, btVector3 &frictionDirection, int frictionMode)
void convertContact(btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal)
btAlignedObjectArray< btSolverBody > m_tmpSolverBodyPool
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution, btScalar velocityThreshold)
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
TypedConstraint is the baseclass for Bullet constraints and vehicles.
btVector3 can be used to represent 3D points and vectors.
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
btVector3 m_appliedForceBodyA
btAlignedObjectArray< btScalar > m_deltaVelocitiesUnitImpulse
btAlignedObjectArray< btScalar > m_deltaVelocities
btAlignedObjectArray< btScalar > m_jacobians
btAlignedObjectArray< btSolverBody > * m_solverBodyPool
btAlignedObjectArray< btScalar > scratch_r
btAlignedObjectArray< btMatrix3x3 > scratch_m
btAlignedObjectArray< btVector3 > scratch_v
1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and fr...
btMultiBodyConstraint * m_orgConstraint
btVector3 m_relpos1CrossNormal
void * m_originalContactPoint
btVector3 m_contactNormal2
btVector3 m_contactNormal1
btMultiBody * m_multiBodyB
btVector3 m_angularComponentA
btVector3 m_relpos2CrossNormal
btSimdScalar m_appliedImpulse
btMultiBody * m_multiBodyA
btVector3 m_angularComponentB
The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packe...