24 #define BTMBSLIDERCONSTRAINT_DIM 5
25 #define EPSILON 0.000001
35 m_jointAxis(jointAxis)
48 m_jointAxis(jointAxis)
74 return col->getIslandTag();
78 if (m_bodyA->getLink(
m_linkA).m_collider)
79 return m_bodyA->getLink(
m_linkA).m_collider->getIslandTag();
95 return col->getIslandTag();
137 for (
int i = 0; i < 3; ++i)
139 constraintAxis[0] = frameAworld.getColumn(i).cross(jointAxis);
142 constraintAxis[0] = constraintAxis[0].normalized();
143 constraintAxis[1] = jointAxis.cross(constraintAxis[0]);
144 constraintAxis[1] = constraintAxis[1].normalized();
149 btMatrix3x3 relRot = frameAworld.inverse() * frameBworld;
154 for (
int i = 0; i < numDim; i++)
157 constraintRow.m_orgConstraint =
this;
158 constraintRow.m_orgDofIndex = i;
159 constraintRow.m_relpos1CrossNormal.setValue(0, 0, 0);
160 constraintRow.m_contactNormal1.setValue(0, 0, 0);
161 constraintRow.m_relpos2CrossNormal.setValue(0, 0, 0);
162 constraintRow.m_contactNormal2.setValue(0, 0, 0);
163 constraintRow.m_angularComponentA.setValue(0, 0, 0);
164 constraintRow.m_angularComponentB.setValue(0, 0, 0);
166 constraintRow.m_solverBodyIdA =
data.m_fixedBodyId;
167 constraintRow.m_solverBodyIdB =
data.m_fixedBodyId;
171 constraintRow.m_solverBodyIdA =
m_rigidBodyA->getCompanionId();
175 constraintRow.m_solverBodyIdB =
m_rigidBodyB->getCompanionId();
183 constraintNormalLin = constraintAxis[i];
184 posError = (pivotAworld - pivotBworld).
dot(constraintNormalLin);
186 constraintNormalLin, pivotAworld, pivotBworld,
193 constraintNormalAng = frameAworld.getColumn(i % 3);
194 posError = angleDiff[i % 3];
196 constraintNormalLin, pivotAworld, pivotBworld,
218 tr.setOrigin(pivotAworld);
231 tr.setOrigin(pivotBworld);
btFixedConstraint btRigidBody const btTransform & frameInA
btFixedConstraint btRigidBody const btTransform const btTransform & frameInB
bool matrixToEulerXYZ(const btMatrix3x3 &mat, btVector3 &xyz)
MatrixToEulerXYZ from http://www.geometrictools.com/LibFoundation/Mathematics/Wm4Matrix3....
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
@ MULTIBODY_CONSTRAINT_SLIDER
btAlignedObjectArray< btScalar > m_data
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 m_maxAppliedImpulse
btRigidBody * m_rigidBodyB
#define BTMBSLIDERCONSTRAINT_DIM
This file was written by Erwin Coumans.
btMultiBodySolverConstraint
1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and fr...
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...
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint int const btContactSolverInfo & infoGlobal
SIMD_FORCE_INLINE btScalar safeNorm() const
Return the norm (length) of the vector.
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
SIMD_FORCE_INLINE T & expandNonInitializing()
virtual void drawTransform(const btTransform &transform, btScalar orthoLen)
btRigidBody * m_rigidBodyA
virtual ~btMultiBodySliderConstraint()
virtual void createConstraintRows(btMultiBodyConstraintArray &constraintRows, btMultiBodyJacobianData &data, const btContactSolverInfo &infoGlobal)
virtual void debugDraw(class btIDebugDraw *drawer)
btMultiBodySliderConstraint(btMultiBody *body, int link, btRigidBody *bodyB, const btVector3 &pivotInA, const btVector3 &pivotInB, const btMatrix3x3 &frameInA, const btMatrix3x3 &frameInB, const btVector3 &jointAxis)
virtual int getIslandIdB() const
virtual int getIslandIdA() const
virtual void finalizeMultiDof()
btRigidBody * m_rigidBodyB
btQuaternion getOrientation() const
const btTransform & getCenterOfMassTransform() const
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)