diff --git a/examples/ReducedDeformableDemo/ConservationTest.cpp b/examples/ReducedDeformableDemo/ConservationTest.cpp index 3f345ed2e..db18c1020 100644 --- a/examples/ReducedDeformableDemo/ConservationTest.cpp +++ b/examples/ReducedDeformableDemo/ConservationTest.cpp @@ -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); diff --git a/examples/ReducedDeformableDemo/FreeFall.cpp b/examples/ReducedDeformableDemo/FreeFall.cpp index 9bba8f9df..e24df185b 100644 --- a/examples/ReducedDeformableDemo/FreeFall.cpp +++ b/examples/ReducedDeformableDemo/FreeFall.cpp @@ -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); diff --git a/examples/ReducedDeformableDemo/ReducedCollide.cpp b/examples/ReducedDeformableDemo/ReducedCollide.cpp index fd45dd3ce..db86228f0 100644 --- a/examples/ReducedDeformableDemo/ReducedCollide.cpp +++ b/examples/ReducedDeformableDemo/ReducedCollide.cpp @@ -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); diff --git a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp index a0f878bf9..1d295b656 100644 --- a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp +++ b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp @@ -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 diff --git a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.h b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.h index 8c7c57632..8a2aef15a 100644 --- a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.h +++ b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.h @@ -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(). diff --git a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBodySolver.h b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBodySolver.h index 27e5e9193..808bdb9e9 100644 --- a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBodySolver.h +++ b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBodySolver.h @@ -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 { diff --git a/src/BulletSoftBody/btDeformableBodySolver.h b/src/BulletSoftBody/btDeformableBodySolver.h index cf1e1ac24..74fa2a32c 100644 --- a/src/BulletSoftBody/btDeformableBodySolver.h +++ b/src/BulletSoftBody/btDeformableBodySolver.h @@ -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& softBodies, btScalar dt); diff --git a/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp b/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp index ce4d9a9da..23967a67b 100644 --- a/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp +++ b/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.cpp @@ -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; diff --git a/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h b/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h index 8243e3d8a..b47d0e073 100644 --- a/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h +++ b/src/BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h @@ -122,6 +122,8 @@ public: return m_sbi; } + virtual void setGravity(const btVector3& gravity); + void reinitialize(btScalar timeStep); void applyRigidBodyGravity(btScalar timeStep); diff --git a/src/BulletSoftBody/btSoftBody.h b/src/BulletSoftBody/btSoftBody.h index ea8fcd76f..1016a9aa3 100644 --- a/src/BulletSoftBody/btSoftBody.h +++ b/src/BulletSoftBody/btSoftBody.h @@ -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 */