fix bug in computing rhs in momentum solve

This commit is contained in:
Xuchen Han
2019-10-05 17:42:37 -07:00
parent 0cb7cb2445
commit c610ba49df
9 changed files with 50 additions and 47 deletions

View File

@@ -196,7 +196,7 @@ void DeformableContact::initPhysics()
getDeformableDynamicsWorld()->addForce(psb2, gravity_force2); getDeformableDynamicsWorld()->addForce(psb2, gravity_force2);
m_forces.push_back(gravity_force2); m_forces.push_back(gravity_force2);
} }
getDeformableDynamicsWorld()->setImplicit(true); getDeformableDynamicsWorld()->setImplicit(false);
getDeformableDynamicsWorld()->setLineSearch(false); getDeformableDynamicsWorld()->setLineSearch(false);
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
} }

View File

@@ -231,7 +231,7 @@ void DeformableRigid::initPhysics()
// add a few rigid bodies // add a few rigid bodies
Ctor_RbUpStack(1); Ctor_RbUpStack(1);
} }
getDeformableDynamicsWorld()->setImplicit(true); getDeformableDynamicsWorld()->setImplicit(false);
getDeformableDynamicsWorld()->setLineSearch(false); getDeformableDynamicsWorld()->setLineSearch(false);
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
} }

View File

@@ -175,7 +175,7 @@ void DeformableSelfCollision::initPhysics()
getDeformableDynamicsWorld()->addForce(psb, gravity_force); getDeformableDynamicsWorld()->addForce(psb, gravity_force);
m_forces.push_back(gravity_force); m_forces.push_back(gravity_force);
} }
getDeformableDynamicsWorld()->setImplicit(true); getDeformableDynamicsWorld()->setImplicit(false);
getDeformableDynamicsWorld()->setLineSearch(false); getDeformableDynamicsWorld()->setLineSearch(false);
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
} }

View File

@@ -269,6 +269,7 @@ void GraspDeformable::initPhysics()
} }
// create a soft block // create a soft block
if(0)
{ {
char relative_path[1024]; char relative_path[1024];
// b3FileUtils::findFile("banana.vtk", relative_path, 1024); // b3FileUtils::findFile("banana.vtk", relative_path, 1024);
@@ -291,7 +292,7 @@ void GraspDeformable::initPhysics()
// psb->scale(btVector3(30, 30, 30)); // for banana // psb->scale(btVector3(30, 30, 30)); // for banana
// psb->scale(btVector3(.2, .2, .2)); // psb->scale(btVector3(.2, .2, .2));
// psb->scale(btVector3(2, 2, 2)); // psb->scale(btVector3(2, 2, 2));
psb->scale(btVector3(.3, .3, .3)); // for tube, torus, boot psb->scale(btVector3(.1, .1, .1)); // for tube, torus, boot
// psb->scale(btVector3(.1, .1, .1)); // for ditto // psb->scale(btVector3(.1, .1, .1)); // for ditto
// psb->translate(btVector3(.25, 2, 0.4)); // psb->translate(btVector3(.25, 2, 0.4));
psb->getCollisionShape()->setMargin(0.01); psb->getCollisionShape()->setMargin(0.01);
@@ -306,44 +307,46 @@ void GraspDeformable::initPhysics()
getDeformableDynamicsWorld()->addForce(psb, gravity_force); getDeformableDynamicsWorld()->addForce(psb, gravity_force);
m_forces.push_back(gravity_force); m_forces.push_back(gravity_force);
btDeformableNeoHookeanForce* neohookean = new btDeformableNeoHookeanForce(10,20, 0.01); btDeformableNeoHookeanForce* neohookean = new btDeformableNeoHookeanForce(100,200, 0.05);
getDeformableDynamicsWorld()->addForce(psb, neohookean); getDeformableDynamicsWorld()->addForce(psb, neohookean);
m_forces.push_back(neohookean); m_forces.push_back(neohookean);
} }
getDeformableDynamicsWorld()->setImplicit(false);
// // create a piece of cloth // create a piece of cloth
// { {
// bool onGround = false; bool onGround = false;
// const btScalar s = .4; const btScalar s = .4;
// btSoftBody* psb = btSoftBodyHelpers::CreatePatch(getDeformableDynamicsWorld()->getWorldInfo(), btVector3(-s, 0, -s), btSoftBody* psb = btSoftBodyHelpers::CreatePatch(getDeformableDynamicsWorld()->getWorldInfo(), btVector3(-s, 0, -s),
// btVector3(+s, 0, -s), btVector3(+s, 0, -s),
// btVector3(-s, 0, +s), btVector3(-s, 0, +s),
// btVector3(+s, 0, +s), btVector3(+s, 0, +s),
// 20,20, 20,20,
// 0, true); 0, true);
//
// if (onGround) if (onGround)
// psb = btSoftBodyHelpers::CreatePatch(getDeformableDynamicsWorld()->getWorldInfo(), btVector3(-s, 0, -s), psb = btSoftBodyHelpers::CreatePatch(getDeformableDynamicsWorld()->getWorldInfo(), btVector3(-s, 0, -s),
// btVector3(+s, 0, -s), btVector3(+s, 0, -s),
// btVector3(-s, 0, +s), btVector3(-s, 0, +s),
// btVector3(+s, 0, +s), btVector3(+s, 0, +s),
// // 20,20, // 20,20,
// 2,2, 2,2,
// 0, true); 0, true);
//
// psb->getCollisionShape()->setMargin(0.02); psb->getCollisionShape()->setMargin(0.005);
// psb->generateBendingConstraints(2); psb->generateBendingConstraints(2);
// psb->setTotalMass(.01); psb->setTotalMass(.01);
// psb->setSpringStiffness(5); psb->setSpringStiffness(5);
// psb->setDampingCoefficient(0.05); psb->setDampingCoefficient(0.05);
// psb->m_cfg.kKHR = 1; // collision hardness with kinematic objects psb->m_cfg.kKHR = 1; // collision hardness with kinematic objects
// psb->m_cfg.kCHR = 1; // collision hardness with rigid body psb->m_cfg.kCHR = 1; // collision hardness with rigid body
// psb->m_cfg.kDF = 1; psb->m_cfg.kDF = 1;
// psb->m_cfg.collisions = btSoftBody::fCollision::SDF_RD; psb->m_cfg.collisions = btSoftBody::fCollision::SDF_RD;
// getDeformableDynamicsWorld()->addSoftBody(psb); psb->m_cfg.collisions |= btSoftBody::fCollision::VF_DD;
// getDeformableDynamicsWorld()->addForce(psb, new btDeformableMassSpringForce(.2,0.02, true)); getDeformableDynamicsWorld()->addSoftBody(psb);
// getDeformableDynamicsWorld()->addForce(psb, new btDeformableGravityForce(gravity)); getDeformableDynamicsWorld()->addForce(psb, new btDeformableMassSpringForce(.2,0.02, true));
// } getDeformableDynamicsWorld()->addForce(psb, new btDeformableGravityForce(gravity));
}
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);

