18#ifndef BT_HINGECONSTRAINT_H
19#define BT_HINGECONSTRAINT_H
21#define _BT_USE_CENTER_LIMIT_ 1
29#ifdef BT_USE_DOUBLE_PRECISION
30#define btHingeConstraintData btHingeConstraintDoubleData2
31#define btHingeConstraintDataName "btHingeConstraintDoubleData2"
33#define btHingeConstraintData btHingeConstraintFloatData
34#define btHingeConstraintDataName "btHingeConstraintFloatData"
50#ifdef IN_PARALLELL_SOLVER
62#ifdef _BT_USE_CENTER_LIMIT_
177#ifdef _BT_USE_CENTER_LIMIT_
178 m_limit.set(low, high, _softness, _biasFactor, _relaxationFactor);
190#ifdef _BT_USE_CENTER_LIMIT_
199#ifdef _BT_USE_CENTER_LIMIT_
200 return m_limit.getBiasFactor();
208#ifdef _BT_USE_CENTER_LIMIT_
209 return m_limit.getRelaxationFactor();
221 m_rbAFrame.getBasis().setValue(rbAxisA1.getX(), rbAxisA2.getX(), axisInA.getX(),
222 rbAxisA1.getY(), rbAxisA2.getY(), axisInA.getY(),
223 rbAxisA1.getZ(), rbAxisA2.getZ(), axisInA.getZ());
225 btVector3 axisInB =
m_rbA.getCenterOfMassTransform().getBasis() * axisInA;
229 btVector3 rbAxisB2 = axisInB.cross(rbAxisB1);
231 m_rbBFrame.getOrigin() =
m_rbB.getCenterOfMassTransform().inverse()(
m_rbA.getCenterOfMassTransform()(pivotInA));
233 m_rbBFrame.getBasis().setValue(rbAxisB1.getX(), rbAxisB2.getX(), axisInB.getX(),
234 rbAxisB1.getY(), rbAxisB2.getY(), axisInB.getY(),
235 rbAxisB1.getZ(), rbAxisB2.getZ(), axisInB.getZ());
241#ifdef _BT_USE_CENTER_LIMIT_
242 return m_limit.getHalfRange() > 0;
250#ifdef _BT_USE_CENTER_LIMIT_
259#ifdef _BT_USE_CENTER_LIMIT_
281#ifdef _BT_USE_CENTER_LIMIT_
290#ifdef _BT_USE_CENTER_LIMIT_
338#ifdef BT_BACKWARDS_COMPATIBLE_SERIALIZATION
445 btTypedConstraint::serialize(&hingeData->m_typeConstraintData, serializer);
455#ifdef _BT_USE_CENTER_LIMIT_
458 hingeData->m_limitSoftness =
float(
m_limit.getSoftness());
459 hingeData->m_biasFactor =
float(
m_limit.getBiasFactor());
460 hingeData->m_relaxationFactor =
float(
m_limit.getRelaxationFactor());
470#ifdef BT_USE_DOUBLE_PRECISION
471 hingeData->m_padding1[0] = 0;
472 hingeData->m_padding1[1] = 0;
473 hingeData->m_padding1[2] = 0;
474 hingeData->m_padding1[3] = 0;
ATTR_WARN_UNUSED_RESULT const size_t num
bool m_useSolveConstraintObsolete
btScalar m_maxMotorImpulse
btVector3 m_accMotorImpulse
btScalar m_relaxationFactor
btFixedConstraint btRigidBody & rbB
btJacobianEntry m_jacAng[3]
3 orthogonal angular constraints
bool m_useOffsetForConstraintFrame
BT_DECLARE_ALIGNED_ALLOCATOR()
void setAccumulatedHingeAngle(btScalar accAngle)
virtual void getInfo2(btConstraintInfo2 *info)
btScalar getHingeAngle()
The getHingeAngle gives the hinge angle in range [-PI,PI].
void setMotorTarget(const btQuaternion &qAinB, btScalar dt)
btHingeAccumulatedAngleConstraint(btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA, const btVector3 &pivotInB, const btVector3 &axisInA, const btVector3 &axisInB, bool useReferenceFrameA=false)
void getInfo2NonVirtual(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
const btTransform & getBFrame() const
const btRigidBody & getRigidBodyA() const
virtual void setParam(int num, btScalar value, int axis=-1)
btScalar getLimitBiasFactor() const
bool m_useReferenceFrameA
virtual int calculateSerializeBufferSize() const
btScalar getLowerLimit() const
btScalar getMotorTargetVelocity()
btTransform & getFrameOffsetB()
bool getUseReferenceFrameA() const
void setUseFrameOffset(bool frameOffsetOnOff)
void setUseReferenceFrameA(bool useReferenceFrameA)
const btRigidBody & getRigidBodyB() const
virtual int getFlags() const
btHingeConstraint(btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA, const btVector3 &pivotInB, const btVector3 &axisInA, const btVector3 &axisInB, bool useReferenceFrameA=false)
void setMotorTargetVelocity(btScalar motorTargetVelocity)
void setLimit(btScalar low, btScalar high, btScalar _softness=0.9f, btScalar _biasFactor=0.3f, btScalar _relaxationFactor=1.0f)
btScalar getLimitRelaxationFactor() const
bool m_enableAngularMotor
virtual btScalar getParam(int num, int axis=-1) const
return the local value of parameter
btScalar getUpperLimit() const
btScalar getAccumulatedHingeAngle()
void enableAngularMotor(bool enableMotor, btScalar targetVelocity, btScalar maxMotorImpulse)
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
void setFrames(const btTransform &frameA, const btTransform &frameB)
const btTransform & getAFrame() const
virtual void buildJacobian()
obsolete methods
void setAngularOnly(bool angularOnly)
btScalar m_motorTargetVelocity
void getInfo1NonVirtual(btConstraintInfo1 *info)
btScalar getLimitSoftness() const
void getInfo2Internal(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
virtual void getInfo1(btConstraintInfo1 *info)
btScalar getMaxMotorImpulse()
void getInfo2InternalUsingFrameOffset(btConstraintInfo2 *info, const btTransform &transA, const btTransform &transB, const btVector3 &angVelA, const btVector3 &angVelB)
btTransform & getFrameOffsetA()
void testLimit(const btTransform &transA, const btTransform &transB)
void setAxis(btVector3 &axisInA)
virtual const char * serialize(void *dataBuffer, btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
void setMaxMotorImpulse(btScalar maxMotorImpulse)
#define btHingeConstraintData
void enableMotor(bool enableMotor)
#define btHingeConstraintDataName
void updateRHS(btScalar timeStep)
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...
#define ATTRIBUTE_ALIGNED16(a)
SIMD_FORCE_INLINE btScalar btNormalizeAngle(btScalar angleInRadians)
#define SIMD_FORCE_INLINE
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...
do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
double m_motorTargetVelocity
btTypedConstraintDoubleData m_typeConstraintData
double m_relaxationFactor
btTransformDoubleData m_rbBFrame
btTransformDoubleData m_rbAFrame
this structure is not used, except for loading pre-2.82 .bullet files
float m_motorTargetVelocity
btTransformDoubleData m_rbAFrame
btTransformDoubleData m_rbBFrame
btTypedConstraintData m_typeConstraintData
btTypedConstraintData m_typeConstraintData
float m_motorTargetVelocity
btTransformFloatData m_rbAFrame
btTransformFloatData m_rbBFrame
this structure is not used, except for loading pre-2.82 .bullet files