mirror of
https://github.com/bulletphysics/bullet3.git
synced 2026-10-06 08:55:36 +00:00
support implicit integration in picking force
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user