summaryrefslogtreecommitdiff
path: root/src/BulletSoftBody/btDeformableContactProjection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/BulletSoftBody/btDeformableContactProjection.cpp')
-rw-r--r--src/BulletSoftBody/btDeformableContactProjection.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/BulletSoftBody/btDeformableContactProjection.cpp b/src/BulletSoftBody/btDeformableContactProjection.cpp
index 1a9cad120..4d6ea4e84 100644
--- a/src/BulletSoftBody/btDeformableContactProjection.cpp
+++ b/src/BulletSoftBody/btDeformableContactProjection.cpp
@@ -88,26 +88,27 @@ void btDeformableContactProjection::update()
const btScalar* J_n = &c->jacobianData_normal.m_jacobians[0];
const btScalar* J_t1 = &c->jacobianData_t1.m_jacobians[0];
const btScalar* J_t2 = &c->jacobianData_t2.m_jacobians[0];
+ const btScalar* local_v = multibodyLinkCol->m_multiBody->getVelocityVector();
deltaV_normal = &c->jacobianData_normal.m_deltaVelocitiesUnitImpulse[0];
-
// add in the normal component of the va
btScalar vel = 0.0;
for (int k = 0; k < ndof; ++k)
{
- vel += multibodyLinkCol->m_multiBody->getVelocityVector()[k] * J_n[k];
+ vel += local_v[k] * J_n[k];
}
va = cti.m_normal * vel * m_dt;
+ // add in the tangential components of the va
vel = 0.0;
for (int k = 0; k < ndof; ++k)
{
- vel += multibodyLinkCol->m_multiBody->getVelocityVector()[k] * J_t1[k];
+ vel += local_v[k] * J_t1[k];
}
va += c->t1 * vel * m_dt;
vel = 0.0;
for (int k = 0; k < ndof; ++k)
{
- vel += multibodyLinkCol->m_multiBody->getVelocityVector()[k] * J_t2[k];
+ vel += local_v[k] * J_t2[k];
}
va += c->t2 * vel * m_dt;
}
@@ -177,7 +178,7 @@ void btDeformableContactProjection::update()
// the following is equivalent
/*
- btVector3 dv = -impulse_normal * c->m_c2/m_dt + c->m_node->m_v - backupVelocity[m_indices[c->m_node]];
+ btVector3 dv = -impulse_normal * c->m_c2/m_dt + c->m_node->m_v - backupVelocity[m_indices->at(c->m_node)];
btScalar dvn = dv.dot(cti.m_normal);
*/
@@ -196,9 +197,11 @@ void btDeformableContactProjection::update()
{
if (multibodyLinkCol)
{
+ // apply normal component of the impulse
multibodyLinkCol->m_multiBody->applyDeltaVeeMultiDof(deltaV_normal, impulse.dot(cti.m_normal));
if (incremental_tangent.norm() > SIMD_EPSILON)
{
+ // apply tangential component of the impulse
const btScalar* deltaV_t1 = &c->jacobianData_t1.m_deltaVelocitiesUnitImpulse[0];
multibodyLinkCol->m_multiBody->applyDeltaVeeMultiDof(deltaV_t1, impulse.dot(c->t1));
const btScalar* deltaV_t2 = &c->jacobianData_t2.m_deltaVelocitiesUnitImpulse[0];
@@ -336,7 +339,7 @@ void btDeformableContactProjection::enforceConstraint(TVStack& x)
for (auto& it : m_constraints)
{
const btAlignedObjectArray<DeformableContactConstraint>& constraints = it.second;
- size_t i = m_indices[it.first];
+ size_t i = m_indices->at(it.first);
const btAlignedObjectArray<DeformableFrictionConstraint>& frictions = m_frictions[it.first];
btAssert(constraints.size() <= dim);
btAssert(constraints.size() > 0);
@@ -399,7 +402,7 @@ void btDeformableContactProjection::project(TVStack& x)
for (auto& it : m_constraints)
{
const btAlignedObjectArray<DeformableContactConstraint>& constraints = it.second;
- size_t i = m_indices[it.first];
+ size_t i = m_indices->at(it.first);
btAlignedObjectArray<DeformableFrictionConstraint>& frictions = m_frictions[it.first];
btAssert(constraints.size() <= dim);
btAssert(constraints.size() > 0);