24#define HINGE_USE_OBSOLETE_SOLVER false
26#define HINGE_USE_FRAME_OFFSET true
31 const btVector3& axisInA,
const btVector3& axisInB,
bool useReferenceFrameA)
53 btScalar projection = axisInA.dot(rbAxisA1);
66 rbAxisA2 = axisInA.cross(rbAxisA1);
67 rbAxisA1 = rbAxisA2.cross(axisInA);
70 m_rbAFrame.getBasis().setValue(rbAxisA1.getX(), rbAxisA2.getX(), axisInA.getX(),
71 rbAxisA1.getY(), rbAxisA2.getY(), axisInA.getY(),
72 rbAxisA1.getZ(), rbAxisA2.getZ(), axisInA.getZ());
75 btVector3 rbAxisB1 =
quatRotate(rotationArc, rbAxisA1);
76 btVector3 rbAxisB2 = axisInB.cross(rbAxisB1);
79 m_rbBFrame.getBasis().setValue(rbAxisB1.getX(), rbAxisB2.getX(), axisInB.getX(),
80 rbAxisB1.getY(), rbAxisB2.getY(), axisInB.getY(),
81 rbAxisB1.getZ(), rbAxisB2.getZ(), axisInB.getZ());
83#ifndef _BT_USE_CENTER_LIMIT_
95btHingeConstraint::btHingeConstraint(
btRigidBody& rbA,
const btVector3& pivotInA,
const btVector3& axisInA,
bool useReferenceFrameA)
113 btVector3 rbAxisA1, rbAxisA2;
117 m_rbAFrame.getBasis().setValue(rbAxisA1.getX(), rbAxisA2.getX(), axisInA.getX(),
118 rbAxisA1.getY(), rbAxisA2.getY(), axisInA.getY(),
119 rbAxisA1.getZ(), rbAxisA2.getZ(), axisInA.getZ());
124 btVector3 rbAxisB1 =
quatRotate(rotationArc, rbAxisA1);
125 btVector3 rbAxisB2 = axisInB.cross(rbAxisB1);
128 m_rbBFrame.getBasis().setValue(rbAxisB1.getX(), rbAxisB2.getX(), axisInB.getX(),
129 rbAxisB1.getY(), rbAxisB2.getY(), axisInB.getY(),
130 rbAxisB1.getZ(), rbAxisB2.getZ(), axisInB.getZ());
132#ifndef _BT_USE_CENTER_LIMIT_
139 m_solveLimit =
false;
161#ifndef _BT_USE_CENTER_LIMIT_
168 m_solveLimit =
false;
192#ifndef _BT_USE_CENTER_LIMIT_
199 m_solveLimit =
false;
204void btHingeConstraint::buildJacobian()
215 btVector3 relPos = pivotBInW - pivotAInW;
220 normal[0] = relPos.normalized();
224 normal[0].setValue(
btScalar(1.0), 0, 0);
229 for (
int i = 0; i < 3; i++)
248 btVector3 jointAxis0local;
249 btVector3 jointAxis1local;
315btScalar btHingeAccumulatedAngleConstraint::getAccumulatedHingeAngle()
319 return m_accumulatedAngle;
321void btHingeAccumulatedAngleConstraint::setAccumulatedHingeAngle(
btScalar accAngle)
323 m_accumulatedAngle = accAngle;
332 btHingeConstraint::getInfo1(info);
400 btVector3 pivotAInW = trA.getOrigin();
401 btVector3 pivotBInW = trB.getOrigin();
440 btVector3 a1 = pivotAInW - transA.getOrigin();
445 btVector3 a1neg = -a1;
446 a1neg.getSkewSymmetricMatrix(angular0, angular1, angular2);
448 btVector3 a2 = pivotBInW - transB.getOrigin();
453 a2.getSkewSymmetricMatrix(angular0, angular1, angular2);
461 for (i = 0; i < 3; i++)
475 btVector3 ax1 = trA.getBasis().getColumn(2);
477 btVector3 p = trA.getBasis().getColumn(0);
478 btVector3 q = trA.getBasis().getColumn(1);
511 btVector3 ax2 = trB.getBasis().getColumn(2);
512 btVector3 u = ax1.cross(ax2);
522#ifdef _BT_USE_CENTER_LIMIT_
527 limit = (limit_err >
btScalar(0.0)) ? 1 : 2;
531 if (limit || powered)
545 if (limit && (lostop == histop))
564 k = info->
fps * currERP;
570 if (lostop == histop)
587#ifdef _BT_USE_CENTER_LIMIT_
595 vel -= angVelB.dot(ax1);
614 if (newc < info->m_constraintError[srow])
621#ifdef _BT_USE_CENTER_LIMIT_
637void btHingeConstraint::updateRHS(
btScalar timeStep)
649 const btVector3 refAxis0 = transA.getBasis() *
m_rbAFrame.getBasis().getColumn(0);
650 const btVector3 refAxis1 = transA.getBasis() *
m_rbAFrame.getBasis().getColumn(1);
651 const btVector3 swingAxis = transB.getBasis() *
m_rbBFrame.getBasis().getColumn(1);
653 btScalar angle =
btAtan2(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
661#ifdef _BT_USE_CENTER_LIMIT_
666 m_solveLimit =
false;
697 vNoHinge.normalize();
709 if (qHinge.getZ() < 0)
710 targetAngle = -targetAngle;
717#ifdef _BT_USE_CENTER_LIMIT_
730 btScalar dAngle = targetAngle - curAngle;
746 btVector3 ofs = trB.getOrigin() - trA.getOrigin();
764 btVector3 ax1A = trA.getBasis().getColumn(2);
765 btVector3 ax1B = trB.getBasis().getColumn(2);
766 btVector3 ax1 = ax1A * factA + ax1B * factB;
771 ax1 = ax1A * factA + ax1B * factB;
782 btVector3 tmpA, tmpB, relA, relB, p, q;
784 relB = trB.getOrigin() - bodyB_trans.getOrigin();
786 btVector3 projB = ax1 * relB.dot(ax1);
788 btVector3 orthoB = relB - projB;
790 relA = trA.getOrigin() - bodyA_trans.getOrigin();
791 btVector3 projA = ax1 * relA.dot(ax1);
792 btVector3 orthoA = relA - projA;
793 btVector3 totalDist = projA - projB;
795 relA = orthoA + totalDist * factA;
796 relB = orthoB - totalDist * factB;
798 p = orthoB * factA + orthoA * factB;
806 p = trA.getBasis().getColumn(1);
811 tmpA = relA.cross(p);
812 tmpB = relB.cross(p);
815 tmpA = relA.cross(q);
816 tmpB = relB.cross(q);
825 tmpA = relA.cross(ax1);
826 tmpB = relB.cross(ax1);
853 rhs = k * q.dot(ofs);
855 rhs = k * ax1.dot(ofs);
895 k = info->
fps * normalErp;
897 btVector3 u = ax1A.cross(ax1B);
908#ifdef _BT_USE_CENTER_LIMIT_
913 limit = (limit_err >
btScalar(0.0)) ? 1 : 2;
917 if (limit || powered)
931 if (limit && (lostop == histop))
950 k = info->
fps * currERP;
956 if (lostop == histop)
973#ifdef _BT_USE_CENTER_LIMIT_
981 vel -= angVelB.dot(ax1);
1000 if (newc < info->m_constraintError[srow])
1007#ifdef _BT_USE_CENTER_LIMIT_
1018void btHingeConstraint::setParam(
int num,
btScalar value,
int axis)
1020 if ((axis == -1) || (axis == 5))
1051btScalar btHingeConstraint::getParam(
int num,
int axis)
const
1054 if ((axis == -1) || (axis == 5))
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
virtual void buildJacobian()
internal method used by the constraint solver, don't use them directly
bool m_useSolveConstraintObsolete
btScalar m_maxMotorImpulse
const btRigidBody & getRigidBodyA() const
btVector3 m_accMotorImpulse
const btRigidBody & getRigidBodyB() const
btScalar m_relaxationFactor
void setMotorTarget(const btQuaternion &q)
btFixedConstraint btRigidBody & rbB
btJacobianEntry m_jacAng[3]
bool m_useOffsetForConstraintFrame
static btVector3 vHinge(0, 0, btScalar(1))
#define HINGE_USE_OBSOLETE_SOLVER
static btScalar btShortestAngularDistance(btScalar accAngle, btScalar curAngle)
static btScalar btNormalizeAnglePositive(btScalar angle)
static btScalar btShortestAngleUpdate(btScalar accAngle, btScalar curAngle)
#define HINGE_USE_FRAME_OFFSET
btScalar getHingeAngle()
The getHingeAngle gives the hinge angle in range [-PI,PI].
bool m_useReferenceFrameA
btScalar getLowerLimit() const
bool m_enableAngularMotor
btScalar getUpperLimit() const
bool getEnableAngularMotor()
@ BT_HINGE_FLAGS_CFM_STOP
@ BT_HINGE_FLAGS_CFM_NORM
@ BT_HINGE_FLAGS_ERP_NORM
@ BT_HINGE_FLAGS_ERP_STOP
btScalar m_accLimitImpulse
btScalar m_motorTargetVelocity
void getInfo2Internal(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
void getInfo2InternalUsingFrameOffset(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
void testLimit(const btTransform &transA, const btTransform &transB)
#define _BT_USE_CENTER_LIMIT_
SIMD_FORCE_INLINE btQuaternion shortestArcQuat(const btVector3 &v0, const btVector3 &v1)
SIMD_FORCE_INLINE btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btNormalizeAngle(btScalar angleInRadians)
SIMD_FORCE_INLINE btScalar btFabs(btScalar x)
SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y)
SIMD_FORCE_INLINE btScalar btFmod(btScalar x, btScalar y)
btSimdScalar m_appliedImpulse
btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact)
internal method used by the constraint solver, don't use them directly
SIMD_FORCE_INLINE btScalar btAdjustAngleToLimits(btScalar angleInRadians, btScalar angleLowerLimitInRadians, btScalar angleUpperLimitInRadians)
#define btAssertConstrParams(_par)
SIMD_FORCE_INLINE void btPlaneSpace1(const T &n, T &p, T &q)
btScalar getBiasFactor() const
Returns limit's bias factor.
btScalar getCorrection() const
Returns correction value evaluated when test() was invoked.
void test(const btScalar angle)
void fit(btScalar &angle) const
btScalar getRelaxationFactor() const
Returns limit's relaxation factor.
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
btScalar getAngle() const
Return the angle [0, 2Pi] of rotation represented by this quaternion.
btQuaternion inverse() const
Return the inverse of this quaternion.
btQuaternion & normalize()
Normalize the quaternion Such that x^2 + y^2 + z^2 +w^2 = 1.
SIMD_FORCE_INLINE btScalar computeAngularImpulseDenominator(const btVector3 &axis) const
btScalar getInvMass() const
const btVector3 & getInvInertiaDiagLocal() const
const btTransform & getCenterOfMassTransform() const
const btVector3 & getAngularVelocity() const
const btVector3 & getCenterOfMassPosition() const
local_group_size(16, 16) .push_constant(Type rhs
btScalar * m_J2linearAxis
btScalar * m_J2angularAxis
btScalar * m_J1angularAxis
btScalar * m_constraintError
btScalar * m_J1linearAxis