MCPcopy Create free account
hub / github.com/DanielChappuis/reactphysics3d / solve

Method solve

src/systems/ContactSolverSystem.cpp:479–759  ·  view source on GitHub ↗

Solve the contacts

Source from the content-addressed store, hash-verified

477
478// Solve the contacts
479void ContactSolverSystem::solve() {
480
481 RP3D_PROFILE("ContactSolverSystem::solve()", mProfiler);
482
483 decimal deltaLambda;
484 decimal lambdaTemp;
485 uint32 contactPointIndex = 0;
486
487 const decimal beta = mIsSplitImpulseActive ? BETA_SPLIT_IMPULSE : BETA;
488
489 // For each contact manifold
490 for (uint32 c=0; c<mNbContactManifolds; c++) {
491
492 decimal sumPenetrationImpulse = 0.0;
493
494 const uint32 rigidBody1Index = mContactConstraints[c].rigidBodyComponentIndexBody1;
495 const uint32 rigidBody2Index = mContactConstraints[c].rigidBodyComponentIndexBody2;
496
497 // Get the constrained velocities
498 const Vector3& v1 = mRigidBodyComponents.mConstrainedLinearVelocities[rigidBody1Index];
499 const Vector3& w1 = mRigidBodyComponents.mConstrainedAngularVelocities[rigidBody1Index];
500 const Vector3& v2 = mRigidBodyComponents.mConstrainedLinearVelocities[rigidBody2Index];
501 const Vector3& w2 = mRigidBodyComponents.mConstrainedAngularVelocities[rigidBody2Index];
502
503 for (short int i=0; i<mContactConstraints[c].nbContacts; i++) {
504
505 // --------- Penetration --------- //
506
507 // Compute J*v
508 //Vector3 deltaV = v2 + w2.cross(mContactPoints[contactPointIndex].r2) - v1 - w1.cross(mContactPoints[contactPointIndex].r1);
509 Vector3 deltaV(v2.x + w2.y * mContactPoints[contactPointIndex].r2.z - w2.z * mContactPoints[contactPointIndex].r2.y - v1.x -
510 w1.y * mContactPoints[contactPointIndex].r1.z + w1.z * mContactPoints[contactPointIndex].r1.y,
511 v2.y + w2.z * mContactPoints[contactPointIndex].r2.x - w2.x * mContactPoints[contactPointIndex].r2.z - v1.y -
512 w1.z * mContactPoints[contactPointIndex].r1.x + w1.x * mContactPoints[contactPointIndex].r1.z,
513 v2.z + w2.x * mContactPoints[contactPointIndex].r2.y - w2.y * mContactPoints[contactPointIndex].r2.x - v1.z -
514 w1.x * mContactPoints[contactPointIndex].r1.y + w1.y * mContactPoints[contactPointIndex].r1.x);
515 decimal deltaVDotN = deltaV.x * mContactPoints[contactPointIndex].normal.x + deltaV.y * mContactPoints[contactPointIndex].normal.y +
516 deltaV.z * mContactPoints[contactPointIndex].normal.z;
517 decimal Jv = deltaVDotN;
518
519 // Compute the bias "b" of the constraint
520 decimal biasPenetrationDepth = 0.0;
521 if (mContactPoints[contactPointIndex].penetrationDepth > SLOP) {
522 biasPenetrationDepth = -(beta/mTimeStep) * std::max(0.0f, float(mContactPoints[contactPointIndex].penetrationDepth - SLOP));
523 }
524 decimal b = biasPenetrationDepth + mContactPoints[contactPointIndex].restitutionBias;
525
526 // Compute the Lagrange multiplier lambda
527 if (mIsSplitImpulseActive) {
528 deltaLambda = - (Jv + mContactPoints[contactPointIndex].restitutionBias) *
529 mContactPoints[contactPointIndex].inversePenetrationMass;
530 }
531 else {
532 deltaLambda = - (Jv + b) * mContactPoints[contactPointIndex].inversePenetrationMass;
533 }
534 lambdaTemp = mContactPoints[contactPointIndex].penetrationImpulse;
535 mContactPoints[contactPointIndex].penetrationImpulse = std::max(mContactPoints[contactPointIndex].penetrationImpulse +
536 deltaLambda, decimal(0.0));

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected