add option to turn face contact on/off

This commit is contained in:
Xuchen Han
2019-10-14 15:21:58 -07:00
parent 05c25a27de
commit 774937bcd6
4 changed files with 23 additions and 16 deletions

View File

@@ -23,7 +23,6 @@ btScalar btDeformableMultiBodyConstraintSolver::solveGroupCacheFriendlyIteration
///this is a special step to resolve penetrations (just for contacts) ///this is a special step to resolve penetrations (just for contacts)
solveGroupCacheFriendlySplitImpulseIterations(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer); solveGroupCacheFriendlySplitImpulseIterations(bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
// m_maxOverrideNumSolverIterations = 10;
int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations ? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations; int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations ? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations;
for (int iteration = 0; iteration < maxIterations; iteration++) for (int iteration = 0; iteration < maxIterations; iteration++)
{ {

View File

@@ -88,8 +88,6 @@ void btDeformableMultiBodyDynamicsWorld::softBodySelfCollision()
void btDeformableMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep) void btDeformableMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep)
{ {
BT_PROFILE("integrateTransforms"); BT_PROFILE("integrateTransforms");
//m_deformableBodySolver->backupVelocity();
//positionCorrection(timeStep); // looks like position correction is no longer necessary
btMultiBodyDynamicsWorld::integrateTransforms(timeStep); btMultiBodyDynamicsWorld::integrateTransforms(timeStep);
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
@@ -116,16 +114,12 @@ void btDeformableMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep)
} }
psb->interpolateRenderMesh(); psb->interpolateRenderMesh();
} }
//m_deformableBodySolver->revertVelocity();
} }
void btDeformableMultiBodyDynamicsWorld::solveConstraints(btScalar timeStep) void btDeformableMultiBodyDynamicsWorld::solveConstraints(btScalar timeStep)
{ {
if (!m_implicit) // save v_{n+1}^* velocity after explicit forces
{ m_deformableBodySolver->backupVelocity();
// save v_{n+1}^* velocity after explicit forces
m_deformableBodySolver->backupVelocity();
}
// set up constraints among multibodies and between multibodies and deformable bodies // set up constraints among multibodies and between multibodies and deformable bodies
setupConstraints(); setupConstraints();

View File

@@ -117,6 +117,9 @@ void btSoftBody::initDefaults()
m_windVelocity = btVector3(0, 0, 0); m_windVelocity = btVector3(0, 0, 0);
m_restLengthScale = btScalar(1.0); m_restLengthScale = btScalar(1.0);
m_dampingCoefficient = 1; m_dampingCoefficient = 1;
m_sleepingThreshold = 0.01;
m_useFaceContact = false;
m_collisionFlags = 0;
} }
// //
@@ -3494,13 +3497,16 @@ void btSoftBody::defaultCollisionHandler(const btCollisionObjectWrapper* pcoWrap
docollideNode.stamargin = basemargin; docollideNode.stamargin = basemargin;
m_ndbvt.collideTV(m_ndbvt.m_root, volume, docollideNode); m_ndbvt.collideTV(m_ndbvt.m_root, volume, docollideNode);
btSoftColliders::CollideSDF_RDF docollideFace; if (this->m_useFaceContact)
docollideFace.psb = this; {
docollideFace.m_colObj1Wrap = pcoWrap; btSoftColliders::CollideSDF_RDF docollideFace;
docollideFace.m_rigidBody = prb1; docollideFace.psb = this;
docollideFace.dynmargin = basemargin + timemargin; docollideFace.m_colObj1Wrap = pcoWrap;
docollideFace.stamargin = basemargin; docollideFace.m_rigidBody = prb1;
m_fdbvt.collideTV(m_fdbvt.m_root, volume, docollideFace); docollideFace.dynmargin = basemargin + timemargin;
docollideFace.stamargin = basemargin;
m_fdbvt.collideTV(m_fdbvt.m_root, volume, docollideFace);
}
} }
} }
break; break;

View File

@@ -789,6 +789,9 @@ public:
btDbvt m_cdbvt; // Clusters tree btDbvt m_cdbvt; // Clusters tree
tClusterArray m_clusters; // Clusters tClusterArray m_clusters; // Clusters
btScalar m_dampingCoefficient; // Damping Coefficient btScalar m_dampingCoefficient; // Damping Coefficient
btScalar m_sleepingThreshold;
btScalar m_maxSpeedSquared;
bool m_useFaceContact;
btAlignedObjectArray<btVector4> m_renderNodesInterpolationWeights; btAlignedObjectArray<btVector4> m_renderNodesInterpolationWeights;
btAlignedObjectArray<btAlignedObjectArray<const btSoftBody::Node*> > m_renderNodesParents; btAlignedObjectArray<btAlignedObjectArray<const btSoftBody::Node*> > m_renderNodesParents;
@@ -829,6 +832,11 @@ public:
{ {
m_dampingCoefficient = damping_coeff; m_dampingCoefficient = damping_coeff;
} }
void setUseFaceContact(bool useFaceContact)
{
m_useFaceContact = false;
}
///@todo: avoid internal softbody shape hack and move collision code to collision library ///@todo: avoid internal softbody shape hack and move collision code to collision library
virtual void setCollisionShape(btCollisionShape* collisionShape) virtual void setCollisionShape(btCollisionShape* collisionShape)