@@ -182,24 +182,19 @@ bool CapsuleVsCapsuleAlgorithm::testCollision(NarrowPhaseInfoBatch& narrowPhaseI
182
182
if (closestPointsDistanceSquare > MACHINE_EPSILON) {
183
183
184
184
decimal closestPointsDistance = std::sqrt (closestPointsDistanceSquare);
185
- decimal penetrationDepth = sumRadius - closestPointsDistance;
185
+ closestPointsSeg1ToSeg2 /= closestPointsDistance;
186
186
187
- // Make sure the penetration depth is not zero (even if the previous condition test was true the penetration depth can still be
188
- // zero because of precision issue of the computation at the previous line)
189
- if (penetrationDepth > 0 ) {
187
+ const Vector3 contactPointCapsule1Local = capsule1ToCapsule2SpaceTransform.getInverse () * (closestPointCapsule1Seg + closestPointsSeg1ToSeg2 * capsule1Radius);
188
+ const Vector3 contactPointCapsule2Local = closestPointCapsule2Seg - closestPointsSeg1ToSeg2 * capsule2Radius;
190
189
191
- closestPointsSeg1ToSeg2 /= closestPointsDistance ;
190
+ const Vector3 normalWorld = narrowPhaseInfoBatch. narrowPhaseInfos [batchIndex]. shape2ToWorldTransform . getOrientation () * closestPointsSeg1ToSeg2 ;
192
191
193
- const Vector3 contactPointCapsule1Local = capsule1ToCapsule2SpaceTransform.getInverse () * (closestPointCapsule1Seg + closestPointsSeg1ToSeg2 * capsule1Radius);
194
- const Vector3 contactPointCapsule2Local = closestPointCapsule2Seg - closestPointsSeg1ToSeg2 * capsule2Radius;
192
+ decimal penetrationDepth = std::max (sumRadius - closestPointsDistance, MACHINE_EPSILON);
195
193
196
- const Vector3 normalWorld = narrowPhaseInfoBatch.narrowPhaseInfos [batchIndex].shape2ToWorldTransform .getOrientation () * closestPointsSeg1ToSeg2;
197
-
198
- // Create the contact info object
199
- narrowPhaseInfoBatch.addContactPoint (batchIndex, normalWorld, penetrationDepth, contactPointCapsule1Local, contactPointCapsule2Local);
200
- }
194
+ // Create the contact info object
195
+ narrowPhaseInfoBatch.addContactPoint (batchIndex, normalWorld, penetrationDepth, contactPointCapsule1Local, contactPointCapsule2Local);
201
196
}
202
- else if (sumRadius > 0 ) { // The segment are overlapping (degenerate case)
197
+ else { // The segment are overlapping (degenerate case)
203
198
204
199
// If the capsule segments are parralel
205
200
if (areCapsuleInnerSegmentsParralel) {
0 commit comments