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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user