27 #define HINGE_USE_OBSOLETE_SOLVER false 29 #define HINGE_USE_FRAME_OFFSET true 44 m_enableAngularMotor(false),
47 m_useReferenceFrameA(useReferenceFrameA),
68 rbAxisA2 = axisInA.
cross(rbAxisA1);
69 rbAxisA1 = rbAxisA2.
cross(axisInA);
85 #ifndef _BT_USE_CENTER_LIMIT_ 90 m_relaxationFactor = 1.0f;
91 m_limitSoftness = 0.9f;
104 m_angularOnly(false), m_enableAngularMotor(false),
107 m_useReferenceFrameA(useReferenceFrameA),
137 #ifndef _BT_USE_CENTER_LIMIT_ 142 m_relaxationFactor = 1.0f;
143 m_limitSoftness = 0.9f;
144 m_solveLimit =
false;
157 m_angularOnly(false),
158 m_enableAngularMotor(false),
161 m_useReferenceFrameA(useReferenceFrameA),
168 #ifndef _BT_USE_CENTER_LIMIT_ 173 m_relaxationFactor = 1.0f;
174 m_limitSoftness = 0.9f;
175 m_solveLimit =
false;
187 m_angularOnly(false),
188 m_enableAngularMotor(false),
191 m_useReferenceFrameA(useReferenceFrameA),
201 #ifndef _BT_USE_CENTER_LIMIT_ 206 m_relaxationFactor = 1.0f;
207 m_limitSoftness = 0.9f;
208 m_solveLimit =
false;
226 btVector3 relPos = pivotBInW - pivotAInW;
240 for (
int i=0;i<3;i++)
326 return accAngle + result;
489 for(i = 0; i < 3; i++)
550 #ifdef _BT_USE_CENTER_LIMIT_ 555 limit = (limit_err >
btScalar(0.0)) ? 1 : 2;
574 if(limit && (lostop == histop))
593 k = info->
fps * currERP;
616 #ifdef _BT_USE_CENTER_LIMIT_ 619 btScalar bounce = m_relaxationFactor;
624 vel -= angVelB.
dot(ax1);
643 if(newc < info->m_constraintError[srow])
650 #ifdef _BT_USE_CENTER_LIMIT_ 698 #ifdef _BT_USE_CENTER_LIMIT_ 703 m_solveLimit =
false;
704 if (m_lowerLimit <= m_upperLimit)
746 if (qHinge.
getZ() < 0)
747 targetAngle = -targetAngle;
754 #ifdef _BT_USE_CENTER_LIMIT_ 757 if (m_lowerLimit < m_upperLimit)
759 if (targetAngle < m_lowerLimit)
760 targetAngle = m_lowerLimit;
761 else if (targetAngle > m_upperLimit)
762 targetAngle = m_upperLimit;
767 btScalar dAngle = targetAngle - curAngle;
805 btVector3 ax1 = ax1A * factA + ax1B * factB;
828 relA = orthoA + totalDist * factA;
829 relB = orthoB - totalDist * factB;
831 p = orthoB * factA + orthoA * factB;
844 tmpA = relA.
cross(p);
845 tmpB = relB.
cross(p);
848 tmpA = relA.
cross(q);
849 tmpB = relB.
cross(q);
858 tmpA = relA.
cross(ax1);
859 tmpB = relB.
cross(ax1);
886 rhs = k * q.
dot(ofs);
888 rhs = k * ax1.
dot(ofs);
928 k = info->
fps * normalErp;
941 #ifdef _BT_USE_CENTER_LIMIT_ 946 limit = (limit_err >
btScalar(0.0)) ? 1 : 2;
965 if(limit && (lostop == histop))
984 k = info->
fps * currERP;
1007 #ifdef _BT_USE_CENTER_LIMIT_ 1010 btScalar bounce = m_relaxationFactor;
1015 vel -= angVelB.
dot(ax1);
1034 if(newc < info->m_constraintError[srow])
1041 #ifdef _BT_USE_CENTER_LIMIT_ 1055 if((axis == -1) || (axis == 5))
1089 if((axis == -1) || (axis == 5))
btScalar * m_constraintError
btScalar getCorrection() const
Returns correction value evaluated when test() was invoked.
btScalar computeAngularImpulseDenominator(const btVector3 &axis) const
#define HINGE_USE_OBSOLETE_SOLVER
void getInfo2Internal(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
const btScalar & getZ() const
Return the z value.
btScalar getUpperLimit() const
btScalar * m_J2angularAxis
virtual void setParam(int num, btScalar value, int axis=-1)
override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0...
const btVector3 & getAngularVelocity() const
const btRigidBody & getRigidBodyB() const
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
Jacobian entry is an abstraction that allows to describe constraints it can be used in combination wi...
btScalar getLowerLimit() const
virtual void getInfo1(btConstraintInfo1 *info)
internal method used by the constraint solver, don't use them directly
virtual void getInfo1(btConstraintInfo1 *info)
internal method used by the constraint solver, don't use them directly
void setAccumulatedHingeAngle(btScalar accAngle)
const btTransform & getCenterOfMassTransform() const
btScalar length2() const
Return the length of the vector squared.
bool m_useSolveConstraintObsolete
btScalar m_accMotorImpulse
void btPlaneSpace1(const T &n, T &p, T &q)
btScalar btSqrt(btScalar y)
const btScalar & getY() const
Return the y value.
btScalar * m_J1angularAxis
btScalar getRelaxationFactor() const
Returns limit's relaxation factor.
btScalar m_motorTargetVelocity
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)
btVector3 normalized() const
Return a normalized version of this vector.
btMatrix3x3 transpose() const
Return the transpose of the matrix.
btScalar m_accumulatedAngle
static btVector3 vHinge(0, 0, btScalar(1))
btQuaternion inverse() const
Return the inverse of this quaternion.
btVector3 getColumn(int i) const
Get a column of the matrix as a vector.
const btScalar & getZ() const
Return the z value.
btScalar getBiasFactor() const
Returns limit's bias factor.
static btScalar btShortestAngularDistance(btScalar accAngle, btScalar curAngle)
const btVector3 & getInvInertiaDiagLocal() const
btScalar * m_J1linearAxis
void getInfo2NonVirtual(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
btScalar m_accLimitImpulse
btQuaternion shortestArcQuat(const btVector3 &v0, const btVector3 &v1)
#define _BT_USE_CENTER_LIMIT_
btQuaternion & normalize()
Normalize the quaternion Such that x^2 + y^2 + z^2 +w^2 = 1.
btScalar getInvMass() const
void updateRHS(btScalar timeStep)
void getInfo2InternalUsingFrameOffset(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
void getSkewSymmetricMatrix(btVector3 *v0, btVector3 *v1, btVector3 *v2) const
btScalar dot(const btVector3 &v) const
Return the dot product.
btScalar btAtan2(btScalar x, btScalar y)
void fit(btScalar &angle) const
Checks given angle against limit.
#define HINGE_USE_FRAME_OFFSET
static btScalar btShortestAngleUpdate(btScalar accAngle, btScalar curAngle)
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)
btScalar m_maxMotorImpulse
void getInfo1NonVirtual(btConstraintInfo1 *info)
The btRigidBody is the main class for rigid body objects.
virtual void buildJacobian()
internal method used by the constraint solver, don't use them directly
btScalar btAdjustAngleToLimits(btScalar angleInRadians, btScalar angleLowerLimitInRadians, btScalar angleUpperLimitInRadians)
btVector3 can be used to represent 3D points and vectors.
btScalar getAngle() const
Return the angle [0, 2Pi] of rotation represented by this quaternion.
btScalar btNormalizeAngle(btScalar angleInRadians)
bool m_useOffsetForConstraintFrame
bool m_useReferenceFrameA
btJacobianEntry m_jacAng[3]
const btVector3 & getCenterOfMassPosition() const
bool getEnableAngularMotor()
btScalar * m_J2linearAxis
btScalar btFmod(btScalar x, btScalar y)
TypedConstraint is the baseclass for Bullet constraints and vehicles.
btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact)
internal method used by the constraint solver, don't use them directly
virtual void getInfo2(btConstraintInfo2 *info)
internal method used by the constraint solver, don't use them directly
btScalar m_appliedImpulse
static btScalar btNormalizeAnglePositive(btScalar angle)
void setFrames(const btTransform &frameA, const btTransform &frameB)
void setMotorTarget(const btQuaternion &qAinB, btScalar dt)
void test(const btScalar angle)
Checks conastaint angle against limit.
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
btScalar getHingeAngle()
The getHingeAngle gives the hinge angle in range [-PI,PI].
#define btAssertConstrParams(_par)
const btRigidBody & getRigidBodyA() const
btScalar getAccumulatedHingeAngle()
void testLimit(const btTransform &transA, const btTransform &transB)
btHingeConstraint(btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA, const btVector3 &pivotInB, const btVector3 &axisInA, const btVector3 &axisInB, bool useReferenceFrameA=false)
const btScalar & getX() const
Return the x value.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
virtual btScalar getParam(int num, int axis=-1) const
return the local value of parameter
btScalar btFabs(btScalar x)