support implicit integration in picking force

This commit is contained in:
Xuchen Han
2020-06-24 17:48:43 -07:00
parent 7523861bf5
commit bf8cf19665
4 changed files with 31 additions and 5 deletions

View File

@@ -21,11 +21,13 @@ struct CommonDeformableBodyBase : public CommonMultiBodyBase
btAlignedObjectArray<btDeformableLagrangianForce*> m_forces;
btSoftBody* m_pickedSoftBody;
btDeformableMousePickingForce* m_mouseForce;
btScalar m_maxPickingForce;
btScalar m_pickingForceElasticStiffness, m_pickingForceDampingStiffness, m_maxPickingForce;
CommonDeformableBodyBase(GUIHelperInterface* helper)
: CommonMultiBodyBase(helper),
m_pickedSoftBody(0),
m_mouseForce(0),
m_pickingForceElasticStiffness(100),
m_pickingForceDampingStiffness(0.0),
m_maxPickingForce(0.3)
{
}
@@ -115,7 +117,7 @@ struct CommonDeformableBodyBase : public CommonMultiBodyBase
m_pickedSoftBody = psb;
psb->setActivationState(DISABLE_DEACTIVATION);
const btSoftBody::Face& f = psb->m_faces[face_id];
btDeformableMousePickingForce* mouse_force = new btDeformableMousePickingForce(100, 0, f, m_hitPos, m_maxPickingForce);
btDeformableMousePickingForce* mouse_force = new btDeformableMousePickingForce(m_pickingForceElasticStiffness, m_pickingForceDampingStiffness, f, m_hitPos, m_maxPickingForce);
m_mouseForce = mouse_force;
getDeformableDynamicsWorld()->addForce(psb, mouse_force);
}

View File

@@ -46,6 +46,9 @@ public:
: CommonDeformableBodyBase(helper)
{
m_linearElasticity = 0;
m_pickingForceElasticStiffness = 100;
m_pickingForceDampingStiffness = 0;
m_maxPickingForce = 1e10; // allow large picking force with implicit scheme.
}
virtual ~VolumetricDeformable()
{

View File

@@ -128,7 +128,24 @@ public:
virtual void addScaledElasticForceDifferential(btScalar scale, const TVStack& dx, TVStack& df)
{
//TODO
btScalar scaled_stiffness = scale * m_elasticStiffness;
for (int i = 0; i < 3; ++i)
{
btVector3 dir = (m_face.m_n[i]->m_q - m_mouse_pos);
btScalar dir_norm = dir.norm();
btVector3 dir_normalized = (dir_norm > SIMD_EPSILON) ? dir.normalized() : btVector3(0, 0, 0);
int id = m_face.m_n[i]->index;
btVector3 dx_diff = dx[id];
btScalar r = 0; // rest length is 0 for picking spring
btVector3 scaled_df = btVector3(0, 0, 0);
if (dir_norm > SIMD_EPSILON)
{
scaled_df -= scaled_stiffness * dir_normalized.dot(dx_diff) * dir_normalized;
scaled_df += scaled_stiffness * dir_normalized.dot(dx_diff) * ((dir_norm - r) / dir_norm) * dir_normalized;
scaled_df -= scaled_stiffness * ((dir_norm - r) / dir_norm) * dx_diff;
}
df[id] += scaled_df;
}
}
void setMousePos(const btVector3& p)

View File

@@ -1012,12 +1012,16 @@ static inline btMatrix3x3 ImpulseMatrix(btScalar dt,
//
static inline btMatrix3x3 ImpulseMatrix(btScalar dt,
const btMatrix3x3& effective_mass,
const btMatrix3x3& effective_mass_inv,
btScalar imb,
const btMatrix3x3& iwi,
const btVector3& r)
{
return (Diagonal(1 / dt) * Add(effective_mass, MassMatrix(imb, iwi, r)).inverse());
return (Diagonal(1 / dt) * Add(effective_mass_inv, MassMatrix(imb, iwi, r)).inverse());
// btMatrix3x3 iimb = MassMatrix(imb, iwi, r);
// if (iimb.determinant() == 0)
// return effective_mass_inv.inverse();
// return effective_mass_inv.inverse() * Add(effective_mass_inv.inverse(), iimb.inverse()).inverse() * iimb.inverse();
}
//