28 #define CONETWIST_USE_OBSOLETE_SOLVER false
29 #define CONETWIST_DEF_FIX_THRESH btScalar(.05f)
161 int srow = row * info->
rowskip;
173 int srow1 = srow + info->
rowskip;
201 J2[srow+0] = -ax1[0];
202 J2[srow+1] = -ax1[1];
203 J2[srow+2] = -ax1[2];
225 J2[srow+0] = -ax1[0];
226 J2[srow+1] = -ax1[1];
227 J2[srow+2] = -ax1[2];
237 if(m_twistCorrection > 0.0f)
272 btVector3 relPos = pivotBInW - pivotAInW;
286 for (
int i=0;i<3;i++)
324 bodyA.internalGetVelocityInLocalPointObsolete(rel_pos1,vel1);
326 bodyB.internalGetVelocityInLocalPointObsolete(rel_pos2,vel2);
329 for (
int i=0;i<3;i++)
335 rel_vel = normal.
dot(vel);
337 btScalar depth = -(pivotAInW - pivotBInW).
dot(normal);
338 btScalar impulse = depth*tau/timeStep * jacDiagABInv - rel_vel * jacDiagABInv;
355 btVector3 omegaA; bodyA.internalGetAngularVelocity(omegaA);
356 btVector3 omegaB; bodyB.internalGetAngularVelocity(omegaB);
360 trACur, zerovec, omegaA, timeStep, trAPred);
363 trBCur, zerovec, omegaB, timeStep, trBPred);
383 btScalar kAxisAInv = 0, kAxisBInv = 0;
397 btVector3 avgAxis = kAxisAInv * axisA + kAxisBInv * axisB;
399 static bool bDoTorque =
true;
405 btScalar kInvCombined = kAxisAInv + kAxisBInv;
407 btVector3 impulse = (kAxisAInv * dOmegaA - kAxisBInv * dOmegaB) /
408 (kInvCombined * kInvCombined);
414 fMaxImpulse = fMaxImpulse/kAxisAInv;
418 if (newUnclampedMag > fMaxImpulse)
421 newUnclampedAccImpulse *= fMaxImpulse;
428 btVector3 impulseAxis = impulse / impulseMag;
437 btVector3 angVelA; bodyA.internalGetAngularVelocity(angVelA);
438 btVector3 angVelB; bodyB.internalGetAngularVelocity(angVelB);
449 btVector3 impulseAxis = impulse / impulseMag;
459 bodyA.internalGetAngularVelocity(angVelA);
461 bodyB.internalGetAngularVelocity(angVelB);
483 btVector3 impulseNoTwistCouple = impulse - impulseTwistCouple;
484 impulse = impulseNoTwistCouple;
487 impulseMag = impulse.
length();
488 btVector3 noTwistSwingAxis = impulse / impulseMag;
555 swx = b2Axis1.
dot(b1Axis1);
556 swy = b2Axis1.
dot(b1Axis2);
558 fact = (swy*swy + swx*swx) * thresh * thresh;
559 fact = fact / (fact +
btScalar(1.0));
566 swx = b2Axis1.
dot(b1Axis1);
567 swy = b2Axis1.
dot(b1Axis3);
569 fact = (swy*swy + swx*swx) * thresh * thresh;
570 fact = fact / (fact +
btScalar(1.0));
576 btScalar EllipseAngle =
btFabs(swing1*swing1)* RMaxAngle1Sq +
btFabs(swing2*swing2) * RMaxAngle2Sq;
578 if (EllipseAngle > 1.0f)
585 btScalar swingAxisSign = (b2Axis1.
dot(b1Axis1) >= 0.0f) ? 1.0f : -1.0f;
641 float swingAxisLen2 = swingAxis.
length2();
681 if (swingAngle < swingLimit && m_limitSoftness < 1.f -
SIMD_EPSILON)
684 (swingLimit - swingLimit * m_limitSoftness);
770 target[0] = x * ivA[0] + y * jvA[0] + z * kvA[0];
771 target[1] = x * ivA[1] + y * jvA[1] + z * kvA[1];
772 target[2] = x * ivA[2] + y * jvA[2] + z * kvA[2];
829 vSwingAxis =
btVector3(qCone.
x(), qCone.
y(), qCone.
z());
856 btScalar surfaceSlope2 = (yEllipse*yEllipse)/(xEllipse*xEllipse);
859 btScalar swingLimit2 = (1 + surfaceSlope2) / norm;
860 swingLimit = sqrt(swingLimit2);
876 else if (swingAngle < 0)
901 btScalar surfaceSlope2 = (yEllipse*yEllipse)/(xEllipse*xEllipse);
904 btScalar swingLimit2 = (1 + surfaceSlope2) / norm;
905 swingLimit = sqrt(swingLimit2);
910 btVector3 vSwingAxis(0, xEllipse, -yEllipse);
912 btVector3 vPointInConstraintSpace(fLength,0,0);
913 return quatRotate(qSwing, vPointInConstraintSpace);
927 qMinTwist = -(qTwist);
938 vTwistAxis =
btVector3(qMinTwist.
x(), qMinTwist.
y(), qMinTwist.
z());
1013 if (swingAngle > swingLimit*softness)
1014 swingAngle = swingLimit*softness;
1015 else if (swingAngle < -swingLimit*softness)
1016 swingAngle = -swingLimit*softness;
1050 if((axis >= 0) && (axis < 3))
1062 if((axis >= 0) && (axis < 3))
1087 if((axis >= 0) && (axis < 3))
1092 else if((axis >= 3) && (axis < 6))
1103 if((axis >= 0) && (axis < 3))
1108 else if((axis >= 3) && (axis < 6))