View File

@@ -350,7 +350,7 @@ void PinchFriction::initPhysics()
getDeformableDynamicsWorld()->addForce(psb3, neohookean); getDeformableDynamicsWorld()->addForce(psb3, neohookean);
m_forces.push_back(neohookean); m_forces.push_back(neohookean);
} }
getDeformableDynamicsWorld()->setImplicit(false);
// add a pair of grippers // add a pair of grippers
createGrip(); createGrip();
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);

View File

@@ -228,7 +228,7 @@ void VolumetricDeformable::initPhysics()
m_forces.push_back(neohookean); m_forces.push_back(neohookean);
} }
getDeformableDynamicsWorld()->setImplicit(true); getDeformableDynamicsWorld()->setImplicit(false);
getDeformableDynamicsWorld()->setLineSearch(false); getDeformableDynamicsWorld()->setLineSearch(false);
// add a few rigid bodies // add a few rigid bodies
Ctor_RbUpStack(4); Ctor_RbUpStack(4);

View File

@@ -66,7 +66,6 @@ public:
// temp = A*p // temp = A*p
A.multiply(p, temp); A.multiply(p, temp);
A.project(temp); A.project(temp);
// alpha = r^T * z / (p^T * A * p)
if (dot(p,temp) < SIMD_EPSILON) if (dot(p,temp) < SIMD_EPSILON)
{ {
if (verbose) if (verbose)
@@ -77,6 +76,7 @@ public:
} }
return k; return k;
} }
// alpha = r^T * z / (p^T * A * p)
btScalar alpha = r_dot_z_new / dot(p, temp); btScalar alpha = r_dot_z_new / dot(p, temp);
// x += alpha * p; // x += alpha * p;
multAndAddTo(alpha, p, x); multAndAddTo(alpha, p, x);

View File

@@ -21,7 +21,7 @@
btDeformableBodySolver::btDeformableBodySolver() btDeformableBodySolver::btDeformableBodySolver()
: m_numNodes(0) : m_numNodes(0)
, m_cg(20) , m_cg(200)
, m_maxNewtonIterations(5) , m_maxNewtonIterations(5)
, m_newtonTolerance(1e-4) , m_newtonTolerance(1e-4)
, m_lineSearch(true) , m_lineSearch(true)
@@ -301,6 +301,7 @@ void btDeformableBodySolver::setupDeformableSolve(bool implicit)
m_backupVelocity[counter] = psb->m_nodes[j].m_vn; m_backupVelocity[counter] = psb->m_nodes[j].m_vn;
} }
m_dv[counter] = psb->m_nodes[j].m_v - m_backupVelocity[counter]; m_dv[counter] = psb->m_nodes[j].m_v - m_backupVelocity[counter];
psb->m_nodes[j].m_v = m_backupVelocity[counter];
++counter; ++counter;
} }
} }

View File

@@ -23,7 +23,7 @@ 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 = 50; // 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++)
{ {
@@ -33,10 +33,9 @@ btScalar btDeformableMultiBodyConstraintSolver::solveGroupCacheFriendlyIteration
m_leastSquaresResidual = solveSingleIteration(iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer); m_leastSquaresResidual = solveSingleIteration(iteration, bodies, numBodies, manifoldPtr, numManifolds, constraints, numConstraints, infoGlobal, debugDrawer);
// solver body velocity -> rigid body velocity // solver body velocity -> rigid body velocity
solverBodyWriteBack(infoGlobal); solverBodyWriteBack(infoGlobal);
btScalar deformableResidual = m_deformableSolver->solveContactConstraints();
// update rigid body velocity in rigid/deformable contact // update rigid body velocity in rigid/deformable contact
m_leastSquaresResidual = btMax(m_leastSquaresResidual, m_deformableSolver->solveContactConstraints()); m_leastSquaresResidual = btMax(m_leastSquaresResidual, deformableResidual);
// solver body velocity <- rigid body velocity // solver body velocity <- rigid body velocity
writeToSolverBody(bodies, numBodies, infoGlobal); writeToSolverBody(bodies, numBodies, infoGlobal);