196 lines
5.9 KiB
C++
196 lines
5.9 KiB
C++
|
/*
|
||
|
Bullet Continuous Collision Detection and Physics Library
|
||
|
Copyright (c) 2013 Erwin Coumans http://bulletphysics.org
|
||
|
|
||
|
This software is provided 'as-is', without any express or implied warranty.
|
||
|
In no event will the authors be held liable for any damages arising from the use of this software.
|
||
|
Permission is granted to anyone to use this software for any purpose,
|
||
|
including commercial applications, and to alter it and redistribute it freely,
|
||
|
subject to the following restrictions:
|
||
|
|
||
|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
|
||
|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
|
||
|
3. This notice may not be removed or altered from any source distribution.
|
||
|
*/
|
||
|
|
||
|
#ifndef BT_MULTIBODY_CONSTRAINT_H
|
||
|
#define BT_MULTIBODY_CONSTRAINT_H
|
||
|
|
||
|
#include "LinearMath/btScalar.h"
|
||
|
#include "LinearMath/btAlignedObjectArray.h"
|
||
|
#include "btMultiBody.h"
|
||
|
|
||
|
class btMultiBody;
|
||
|
struct btSolverInfo;
|
||
|
|
||
|
#include "btMultiBodySolverConstraint.h"
|
||
|
|
||
|
struct btMultiBodyJacobianData
|
||
|
{
|
||
|
btAlignedObjectArray<btScalar> m_jacobians;
|
||
|
btAlignedObjectArray<btScalar> m_deltaVelocitiesUnitImpulse; //holds the joint-space response of the corresp. tree to the test impulse in each constraint space dimension
|
||
|
btAlignedObjectArray<btScalar> m_deltaVelocities; //holds joint-space vectors of all the constrained trees accumulating the effect of corrective impulses applied in SI
|
||
|
btAlignedObjectArray<btScalar> scratch_r;
|
||
|
btAlignedObjectArray<btVector3> scratch_v;
|
||
|
btAlignedObjectArray<btMatrix3x3> scratch_m;
|
||
|
btAlignedObjectArray<btSolverBody>* m_solverBodyPool;
|
||
|
int m_fixedBodyId;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
ATTRIBUTE_ALIGNED16(class) btMultiBodyConstraint
|
||
|
{
|
||
|
protected:
|
||
|
|
||
|
btMultiBody* m_bodyA;
|
||
|
btMultiBody* m_bodyB;
|
||
|
int m_linkA;
|
||
|
int m_linkB;
|
||
|
|
||
|
int m_numRows;
|
||
|
int m_jacSizeA;
|
||
|
int m_jacSizeBoth;
|
||
|
int m_posOffset;
|
||
|
|
||
|
bool m_isUnilateral;
|
||
|
int m_numDofsFinalized;
|
||
|
btScalar m_maxAppliedImpulse;
|
||
|
|
||
|
|
||
|
// warning: the data block lay out is not consistent for all constraints
|
||
|
// data block laid out as follows:
|
||
|
// cached impulses. (one per row.)
|
||
|
// jacobians. (interleaved, row1 body1 then row1 body2 then row2 body 1 etc)
|
||
|
// positions. (one per row.)
|
||
|
btAlignedObjectArray<btScalar> m_data;
|
||
|
|
||
|
void applyDeltaVee(btMultiBodyJacobianData& data, btScalar* delta_vee, btScalar impulse, int velocityIndex, int ndof);
|
||
|
|
||
|
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);
|
||
|
|
||
|
public:
|
||
|
|
||
|
BT_DECLARE_ALIGNED_ALLOCATOR();
|
||
|
|
||
|
btMultiBodyConstraint(btMultiBody* bodyA,btMultiBody* bodyB,int linkA, int linkB, int numRows, bool isUnilateral);
|
||
|
virtual ~btMultiBodyConstraint();
|
||
|
|
||
|
void updateJacobianSizes();
|
||
|
void allocateJacobiansMultiDof();
|
||
|
|
||
|
//many constraints have setFrameInB/setPivotInB. Will use 'getConstraintType' later.
|
||
|
virtual void setFrameInB(const btMatrix3x3& frameInB) {}
|
||
|
virtual void setPivotInB(const btVector3& pivotInB){}
|
||
|
|
||
|
virtual void finalizeMultiDof()=0;
|
||
|
|
||
|
virtual int getIslandIdA() const =0;
|
||
|
virtual int getIslandIdB() const =0;
|
||
|
|
||
|
virtual void createConstraintRows(btMultiBodyConstraintArray& constraintRows,
|
||
|
btMultiBodyJacobianData& data,
|
||
|
const btContactSolverInfo& infoGlobal)=0;
|
||
|
|
||
|
int getNumRows() const
|
||
|
{
|
||
|
return m_numRows;
|
||
|
}
|
||
|
|
||
|
btMultiBody* getMultiBodyA()
|
||
|
{
|
||
|
return m_bodyA;
|
||
|
}
|
||
|
btMultiBody* getMultiBodyB()
|
||
|
{
|
||
|
return m_bodyB;
|
||
|
}
|
||
|
|
||
|
void internalSetAppliedImpulse(int dof, btScalar appliedImpulse)
|
||
|
{
|
||
|
btAssert(dof>=0);
|
||
|
btAssert(dof < getNumRows());
|
||
|
m_data[dof] = appliedImpulse;
|
||
|
|
||
|
}
|
||
|
|
||
|
btScalar getAppliedImpulse(int dof)
|
||
|
{
|
||
|
btAssert(dof>=0);
|
||
|
btAssert(dof < getNumRows());
|
||
|
return m_data[dof];
|
||
|
}
|
||
|
// current constraint position
|
||
|
// constraint is pos >= 0 for unilateral, or pos = 0 for bilateral
|
||
|
// NOTE: ignored position for friction rows.
|
||
|
btScalar getPosition(int row) const
|
||
|
{
|
||
|
return m_data[m_posOffset + row];
|
||
|
}
|
||
|
|
||
|
void setPosition(int row, btScalar pos)
|
||
|
{
|
||
|
m_data[m_posOffset + row] = pos;
|
||
|
}
|
||
|
|
||
|
|
||
|
bool isUnilateral() const
|
||
|
{
|
||
|
return m_isUnilateral;
|
||
|
}
|
||
|
|
||
|
// jacobian blocks.
|
||
|
// each of size 6 + num_links. (jacobian2 is null if no body2.)
|
||
|
// format: 3 'omega' coefficients, 3 'v' coefficients, then the 'qdot' coefficients.
|
||
|
btScalar* jacobianA(int row)
|
||
|
{
|
||
|
return &m_data[m_numRows + row * m_jacSizeBoth];
|
||
|
}
|
||
|
const btScalar* jacobianA(int row) const
|
||
|
{
|
||
|
return &m_data[m_numRows + (row * m_jacSizeBoth)];
|
||
|
}
|
||
|
btScalar* jacobianB(int row)
|
||
|
{
|
||
|
return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA];
|
||
|
}
|
||
|
const btScalar* jacobianB(int row) const
|
||
|
{
|
||
|
return &m_data[m_numRows + (row * m_jacSizeBoth) + m_jacSizeA];
|
||
|
}
|
||
|
|
||
|
btScalar getMaxAppliedImpulse() const
|
||
|
{
|
||
|
return m_maxAppliedImpulse;
|
||
|
}
|
||
|
void setMaxAppliedImpulse(btScalar maxImp)
|
||
|
{
|
||
|
m_maxAppliedImpulse = maxImp;
|
||
|
}
|
||
|
|
||
|
virtual void debugDraw(class btIDebugDraw* drawer)=0;
|
||
|
|
||
|
virtual void setGearRatio(btScalar ratio) {}
|
||
|
virtual void setGearAuxLink(int gearAuxLink) {}
|
||
|
virtual void setRelativePositionTarget(btScalar relPosTarget){}
|
||
|
virtual void setErp(btScalar erp){}
|
||
|
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif //BT_MULTIBODY_CONSTRAINT_H
|
||
|
|