mirror of
https://github.com/bulletphysics/bullet3
synced 2024-12-13 13:20:07 +00:00
Merge pull request #2709 from xhan0619/master
Tune deformable collision parameters for more stable deformable vs. d…
This commit is contained in:
commit
c661179554
@ -50,8 +50,8 @@ public:
|
||||
|
||||
void stepSimulation(float deltaTime)
|
||||
{
|
||||
float internalTimeStep = 1. / 480.f;
|
||||
m_dynamicsWorld->stepSimulation(deltaTime, 8, internalTimeStep);
|
||||
float internalTimeStep = 1. / 240.f;
|
||||
m_dynamicsWorld->stepSimulation(deltaTime, 4, internalTimeStep);
|
||||
}
|
||||
|
||||
void addCloth(btVector3 origin);
|
||||
@ -114,12 +114,13 @@ void DeformableSelfCollision::initPhysics()
|
||||
btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform);
|
||||
btRigidBody::btRigidBodyConstructionInfo rbInfo(mass, myMotionState, groundShape, localInertia);
|
||||
btRigidBody* body = new btRigidBody(rbInfo);
|
||||
body->setFriction(40);
|
||||
body->setFriction(4);
|
||||
|
||||
//add the ground to the dynamics world
|
||||
m_dynamicsWorld->addRigidBody(body);
|
||||
}
|
||||
addCloth(btVector3(0, -0.4, 0));
|
||||
addCloth(btVector3(0, -0.1, 0));
|
||||
addCloth(btVector3(0, 1, 0));
|
||||
getDeformableDynamicsWorld()->setImplicit(false);
|
||||
getDeformableDynamicsWorld()->setLineSearch(false);
|
||||
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
|
||||
@ -134,29 +135,29 @@ void DeformableSelfCollision::addCloth(btVector3 origin)
|
||||
btVector3(+s, h, -2*s),
|
||||
btVector3(-s, h, +2*s),
|
||||
btVector3(+s, h, +2*s),
|
||||
20,40,
|
||||
15,30,
|
||||
// 4,4,
|
||||
0, true, 0.0);
|
||||
|
||||
|
||||
psb->getCollisionShape()->setMargin(0.0075);
|
||||
psb->generateBendingConstraints(3);
|
||||
psb->getCollisionShape()->setMargin(0.02);
|
||||
psb->generateBendingConstraints(2);
|
||||
psb->setTotalMass(.5);
|
||||
psb->m_cfg.kKHR = 1; // collision hardness with kinematic objects
|
||||
psb->m_cfg.kCHR = 1; // collision hardness with rigid body
|
||||
psb->m_cfg.kDF = 0.1;
|
||||
psb->rotate(btQuaternion(0, SIMD_PI / 2, 0));
|
||||
psb->rotate(btQuaternion(0, SIMD_PI / 4, 0));
|
||||
btTransform clothTransform;
|
||||
clothTransform.setIdentity();
|
||||
clothTransform.setOrigin(btVector3(0,0.2,0));
|
||||
clothTransform.setOrigin(btVector3(0,0.2,0)+origin);
|
||||
psb->transform(clothTransform);
|
||||
psb->m_cfg.collisions = btSoftBody::fCollision::SDF_RD;
|
||||
psb->m_cfg.collisions |= btSoftBody::fCollision::VF_DD;
|
||||
getDeformableDynamicsWorld()->addSoftBody(psb);
|
||||
psb->setSelfCollision(true);
|
||||
|
||||
btDeformableMassSpringForce* mass_spring = new btDeformableMassSpringForce(1.5,0.1, true);
|
||||
psb->setSpringStiffness(1);
|
||||
btDeformableMassSpringForce* mass_spring = new btDeformableMassSpringForce(2,0.1, true);
|
||||
psb->setSpringStiffness(2);
|
||||
getDeformableDynamicsWorld()->addForce(psb, mass_spring);
|
||||
m_forces.push_back(mass_spring);
|
||||
btVector3 gravity = btVector3(0, -9.8, 0);
|
||||
|
@ -63,7 +63,7 @@ m_deformableBodySolver(deformableBodySolver), m_solverCallback(0)
|
||||
m_implicit = false;
|
||||
m_lineSearch = false;
|
||||
m_selfCollision = true;
|
||||
m_ccdIterations = 3;
|
||||
m_ccdIterations = 5;
|
||||
m_solverDeformableBodyIslandCallback = new DeformableBodyInplaceSolverIslandCallback(constraintSolver, dispatcher);
|
||||
}
|
||||
|
||||
|
@ -4139,7 +4139,7 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb)
|
||||
if (psb->useSelfCollision())
|
||||
{
|
||||
btSoftColliders::CollideFF_DD docollide;
|
||||
docollide.mrg = getCollisionShape()->getMargin()*2.0;
|
||||
docollide.mrg = getCollisionShape()->getMargin();
|
||||
docollide.psb[0] = this;
|
||||
docollide.psb[1] = psb;
|
||||
if (this->m_tetras.size() > 0)
|
||||
@ -4196,7 +4196,7 @@ void btSoftBody::geometricCollisionHandler(btSoftBody* psb)
|
||||
if (psb->useSelfCollision())
|
||||
{
|
||||
btSoftColliders::CollideCCD docollide;
|
||||
docollide.mrg = 1e-6;
|
||||
docollide.mrg = SAFE_EPSILON;
|
||||
docollide.psb[0] = this;
|
||||
docollide.psb[1] = psb;
|
||||
docollide.dt = psb->m_sst.sdt;
|
||||
|
@ -1173,7 +1173,7 @@ public:
|
||||
static psolver_t getSolver(ePSolver::_ solver);
|
||||
static vsolver_t getSolver(eVSolver::_ solver);
|
||||
void geometricCollisionHandler(btSoftBody* psb);
|
||||
#define SAFE_EPSILON SIMD_EPSILON*10.0
|
||||
#define SAFE_EPSILON SIMD_EPSILON*100.0
|
||||
void updateNode(btDbvtNode* node, bool use_velocity, bool margin)
|
||||
{
|
||||
if (node->isleaf())
|
||||
@ -1307,7 +1307,7 @@ public:
|
||||
bool face_constrained = false, node_constrained = node->m_constrained;
|
||||
for (int i = 0; i < 3; ++i)
|
||||
face_constrained |= face->m_n[i]->m_constrained;
|
||||
btScalar I_tilde = 2.0*I /(1.0+w.length2());
|
||||
btScalar I_tilde = .5 *I /(1.0+w.length2());
|
||||
|
||||
// double the impulse if node or face is constrained.
|
||||
if (face_constrained || node_constrained)
|
||||
@ -1331,7 +1331,7 @@ public:
|
||||
btScalar vt_new = btMax(btScalar(1) - mu * delta_vn / (vt_norm + SIMD_EPSILON), btScalar(0))*vt_norm;
|
||||
I = 0.5 * mass * (vt_norm-vt_new);
|
||||
vt.safeNormalize();
|
||||
I_tilde = 2.0*I /(1.0+w.length2());
|
||||
I_tilde = .5 *I /(1.0+w.length2());
|
||||
// double the impulse if node or face is constrained.
|
||||
if (face_constrained || node_constrained)
|
||||
I_tilde *= 2.0;
|
||||
|
Loading…
Reference in New Issue
Block a user