build islands once and process islands arbitrary number of times in update constraints

This commit is contained in:
Xuchen Han
2019-08-13 14:37:45 -07:00
parent 9e6e571732
commit 07bf736aeb
7 changed files with 29 additions and 9 deletions

View File

@@ -338,13 +338,17 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher, btCollisi
} }
} }
///@todo: this is random access, it can be walked 'cache friendly'! ///@todo: this is random access, it can be walked 'cache friendly'!
void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback) void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback)
{ {
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
buildIslands(dispatcher, collisionWorld); buildIslands(dispatcher, collisionWorld);
processIslands(dispatcher, collisionWorld, callback);
}
void btSimulationIslandManager::processIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback)
{
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
int endIslandIndex = 1; int endIslandIndex = 1;
int startIslandIndex; int startIslandIndex;
int numElem = getUnionFind().getNumElements(); int numElem = getUnionFind().getNumElements();

View File

@@ -57,7 +57,7 @@ public:
}; };
void buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback); void buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback);
void processIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback);
void buildIslands(btDispatcher* dispatcher, btCollisionWorld* colWorld); void buildIslands(btDispatcher* dispatcher, btCollisionWorld* colWorld);
bool getSplitIslands() bool getSplitIslands()

View File

@@ -428,13 +428,18 @@ void btMultiBodyDynamicsWorld::forwardKinematics()
void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo) void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
{ {
solveExternalForces(solverInfo); solveExternalForces(solverInfo);
buildIslands(); m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverMultiBodyIslandCallback);
solveInternalConstraints(solverInfo); solveInternalConstraints(solverInfo);
} }
void btMultiBodyDynamicsWorld::buildIslands() void btMultiBodyDynamicsWorld::buildIslands()
{ {
m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverMultiBodyIslandCallback); m_islandManager->buildIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld());
}
void btMultiBodyDynamicsWorld::processIslands()
{
m_islandManager->processIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverMultiBodyIslandCallback);
} }
void btMultiBodyDynamicsWorld::solveInternalConstraints(btContactSolverInfo& solverInfo) void btMultiBodyDynamicsWorld::solveInternalConstraints(btContactSolverInfo& solverInfo)
@@ -1086,3 +1091,8 @@ void btMultiBodyDynamicsWorld::serializeMultiBodies(btSerializer* serializer)
} }
} }
} }
void btMultiBodyDynamicsWorld::setSplitIslands(bool split)
{
m_islandManager->setSplitIslands(split);
}

View File

@@ -118,6 +118,8 @@ public:
virtual void solveExternalForces(btContactSolverInfo& solverInfo); virtual void solveExternalForces(btContactSolverInfo& solverInfo);
virtual void solveInternalConstraints(btContactSolverInfo& solverInfo); virtual void solveInternalConstraints(btContactSolverInfo& solverInfo);
void buildIslands(); void buildIslands();
void processIslands();
void setSplitIslands(bool split);
}; };
#endif //BT_MULTIBODY_DYNAMICS_WORLD_H #endif //BT_MULTIBODY_DYNAMICS_WORLD_H

View File

@@ -143,6 +143,8 @@ void btDeformableBackwardEulerObjective::setConstraints()
{ {
// build islands for multibody solve // build islands for multibody solve
m_world->btMultiBodyDynamicsWorld::buildIslands(); m_world->btMultiBodyDynamicsWorld::buildIslands();
// for repeated constraint solve, splitIslands has to be set to true
m_world->setSplitIslands(true);
projection.setConstraints(); projection.setConstraints();
} }

View File

@@ -19,7 +19,7 @@
btDeformableBodySolver::btDeformableBodySolver() btDeformableBodySolver::btDeformableBodySolver()
: m_numNodes(0) : m_numNodes(0)
, m_cg(10) , m_cg(10)
, m_contact_iterations(10) , m_contact_iterations(5)
{ {
m_objective = new btDeformableBackwardEulerObjective(m_softBodySet, m_backupVelocity); m_objective = new btDeformableBackwardEulerObjective(m_softBodySet, m_backupVelocity);
} }

View File

@@ -51,9 +51,11 @@ static btVector3 generateUnitOrthogonalVector(const btVector3& u)
void btDeformableContactProjection::update() void btDeformableContactProjection::update()
{ {
///solve rigid body constraints ///solve rigid body constraints
{
m_world->getSolverInfo().m_numIterations = 1; m_world->getSolverInfo().m_numIterations = 1;
m_world->btMultiBodyDynamicsWorld::solveInternalConstraints(m_world->getSolverInfo()); m_world->processIslands();
m_world->btMultiBodyDynamicsWorld::solveInternalConstraints(m_world->getSolverInfo()); // process constraints deferred in the previous step
}
// loop through constraints to set constrained values // loop through constraints to set constrained values
for (int index = 0; index < m_constraints.size(); ++index) for (int index = 0; index < m_constraints.size(); ++index)
{ {