24#define HINGE_USE_OBSOLETE_SOLVER false
26#define HINGE_USE_FRAME_OFFSET true
53 btScalar projection = axisInA.dot(rbAxisA1);
66 rbAxisA2 = axisInA.cross(rbAxisA1);
67 rbAxisA1 = rbAxisA2.cross(axisInA);
71 rbAxisA1.getY(), rbAxisA2.getY(), axisInA.getY(),
72 rbAxisA1.getZ(), rbAxisA2.getZ(), axisInA.getZ());
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_
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());
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;
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++)
232 m_rbA.getCenterOfMassTransform().getBasis().transpose(),
233 m_rbB.getCenterOfMassTransform().getBasis().transpose(),
234 pivotAInW -
m_rbA.getCenterOfMassPosition(),
235 pivotBInW -
m_rbB.getCenterOfMassPosition(),
237 m_rbA.getInvInertiaDiagLocal(),
239 m_rbB.getInvInertiaDiagLocal(),
258 m_rbA.getCenterOfMassTransform().getBasis().transpose(),
259 m_rbB.getCenterOfMassTransform().getBasis().transpose(),
260 m_rbA.getInvInertiaDiagLocal(),
261 m_rbB.getInvInertiaDiagLocal());
264 m_rbA.getCenterOfMassTransform().getBasis().transpose(),
265 m_rbB.getCenterOfMassTransform().getBasis().transpose(),
266 m_rbA.getInvInertiaDiagLocal(),
267 m_rbB.getInvInertiaDiagLocal());
270 m_rbA.getCenterOfMassTransform().getBasis().transpose(),
271 m_rbB.getCenterOfMassTransform().getBasis().transpose(),
272 m_rbA.getInvInertiaDiagLocal(),
273 m_rbB.getInvInertiaDiagLocal());
315btScalar btHingeAccumulatedAngleConstraint::getAccumulatedHingeAngle()
319 return m_accumulatedAngle;
321void btHingeAccumulatedAngleConstraint::setAccumulatedHingeAngle(
btScalar accAngle)
323 m_accumulatedAngle = accAngle;
332 btHingeConstraint::getInfo1(info);
440 btVector3 a1 = pivotAInW - transA.getOrigin();
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);
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)
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;
784 relB = trB.getOrigin() - bodyB_trans.getOrigin();
790 relA = trA.getOrigin() - bodyA_trans.getOrigin();
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;
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))
ATTR_WARN_UNUSED_RESULT const size_t num
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]
3 orthogonal angular constraints
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_
void setValue(const btScalar &xx, const btScalar &xy, const btScalar &xz, const btScalar &yx, const btScalar &yy, const btScalar &yz, const btScalar &zx, const btScalar &zy, const btScalar &zz)
Set the values of the matrix explicitly (row major).
SIMD_FORCE_INLINE btVector3 getColumn(int i) const
Get a column of the matrix as a vector.
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)
btTypedConstraint(btTypedConstraintType type, btRigidBody &rbA)
SIMD_FORCE_INLINE void btPlaneSpace1(const T &n, T &p, T &q)
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
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 btTransform & getCenterOfMassTransform() const
btScalar * m_J2linearAxis
btScalar * m_J2angularAxis
btScalar * m_J1angularAxis
btScalar * m_constraintError
btScalar * m_J1linearAxis