diff --git a/examples/ExampleBrowser/CMakeLists.txt b/examples/ExampleBrowser/CMakeLists.txt index 07ed40b43..bd4d88d50 100644 --- a/examples/ExampleBrowser/CMakeLists.txt +++ b/examples/ExampleBrowser/CMakeLists.txt @@ -388,8 +388,10 @@ SET(BulletExampleBrowser_SRCS ../MultiBody/MultiDofDemo.h ../RigidBody/RigidBodySoftContact.cpp ../RigidBody/KinematicRigidBodyExample.cpp - ../ReducedDeformableDemo/BasicTest.cpp - ../ReducedDeformableDemo/BasicTest.h + ../ReducedDeformableDemo/ConservationTest.cpp + ../ReducedDeformableDemo/ConservationTest.h + ../ReducedDeformableDemo/Springboard.cpp + ../ReducedDeformableDemo/Springboard.h ../ReducedDeformableDemo/ModeVisualizer.cpp ../ReducedDeformableDemo/ModeVisualizer.h ../ReducedDeformableDemo/FreeFall.cpp diff --git a/examples/ExampleBrowser/ExampleEntries.cpp b/examples/ExampleBrowser/ExampleEntries.cpp index 0f5304984..fab8c07b6 100644 --- a/examples/ExampleBrowser/ExampleEntries.cpp +++ b/examples/ExampleBrowser/ExampleEntries.cpp @@ -72,8 +72,9 @@ #include "../RoboticsLearning/R2D2GraspExample.h" #include "../RoboticsLearning/KukaGraspExample.h" #include "../RoboticsLearning/GripperGraspExample.h" +#include "../ReducedDeformableDemo/ConservationTest.h" #include "../ReducedDeformableDemo/ModeVisualizer.h" -#include "../ReducedDeformableDemo/BasicTest.h" +#include "../ReducedDeformableDemo/Springboard.h" #include "../ReducedDeformableDemo/FreeFall.h" #include "../ReducedDeformableDemo/FrictionSlope.h" #include "../ReducedDeformableDemo/ReducedCollide.h" @@ -224,7 +225,8 @@ static ExampleEntry gDefaultExamples[] = ExampleEntry(0, "Reduced Deformabe Body"), ExampleEntry(1, "Mode Visualizer", "Visualizer the modes for reduced deformable objects", ReducedModeVisualizerCreateFunc), - ExampleEntry(1, "BasicRD", "Simple dynamics test for the reduced deformable objects", ReducedBasicTestCreateFunc), + ExampleEntry(1, "Reduced Conservation Test", "Momentum conservation test for the reduced deformable objects", ReducedConservationTestCreateFunc), + ExampleEntry(1, "Reduced Springboard", "Moving rigid object colliding with a fixed reduced deformable objects", ReducedSpringboardCreateFunc), ExampleEntry(1, "Reduced Free Fall", "Free fall ground contact test for the reduced deformable model", ReducedFreeFallCreateFunc), ExampleEntry(1, "Reduced Collision Test", "Collision between a reduced block and the a rigid block", ReducedCollideCreateFunc), ExampleEntry(1, "Reduced Grasp", "Grasp a reduced deformable block", ReducedGraspCreateFunc), diff --git a/examples/ReducedDeformableDemo/BasicTest.cpp b/examples/ReducedDeformableDemo/ConservationTest.cpp similarity index 64% rename from examples/ReducedDeformableDemo/BasicTest.cpp rename to examples/ReducedDeformableDemo/ConservationTest.cpp index bc369e9e3..81db05c24 100644 --- a/examples/ReducedDeformableDemo/BasicTest.cpp +++ b/examples/ReducedDeformableDemo/ConservationTest.cpp @@ -11,7 +11,7 @@ 3. This notice may not be removed or altered from any source distribution. */ -#include "BasicTest.h" +#include "ConservationTest.h" ///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. #include "btBulletDynamicsCommon.h" #include "BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h" @@ -26,15 +26,12 @@ #include "../CommonInterfaces/CommonDeformableBodyBase.h" #include "../Utils/b3ResourcePath.h" -///The BasicTest shows the contact between volumetric deformable objects and rigid objects. -// static btScalar E = 50; -// static btScalar nu = 0.3; static btScalar damping_alpha = 0.0; -static btScalar damping_beta = 0.01; +static btScalar damping_beta = 0.0; static int start_mode = 6; static int num_modes = 20; -class BasicTest : public CommonDeformableBodyBase +class ConservationTest : public CommonDeformableBodyBase { btScalar sim_time; bool first_step; @@ -55,13 +52,13 @@ class BasicTest : public CommonDeformableBodyBase } public: - BasicTest(struct GUIHelperInterface* helper) + ConservationTest(struct GUIHelperInterface* helper) : CommonDeformableBodyBase(helper) { sim_time = 0; first_step = true; } - virtual ~BasicTest() + virtual ~ConservationTest() { } void initPhysics(); @@ -81,17 +78,6 @@ public: float targetPos[3] = {0, 3, 0}; m_guiHelper->resetCamera(dist, yaw, pitch, targetPos[0], targetPos[1], targetPos[2]); } - - void Ctor_RbUpStack() - { - float mass = 2; - btCollisionShape* shape = new btBoxShape(btVector3(1, 1, 1)); - btTransform startTransform; - startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,8,1)); - btRigidBody* rb1 = createRigidBody(mass, startTransform, shape); - rb1->setActivationState(DISABLE_DEACTIVATION); - } void checkMomentum(btReducedSoftBody* rsb) { @@ -132,59 +118,51 @@ public: void stepSimulation(float deltaTime) { - // TODO: remove this. very hacky way of adding initial deformation - // btReducedSoftBody* rsb = static_cast(static_cast(m_dynamicsWorld)->getSoftBodyArray()[0]); - // if (first_step /* && !rsb->m_bUpdateRtCst*/) - // { - // getDeformedShape(rsb, 0, 1); - // first_step = false; - // // rsb->mapToReducedDofs(); - // } + // add initial deformation + btReducedSoftBody* rsb = static_cast(static_cast(m_dynamicsWorld)->getSoftBodyArray()[0]); + if (first_step /* && !rsb->m_bUpdateRtCst*/) + { + getDeformedShape(rsb, 0, 1); + first_step = false; + } float internalTimeStep = 1. / 60.f; m_dynamicsWorld->stepSimulation(deltaTime, 1, internalTimeStep); - // sim_time += internalTimeStep; - // checkMomentum(rsb); + sim_time += internalTimeStep; + checkMomentum(rsb); } virtual void renderScene() { CommonDeformableBodyBase::renderScene(); btDeformableMultiBodyDynamicsWorld* deformableWorld = getDeformableDynamicsWorld(); - // int flag = 0; for (int i = 0; i < deformableWorld->getSoftBodyArray().size(); i++) { btReducedSoftBody* rsb = static_cast(deformableWorld->getSoftBodyArray()[i]); { btSoftBodyHelpers::DrawFrame(rsb, deformableWorld->getDebugDrawer()); - // btSoftBodyHelpers::Draw(rsb, deformableWorld->getDebugDrawer(), flag); btSoftBodyHelpers::Draw(rsb, deformableWorld->getDebugDrawer(), deformableWorld->getDrawFlags()); - // btVector3 origin = rsb->getRigidTransform().getOrigin(); - // btVector3 line_x = rsb->getRigidTransform().getBasis() * 2 * btVector3(1, 0, 0) + origin; - // btVector3 line_y = rsb->getRigidTransform().getBasis() * 2 * btVector3(0, 1, 0) + origin; - // btVector3 line_z = rsb->getRigidTransform().getBasis() * 2 * btVector3(0, 0, 1) + origin; + btVector3 origin = rsb->getRigidTransform().getOrigin(); + btVector3 line_x = rsb->getRigidTransform().getBasis() * 2 * btVector3(1, 0, 0) + origin; + btVector3 line_y = rsb->getRigidTransform().getBasis() * 2 * btVector3(0, 1, 0) + origin; + btVector3 line_z = rsb->getRigidTransform().getBasis() * 2 * btVector3(0, 0, 1) + origin; - // deformableWorld->getDebugDrawer()->drawLine(origin, line_x, btVector3(1, 0, 0)); - // deformableWorld->getDebugDrawer()->drawLine(origin, line_y, btVector3(0, 1, 0)); - // deformableWorld->getDebugDrawer()->drawLine(origin, line_z, btVector3(0, 0, 1)); + deformableWorld->getDebugDrawer()->drawLine(origin, line_x, btVector3(1, 0, 0)); + deformableWorld->getDebugDrawer()->drawLine(origin, line_y, btVector3(0, 1, 0)); + deformableWorld->getDebugDrawer()->drawLine(origin, line_z, btVector3(0, 0, 1)); - for (int p = 0; p < rsb->m_fixedNodes.size(); ++p) - { - deformableWorld->getDebugDrawer()->drawSphere(rsb->m_nodes[rsb->m_fixedNodes[p]].m_x, 0.2, btVector3(1, 0, 0)); - // std::cout << rsb->m_nodes[rsb->m_fixedNodes[p]].m_x[0] << "\t" << rsb->m_nodes[rsb->m_fixedNodes[p]].m_x[1] << "\t" << rsb->m_nodes[rsb->m_fixedNodes[p]].m_x[2] << "\n"; - } - // deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 0, 0), 0.1, btVector3(1, 1, 1)); - // deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 2, 0), 0.1, btVector3(1, 1, 1)); - // deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 4, 0), 0.1, btVector3(1, 1, 1)); + deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 0, 0), 0.1, btVector3(1, 1, 1)); + deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 2, 0), 0.1, btVector3(1, 1, 1)); + deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 4, 0), 0.1, btVector3(1, 1, 1)); } } } }; -void BasicTest::initPhysics() +void ConservationTest::initPhysics() { m_guiHelper->setUpAxis(1); @@ -196,7 +174,7 @@ void BasicTest::initPhysics() m_broadphase = new btDbvtBroadphase(); btReducedSoftBodySolver* reducedSoftBodySolver = new btReducedSoftBodySolver(); - btVector3 gravity = btVector3(0, -10, 0); + btVector3 gravity = btVector3(0, 0, 0); reducedSoftBodySolver->setGravity(gravity); btDeformableMultiBodyConstraintSolver* sol = new btDeformableMultiBodyConstraintSolver(); @@ -220,15 +198,9 @@ void BasicTest::initPhysics() // init_transform.setRotation(btQuaternion(btVector3(0, 1, 0), SIMD_PI / 2.0)); rsb->transform(init_transform); - rsb->setStiffnessScale(200); + rsb->setStiffnessScale(100); rsb->setDamping(damping_alpha, damping_beta); - // set fixed nodes - rsb->setFixedNodes(0); - rsb->setFixedNodes(1); - rsb->setFixedNodes(2); - rsb->setFixedNodes(3); - rsb->m_cfg.kKHR = 1; // collision hardness with kinematic objects rsb->m_cfg.kCHR = 1; // collision hardness with rigid body rsb->m_cfg.kDF = 0; @@ -239,7 +211,7 @@ void BasicTest::initPhysics() // rsb->setVelocity(btVector3(0, -COLLIDING_VELOCITY, 0)); // rsb->setRigidVelocity(btVector3(0, 1, 0)); - // rsb->setRigidAngularVelocity(btVector3(1, 0, 0)); + rsb->setRigidAngularVelocity(btVector3(1, 0, 0)); } getDeformableDynamicsWorld()->setImplicit(false); getDeformableDynamicsWorld()->setLineSearch(false); @@ -249,57 +221,11 @@ void BasicTest::initPhysics() getDeformableDynamicsWorld()->getSolverInfo().m_leastSquaresResidualThreshold = 1e-3; getDeformableDynamicsWorld()->getSolverInfo().m_splitImpulse = false; getDeformableDynamicsWorld()->getSolverInfo().m_numIterations = 100; - // add a few rigid bodies - Ctor_RbUpStack(); - - // create a static rigid box as the ground - { - // btBoxShape* groundShape = createBoxShape(btVector3(btScalar(50), btScalar(50), btScalar(50))); - btBoxShape* groundShape = createBoxShape(btVector3(btScalar(10), btScalar(2), btScalar(10))); - m_collisionShapes.push_back(groundShape); - - btTransform groundTransform; - groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0, 0, 0)); - { - btScalar mass(0.); - createRigidBody(mass, groundTransform, groundShape, btVector4(0,0,0,0)); - } - } m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); - - // { - // SliderParams slider("Young's Modulus", &E); - // slider.m_minVal = 0; - // slider.m_maxVal = 2000; - // if (m_guiHelper->getParameterInterface()) - // m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); - // } - // { - // SliderParams slider("Poisson Ratio", &nu); - // slider.m_minVal = 0.05; - // slider.m_maxVal = 0.49; - // if (m_guiHelper->getParameterInterface()) - // m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); - // } - // { - // SliderParams slider("Mass Damping", &damping_alpha); - // slider.m_minVal = 0; - // slider.m_maxVal = 1; - // if (m_guiHelper->getParameterInterface()) - // m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); - // } - // { - // SliderParams slider("Stiffness Damping", &damping_beta); - // slider.m_minVal = 0; - // slider.m_maxVal = 0.1; - // if (m_guiHelper->getParameterInterface()) - // m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); - // } } -void BasicTest::exitPhysics() +void ConservationTest::exitPhysics() { //cleanup in the reverse order of creation/initialization removePickingConstraint(); @@ -345,9 +271,9 @@ void BasicTest::exitPhysics() -class CommonExampleInterface* ReducedBasicTestCreateFunc(struct CommonExampleOptions& options) +class CommonExampleInterface* ReducedConservationTestCreateFunc(struct CommonExampleOptions& options) { - return new BasicTest(options.m_guiHelper); + return new ConservationTest(options.m_guiHelper); } diff --git a/examples/ReducedDeformableDemo/ConservationTest.h b/examples/ReducedDeformableDemo/ConservationTest.h new file mode 100644 index 000000000..3528f1e15 --- /dev/null +++ b/examples/ReducedDeformableDemo/ConservationTest.h @@ -0,0 +1,19 @@ +/* + Bullet Continuous Collision Detection and Physics Library + Copyright (c) 2019 Google Inc. http://bulletphysics.org + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it freely, + subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef _REDUCED_CONSERVATION_TEST_H +#define _REDUCED_CONSERVATION_TEST_H + +class CommonExampleInterface* ReducedConservationTestCreateFunc(struct CommonExampleOptions& options); + +#endif //_REDUCED_CONSERVATION_TEST_H diff --git a/examples/ReducedDeformableDemo/Springboard.cpp b/examples/ReducedDeformableDemo/Springboard.cpp new file mode 100644 index 000000000..1d4d3ca70 --- /dev/null +++ b/examples/ReducedDeformableDemo/Springboard.cpp @@ -0,0 +1,246 @@ +/* + Bullet Continuous Collision Detection and Physics Library + Copyright (c) 2019 Google Inc. http://bulletphysics.org + This software is provided 'as-is', without any express or implied warranty. + In no event will the authors be held liable for any damages arising from the use of this software. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it freely, + subject to the following restrictions: + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + */ + +#include "Springboard.h" +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include "BulletSoftBody/btDeformableMultiBodyDynamicsWorld.h" +#include "BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.h" +#include "BulletSoftBody/BulletReducedSoftBody/btReducedSoftBodyHelpers.h" +#include "BulletSoftBody/BulletReducedSoftBody/btReducedSoftBodySolver.h" +#include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h" +#include "BulletDynamics/Featherstone/btMultiBodyConstraintSolver.h" +#include "../CommonInterfaces/CommonParameterInterface.h" +#include //printf debugging + +#include "../CommonInterfaces/CommonDeformableBodyBase.h" +#include "../Utils/b3ResourcePath.h" + +static btScalar damping_alpha = 0.0; +static btScalar damping_beta = 0.0; +static int start_mode = 6; +static int num_modes = 20; + +class Springboard : public CommonDeformableBodyBase +{ + btScalar sim_time; + bool first_step; + +public: + Springboard(struct GUIHelperInterface* helper) + : CommonDeformableBodyBase(helper) + { + sim_time = 0; + first_step = true; + } + virtual ~Springboard() + { + } + void initPhysics(); + + void exitPhysics(); + + // TODO: disable pick force, non-interactive for now. + bool pickBody(const btVector3& rayFromWorld, const btVector3& rayToWorld) { + return false; + } + + void resetCamera() + { + float dist = 10; + float pitch = 0; + float yaw = 90; + float targetPos[3] = {0, 3, 0}; + m_guiHelper->resetCamera(dist, yaw, pitch, targetPos[0], targetPos[1], targetPos[2]); + } + + void Ctor_RbUpStack() + { + float mass = 2; + btCollisionShape* shape = new btBoxShape(btVector3(1, 1, 1)); + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,8,1)); + btRigidBody* rb1 = createRigidBody(mass, startTransform, shape); + rb1->setActivationState(DISABLE_DEACTIVATION); + } + + void stepSimulation(float deltaTime) + { + float internalTimeStep = 1. / 60.f; + m_dynamicsWorld->stepSimulation(deltaTime, 1, internalTimeStep); + } + + virtual void renderScene() + { + CommonDeformableBodyBase::renderScene(); + btDeformableMultiBodyDynamicsWorld* deformableWorld = getDeformableDynamicsWorld(); + + for (int i = 0; i < deformableWorld->getSoftBodyArray().size(); i++) + { + btReducedSoftBody* rsb = static_cast(deformableWorld->getSoftBodyArray()[i]); + { + btSoftBodyHelpers::DrawFrame(rsb, deformableWorld->getDebugDrawer()); + btSoftBodyHelpers::Draw(rsb, deformableWorld->getDebugDrawer(), deformableWorld->getDrawFlags()); + + for (int p = 0; p < rsb->m_fixedNodes.size(); ++p) + { + deformableWorld->getDebugDrawer()->drawSphere(rsb->m_nodes[rsb->m_fixedNodes[p]].m_x, 0.2, btVector3(1, 0, 0)); + // std::cout << rsb->m_nodes[rsb->m_fixedNodes[p]].m_x[0] << "\t" << rsb->m_nodes[rsb->m_fixedNodes[p]].m_x[1] << "\t" << rsb->m_nodes[rsb->m_fixedNodes[p]].m_x[2] << "\n"; + } + // deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 0, 0), 0.1, btVector3(1, 1, 1)); + // deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 2, 0), 0.1, btVector3(1, 1, 1)); + // deformableWorld->getDebugDrawer()->drawSphere(btVector3(0, 4, 0), 0.1, btVector3(1, 1, 1)); + } + } + } +}; + +void Springboard::initPhysics() +{ + m_guiHelper->setUpAxis(1); + + ///collision configuration contains default setup for memory, collision setup + m_collisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + 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); + m_dynamicsWorld->setGravity(gravity); + m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld); + + // create volumetric reduced deformable body + { + btReducedSoftBody* rsb = btReducedSoftBodyHelpers::createReducedBeam(getDeformableDynamicsWorld()->getWorldInfo(), start_mode, num_modes); + + getDeformableDynamicsWorld()->addSoftBody(rsb); + rsb->getCollisionShape()->setMargin(0.1); + + btTransform init_transform; + 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->setStiffnessScale(200); + rsb->setDamping(damping_alpha, damping_beta); + + // set fixed nodes + rsb->setFixedNodes(0); + rsb->setFixedNodes(1); + rsb->setFixedNodes(2); + rsb->setFixedNodes(3); + + rsb->m_cfg.kKHR = 1; // collision hardness with kinematic objects + rsb->m_cfg.kCHR = 1; // collision hardness with rigid body + rsb->m_cfg.kDF = 0; + rsb->m_cfg.collisions = btSoftBody::fCollision::SDF_RD; + rsb->m_cfg.collisions |= btSoftBody::fCollision::SDF_RDN; + rsb->m_sleepingThreshold = 0; + btSoftBodyHelpers::generateBoundaryFaces(rsb); + + // rsb->setVelocity(btVector3(0, -COLLIDING_VELOCITY, 0)); + // rsb->setRigidVelocity(btVector3(0, 1, 0)); + // rsb->setRigidAngularVelocity(btVector3(1, 0, 0)); + } + getDeformableDynamicsWorld()->setImplicit(false); + getDeformableDynamicsWorld()->setLineSearch(false); + getDeformableDynamicsWorld()->setUseProjection(false); + getDeformableDynamicsWorld()->getSolverInfo().m_deformable_erp = 0.3; + getDeformableDynamicsWorld()->getSolverInfo().m_deformable_maxErrorReduction = btScalar(200); + getDeformableDynamicsWorld()->getSolverInfo().m_leastSquaresResidualThreshold = 1e-3; + getDeformableDynamicsWorld()->getSolverInfo().m_splitImpulse = false; + getDeformableDynamicsWorld()->getSolverInfo().m_numIterations = 100; + // add a few rigid bodies + // Ctor_RbUpStack(); + + // create a static rigid box as the ground + // { + // // btBoxShape* groundShape = createBoxShape(btVector3(btScalar(50), btScalar(50), btScalar(50))); + // btBoxShape* groundShape = createBoxShape(btVector3(btScalar(10), btScalar(2), btScalar(10))); + // m_collisionShapes.push_back(groundShape); + + // btTransform groundTransform; + // groundTransform.setIdentity(); + // groundTransform.setOrigin(btVector3(0, 0, 0)); + // { + // btScalar mass(0.); + // createRigidBody(mass, groundTransform, groundShape, btVector4(0,0,0,0)); + // } + // } + + m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); +} + +void Springboard::exitPhysics() +{ + //cleanup in the reverse order of creation/initialization + removePickingConstraint(); + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i = m_dynamicsWorld->getNumCollisionObjects() - 1; i >= 0; i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject(obj); + delete obj; + } + // delete forces + for (int j = 0; j < m_forces.size(); j++) + { + btDeformableLagrangianForce* force = m_forces[j]; + delete force; + } + m_forces.clear(); + + //delete collision shapes + for (int j = 0; j < m_collisionShapes.size(); j++) + { + btCollisionShape* shape = m_collisionShapes[j]; + delete shape; + } + m_collisionShapes.clear(); + + delete m_dynamicsWorld; + + delete m_solver; + + delete m_broadphase; + + delete m_dispatcher; + + delete m_collisionConfiguration; +} + + + +class CommonExampleInterface* ReducedSpringboardCreateFunc(struct CommonExampleOptions& options) +{ + return new Springboard(options.m_guiHelper); +} + + diff --git a/examples/ReducedDeformableDemo/BasicTest.h b/examples/ReducedDeformableDemo/Springboard.h similarity index 82% rename from examples/ReducedDeformableDemo/BasicTest.h rename to examples/ReducedDeformableDemo/Springboard.h index aa15e5843..2636d5623 100644 --- a/examples/ReducedDeformableDemo/BasicTest.h +++ b/examples/ReducedDeformableDemo/Springboard.h @@ -11,9 +11,9 @@ 3. This notice may not be removed or altered from any source distribution. */ -#ifndef _REDUCED_BASIC_TEST_H -#define _REDUCED_BASIC_TEST_H +#ifndef _REDUCED_SPRINGBOARD_H +#define _REDUCED_SPRINGBOARD_H -class CommonExampleInterface* ReducedBasicTestCreateFunc(struct CommonExampleOptions& options); +class CommonExampleInterface* ReducedSpringboardCreateFunc(struct CommonExampleOptions& options); -#endif //_REDUCED_BASIC_TEST_H +#endif //_REDUCED_SPRINGBOARD_H diff --git a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp index 4f0c9c9fe..ffebb5daa 100644 --- a/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp +++ b/src/BulletSoftBody/BulletReducedSoftBody/btReducedSoftBody.cpp @@ -411,6 +411,8 @@ void btReducedSoftBody::updateRestNodalPositions() } } +// reference notes: +// https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-07-dynamics-fall-2009/lecture-notes/MIT16_07F09_Lec26.pdf void btReducedSoftBody::updateLocalInertiaTensorFromNodes() { btMatrix3x3 inertia_tensor; @@ -418,14 +420,24 @@ void btReducedSoftBody::updateLocalInertiaTensorFromNodes() for (int p = 0; p < m_nFull; ++p) { + btMatrix3x3 particle_inertia; + particle_inertia.setZero(); + btVector3 r = m_nodes[p].m_x - m_initialOrigin; - for (int i = 0; i < 3; ++i) - { - for (int j = 0; j < 3; ++j) - { - inertia_tensor[i][j] += m_nodalMass[p] * r[i] * r[j]; - } - } + + particle_inertia[0][0] = m_nodalMass[p] * (r[1] * r[1] + r[2] * r[2]); + particle_inertia[1][1] = m_nodalMass[p] * (r[0] * r[0] + r[2] * r[2]); + particle_inertia[2][2] = m_nodalMass[p] * (r[0] * r[0] + r[1] * r[1]); + + particle_inertia[0][1] = - m_nodalMass[p] * (r[0] * r[1]); + particle_inertia[0][2] = - m_nodalMass[p] * (r[0] * r[2]); + particle_inertia[1][2] = - m_nodalMass[p] * (r[1] * r[2]); + + particle_inertia[1][0] = particle_inertia[0][1]; + particle_inertia[2][0] = particle_inertia[0][2]; + particle_inertia[2][1] = particle_inertia[1][2]; + + inertia_tensor += particle_inertia; } m_invInertiaLocal = inertia_tensor.inverse(); }