112 if (m_maxAppliedImpulse == 0.f)
116 const btVector3 dummy(0, 0, 0);
123 m_bodyA->getJointPosMultiDof(
m_linkA)[1],
124 m_bodyA->getJointPosMultiDof(
m_linkA)[2],
125 m_bodyA->getJointPosMultiDof(
m_linkA)[3]);
129 btGeneric6DofSpring2Constraint::matrixToEulerXYZ(
btMatrix3x3(relRot), angleDiff);
142 btScalar velocityError = desiredVelocity - currentVelocity;
145 frameAworld.setIdentity();
146 frameAworld = m_bodyA->localFrameToWorld(
m_linkA, frameAworld);
150 switch (m_bodyA->getLink(
m_linkA).m_jointType)
154 btVector3 constraintNormalAng = frameAworld.getColumn(row % 3);
155 posError =
m_kp*angleDiff[row % 3];
160 -m_maxAppliedImpulse, m_maxAppliedImpulse,
true);
161 constraintRow.m_orgConstraint =
this;
162 constraintRow.m_orgDofIndex = row;
@ MULTIBODY_CONSTRAINT_SPHERICAL_MOTOR
void allocateJacobiansMultiDof()
btScalar fillMultiBodyConstraint(btMultiBodySolverConstraint &solverConstraint, btMultiBodyJacobianData &data, btScalar *jacOrgA, btScalar *jacOrgB, const btVector3 &constraintNormalAng, const btVector3 &constraintNormalLin, const btVector3 &posAworld, const btVector3 &posBworld, btScalar posError, const btContactSolverInfo &infoGlobal, btScalar lowerLimit, btScalar upperLimit, bool angConstraint=false, btScalar relaxation=1.f, bool isFriction=false, btScalar desiredVelocity=0, btScalar cfmSlip=0)
btScalar * jacobianA(int row)
btMultiBodySolverConstraint
1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and fr...
const btMultibodyLink & getLink(int index) const
virtual int getIslandIdA() const
btVector3 m_desiredVelocity
btMultiBodySphericalJointMotor(btMultiBody *body, int link, btScalar maxMotorImpulse)
This file was written by Erwin Coumans.
virtual void finalizeMultiDof()
virtual void createConstraintRows(btMultiBodyConstraintArray &constraintRows, btMultiBodyJacobianData &data, const btContactSolverInfo &infoGlobal)
virtual int getIslandIdB() const
btQuaternion m_desiredPosition
virtual ~btMultiBodySphericalJointMotor()