Solve the contacts
| 477 | |
| 478 | // Solve the contacts |
| 479 | void 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)); |
no outgoing calls
no test coverage detected