allow set gravity in deformable world. add transformTo for the reduced deformable object

This commit is contained in:
jingyuc
2021-11-01 15:49:00 -04:00
parent 2255e26e14
commit df661fde15
10 changed files with 32 additions and 11 deletions

View File

@@ -225,7 +225,7 @@ void ConservationTest::initPhysics()
init_transform.setIdentity();
init_transform.setOrigin(btVector3(0, 4, 0));
// init_transform.setRotation(btQuaternion(btVector3(0, 1, 0), SIMD_PI / 2.0));
rsb->transform(init_transform);
rsb->transformTo(init_transform);
rsb->setStiffnessScale(100);
rsb->setDamping(damping_alpha, damping_beta);

View File

@@ -134,14 +134,14 @@ void FreeFall::initPhysics()
m_broadphase = new btDbvtBroadphase();
btReducedSoftBodySolver* reducedSoftBodySolver = new btReducedSoftBodySolver();
btVector3 gravity = btVector3(0, -10, 0);
reducedSoftBodySolver->setGravity(gravity);
btDeformableMultiBodyConstraintSolver* sol = new btDeformableMultiBodyConstraintSolver();
sol->setDeformableSolver(reducedSoftBodySolver);
m_solver = sol;
m_dynamicsWorld = new btDeformableMultiBodyDynamicsWorld(m_dispatcher, m_broadphase, sol, m_collisionConfiguration, reducedSoftBodySolver);
btVector3 gravity = btVector3(0, -10, 0);
m_dynamicsWorld->setGravity(gravity);
m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld);
// m_dynamicsWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER;
@@ -157,7 +157,7 @@ void FreeFall::initPhysics()
init_transform.setIdentity();
init_transform.setOrigin(btVector3(0, 10, 0));
// init_transform.setRotation(btQuaternion(btVector3(1, 0, 0), SIMD_PI / 6.0));
rsb->transform(init_transform);
rsb->transformTo(init_transform);
rsb->setStiffnessScale(100);
rsb->setDamping(damping_alpha, damping_beta);

View File

@@ -216,7 +216,7 @@ void ReducedCollide::initPhysics()
init_transform.setIdentity();
init_transform.setOrigin(btVector3(0, 4, 0));
// init_transform.setRotation(btQuaternion(0, SIMD_PI / 2.0, SIMD_PI / 2.0));
rsb->transform(init_transform);
rsb->transformTo(init_transform);
rsb->setStiffnessScale(100);
rsb->setDamping(damping_alpha, damping_beta);

View File

@@ -397,6 +397,15 @@ void btReducedSoftBody::proceedToTransform(btScalar dt, bool end_of_time_step)
m_invInertiaTensorWorld = m_interpolateInvInertiaTensorWorld;
}
void btReducedSoftBody::transformTo(const btTransform& trs)
{
// get the current best rigid fit
btTransform current_transform = getRigidTransform();
// apply transform in material space
btTransform new_transform = trs * current_transform.inverse();
transform(new_transform);
}
void btReducedSoftBody::transform(const btTransform& trs)
{
// translate mesh

View File

@@ -127,15 +127,12 @@ class btReducedSoftBody : public btSoftBody
//
// various internal updates
//
virtual void transformTo(const btTransform& trs);
virtual void transform(const btTransform& trs);
// caution:
// need to use scale before using transform, because the scale is performed in the local frame
// (i.e., may have some rotation already, but the m_rigidTransformWorld doesn't have this info)
virtual void scale(const btVector3& scl);
virtual void transformTo(const btTransform& trs)
{
btAssert(false); // not supported yet
}
virtual void translate(const btVector3& trs)
{
btAssert(false); // use transform().

View File

@@ -28,7 +28,7 @@ class btReducedSoftBodySolver : public btDeformableBodySolver
btReducedSoftBodySolver();
~btReducedSoftBodySolver() {}
void setGravity(const btVector3& gravity);
virtual void setGravity(const btVector3& gravity);
virtual SolverTypes getSolverType() const
{

View File

@@ -69,6 +69,13 @@ public:
// solve the momentum equation
virtual void solveDeformableConstraints(btScalar solverdt);
// set gravity (get from deformable world)
virtual void setGravity(const btVector3& gravity)
{
// for full deformable object, we don't store gravity in the solver
// this function is overriden in the reduced deformable object
}
// resize/clear data structures
virtual void reinitialize(const btAlignedObjectArray<btSoftBody*>& softBodies, btScalar dt);

View File

@@ -442,6 +442,12 @@ void btDeformableMultiBodyDynamicsWorld::predictUnconstraintMotion(btScalar time
m_deformableBodySolver->predictMotion(timeStep);
}
void btDeformableMultiBodyDynamicsWorld::setGravity(const btVector3& gravity)
{
btDiscreteDynamicsWorld::setGravity(gravity);
m_deformableBodySolver->setGravity(gravity);
}
void btDeformableMultiBodyDynamicsWorld::reinitialize(btScalar timeStep)
{
m_internalTime += timeStep;

View File

@@ -122,6 +122,8 @@ public:
return m_sbi;
}
virtual void setGravity(const btVector3& gravity);
void reinitialize(btScalar timeStep);
void applyRigidBodyGravity(btScalar timeStep);

View File

@@ -1004,7 +1004,7 @@ public:
/* Get best fit rigid transform */
btTransform getRigidTransform();
/* Transform to given pose */
void transformTo(const btTransform& trs);
virtual void transformTo(const btTransform& trs);
/* Transform */
virtual void transform(const btTransform& trs);
/* Translate */