add option to turn face contact on/off
This commit is contained in:
@@ -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++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user