28 #define CONETWIST_USE_OBSOLETE_SOLVER false
29 #define CONETWIST_DEF_FIX_THRESH btScalar(.05f)
165 int srow = row * info->
rowskip;
177 int srow1 = srow + info->
rowskip;
205 J2[srow+0] = -ax1[0];
206 J2[srow+1] = -ax1[1];
207 J2[srow+2] = -ax1[2];
229 J2[srow+0] = -ax1[0];
230 J2[srow+1] = -ax1[1];
231 J2[srow+2] = -ax1[2];
241 if(m_twistCorrection > 0.0f)
276 btVector3 relPos = pivotBInW - pivotAInW;
290 for (
int i=0;i<3;i++)
333 for (
int i=0;i<3;i++)
339 rel_vel = normal.
dot(vel);
341 btScalar depth = -(pivotAInW - pivotBInW).
dot(normal);
342 btScalar impulse = depth*tau/timeStep * jacDiagABInv - rel_vel * jacDiagABInv;
364 trACur, zerovec, omegaA, timeStep, trAPred);
367 trBCur, zerovec, omegaB, timeStep, trBPred);
387 btScalar kAxisAInv = 0, kAxisBInv = 0;
401 btVector3 avgAxis = kAxisAInv * axisA + kAxisBInv * axisB;
403 static bool bDoTorque =
true;
409 btScalar kInvCombined = kAxisAInv + kAxisBInv;
411 btVector3 impulse = (kAxisAInv * dOmegaA - kAxisBInv * dOmegaB) /
412 (kInvCombined * kInvCombined);
418 fMaxImpulse = fMaxImpulse/kAxisAInv;
422 if (newUnclampedMag > fMaxImpulse)
425 newUnclampedAccImpulse *= fMaxImpulse;
432 btVector3 impulseAxis = impulse / impulseMag;
453 btVector3 impulseAxis = impulse / impulseMag;
487 btVector3 impulseNoTwistCouple = impulse - impulseTwistCouple;
488 impulse = impulseNoTwistCouple;
491 impulseMag = impulse.
length();
492 btVector3 noTwistSwingAxis = impulse / impulseMag;
559 swx = b2Axis1.
dot(b1Axis1);
560 swy = b2Axis1.
dot(b1Axis2);
562 fact = (swy*swy + swx*swx) * thresh * thresh;
563 fact = fact / (fact +
btScalar(1.0));
570 swx = b2Axis1.
dot(b1Axis1);
571 swy = b2Axis1.
dot(b1Axis3);
573 fact = (swy*swy + swx*swx) * thresh * thresh;
574 fact = fact / (fact +
btScalar(1.0));
580 btScalar EllipseAngle =
btFabs(swing1*swing1)* RMaxAngle1Sq +
btFabs(swing2*swing2) * RMaxAngle2Sq;
582 if (EllipseAngle > 1.0f)
589 btScalar swingAxisSign = (b2Axis1.
dot(b1Axis1) >= 0.0f) ? 1.0f : -1.0f;
645 float swingAxisLen2 = swingAxis.
length2();
685 if (swingAngle < swingLimit && m_limitSoftness < 1.f -
SIMD_EPSILON)
688 (swingLimit - swingLimit * m_limitSoftness);
776 target[0] = x * ivA[0] + y * jvA[0] + z * kvA[0];
777 target[1] = x * ivA[1] + y * jvA[1] + z * kvA[1];
778 target[2] = x * ivA[2] + y * jvA[2] + z * kvA[2];
835 vSwingAxis =
btVector3(qCone.
x(), qCone.
y(), qCone.
z());
862 btScalar surfaceSlope2 = (yEllipse*yEllipse)/(xEllipse*xEllipse);
865 btScalar swingLimit2 = (1 + surfaceSlope2) / norm;
866 swingLimit = sqrt(swingLimit2);
882 else if (swingAngle < 0)
907 btScalar surfaceSlope2 = (yEllipse*yEllipse)/(xEllipse*xEllipse);
910 btScalar swingLimit2 = (1 + surfaceSlope2) / norm;
911 swingLimit = sqrt(swingLimit2);
916 btVector3 vSwingAxis(0, xEllipse, -yEllipse);
918 btVector3 vPointInConstraintSpace(fLength,0,0);
919 return quatRotate(qSwing, vPointInConstraintSpace);
933 qMinTwist = -(qTwist);
944 vTwistAxis =
btVector3(qMinTwist.
x(), qMinTwist.
y(), qMinTwist.
z());
1019 if (swingAngle > swingLimit*softness)
1020 swingAngle = swingLimit*softness;
1021 else if (swingAngle < -swingLimit*softness)
1022 swingAngle = -swingLimit*softness;
1056 if((axis >= 0) && (axis < 3))
1068 if((axis >= 0) && (axis < 3))
1093 if((axis >= 0) && (axis < 3))
1098 else if((axis >= 3) && (axis < 6))
1109 if((axis >= 0) && (axis < 3))
1114 else if((axis >= 3) && (axis < 6))