add btMultiBodyConstraint::finalizeMultiDof API: if you add multi-body constraints to a multi-dof btMultiBody, before it has been finalized using the btMultiBody::finalizeMultiDof call,

then you have to manually call the btMultiBodyConstraint::finalizeMultiDof for all multi-dof multi body constraints.
This commit is contained in:
erwin coumans
2015-03-03 13:24:06 -08:00
parent a391e619ed
commit 5d40d90bd0
13 changed files with 548 additions and 27 deletions

View File

@@ -2171,7 +2171,7 @@ void btMultiBody::calcAccelerationDeltasMultiDof(const btScalar *force, btScalar
// Y_i (scratch), invD_i (cached)
const btScalar * invD = m_dofCount > 0 ? &m_realBuf[6 + m_dofCount] : 0;
btScalar * Y = r_ptr;
btScalar * Y = r_ptr;
////////////////
//aux variables
static btScalar invD_times_Y[6]; //D^{-1} * Y [dofxdof x dofx1 = dofx1] <=> D^{-1} * u; better moved to buffers since it is recalced in calcAccelerationDeltasMultiDof; num_dof of btScalar would cover all bodies

View File

@@ -15,21 +15,25 @@ btMultiBodyConstraint::btMultiBodyConstraint(btMultiBody* bodyA,btMultiBody* bod
m_isUnilateral(isUnilateral),
m_maxAppliedImpulse(100)
{
if(bodyA)
finalizeMultiDof();
}
void btMultiBodyConstraint::finalizeMultiDof()
{
if(m_bodyA)
{
if(bodyA->isMultiDof())
m_jacSizeA = (6 + bodyA->getNumDofs());
if(m_bodyA->isMultiDof())
m_jacSizeA = (6 + m_bodyA->getNumDofs());
else
m_jacSizeA = (6 + bodyA->getNumLinks());
m_jacSizeA = (6 + m_bodyA->getNumLinks());
}
if(bodyB)
if(m_bodyB)
{
if(bodyB->isMultiDof())
m_jacSizeBoth = m_jacSizeA + 6 + bodyB->getNumDofs();
if(m_bodyB->isMultiDof())
m_jacSizeBoth = m_jacSizeA + 6 + m_bodyB->getNumDofs();
else
m_jacSizeBoth = m_jacSizeA + 6 + bodyB->getNumLinks();
m_jacSizeBoth = m_jacSizeA + 6 + m_bodyB->getNumLinks();
}
else
m_jacSizeBoth = m_jacSizeA;

View File

@@ -82,7 +82,7 @@ public:
btMultiBodyConstraint(btMultiBody* bodyA,btMultiBody* bodyB,int linkA, int linkB, int numRows, bool isUnilateral);
virtual ~btMultiBodyConstraint();
void finalizeMultiDof();
virtual int getIslandIdA() const =0;
virtual int getIslandIdB() const =0;