add options to toggle between whether line search is used & add more documentation

This commit is contained in:
Xuchen Han
2019-09-19 16:56:55 -07:00
parent 0501fe1bbd
commit ef5aa6e73b
12 changed files with 47 additions and 95 deletions

View File

@@ -25,9 +25,7 @@
#include "../CommonInterfaces/CommonRigidBodyBase.h" #include "../CommonInterfaces/CommonRigidBodyBase.h"
#include "../Utils/b3ResourcePath.h" #include "../Utils/b3ResourcePath.h"
///The ClothFriction shows the use of rolling friction. ///The ClothFriction shows the use of deformable friction.
///Spheres will come to a rest on a sloped plane using a constraint. Damping cannot achieve the same.
///Generally it is best to leave the rolling friction coefficient zero (or close to zero).
class ClothFriction : public CommonRigidBodyBase class ClothFriction : public CommonRigidBodyBase
{ {
btAlignedObjectArray<btDeformableLagrangianForce*> m_forces; btAlignedObjectArray<btDeformableLagrangianForce*> m_forces;
@@ -197,6 +195,7 @@ void ClothFriction::initPhysics()
getDeformableDynamicsWorld()->addForce(psb2, gravity_force2); getDeformableDynamicsWorld()->addForce(psb2, gravity_force2);
m_forces.push_back(gravity_force2); m_forces.push_back(gravity_force2);
} }
getDeformableDynamicsWorld()->setImplicit(false);
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
} }

View File

@@ -25,9 +25,7 @@
#include "../CommonInterfaces/CommonRigidBodyBase.h" #include "../CommonInterfaces/CommonRigidBodyBase.h"
#include "../Utils/b3ResourcePath.h" #include "../Utils/b3ResourcePath.h"
///The DeformableContact shows the use of rolling friction. ///The DeformableContact shows the contact between deformable objects
///Spheres will come to a rest on a sloped plane using a constraint. Damping cannot achieve the same.
///Generally it is best to leave the rolling friction coefficient zero (or close to zero).
class DeformableContact : public CommonRigidBodyBase class DeformableContact : public CommonRigidBodyBase
{ {
btAlignedObjectArray<btDeformableLagrangianForce*> m_forces; btAlignedObjectArray<btDeformableLagrangianForce*> m_forces;

View File

@@ -11,20 +11,6 @@
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
///create 125 (5x5x5) dynamic object
#define ARRAY_SIZE_X 5
#define ARRAY_SIZE_Y 5
#define ARRAY_SIZE_Z 5
//maximum number of objects (and allow user to shoot additional boxes)
#define MAX_PROXIES (ARRAY_SIZE_X * ARRAY_SIZE_Y * ARRAY_SIZE_Z + 1024)
///scaling of the objects (0.1 = 20 centimeter boxes )
#define SCALING 1.
#define START_POS_X -5
#define START_POS_Y -5
#define START_POS_Z -3
#include "DeformableMultibody.h" #include "DeformableMultibody.h"
///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. ///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files.
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"

View File

@@ -10,21 +10,6 @@
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 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. 3. This notice may not be removed or altered from any source distribution.
*/ */
///create 125 (5x5x5) dynamic object
#define ARRAY_SIZE_X 5
#define ARRAY_SIZE_Y 5
#define ARRAY_SIZE_Z 5
//maximum number of objects (and allow user to shoot additional boxes)
#define MAX_PROXIES (ARRAY_SIZE_X * ARRAY_SIZE_Y * ARRAY_SIZE_Z + 1024)
///scaling of the objects (0.1 = 20 centimeter boxes )
#define SCALING 1.
#define START_POS_X -5
#define START_POS_Y -5
#define START_POS_Z -3
#include "DeformableRigid.h" #include "DeformableRigid.h"
///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. ///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files.
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
@@ -39,9 +24,7 @@
#include "../CommonInterfaces/CommonRigidBodyBase.h" #include "../CommonInterfaces/CommonRigidBodyBase.h"
#include "../Utils/b3ResourcePath.h" #include "../Utils/b3ResourcePath.h"
///The DeformableRigid shows the use of rolling friction. ///The DeformableRigid shows contact between deformable objects and rigid objects.
///Spheres will come to a rest on a sloped plane using a constraint. Damping cannot achieve the same.
///Generally it is best to leave the rolling friction coefficient zero (or close to zero).
class DeformableRigid : public CommonRigidBodyBase class DeformableRigid : public CommonRigidBodyBase
{ {
btAlignedObjectArray<btDeformableLagrangianForce*> m_forces; btAlignedObjectArray<btDeformableLagrangianForce*> m_forces;

View File

@@ -34,9 +34,7 @@
#include "../CommonInterfaces/CommonFileIOInterface.h" #include "../CommonInterfaces/CommonFileIOInterface.h"
#include "Bullet3Common/b3FileUtils.h" #include "Bullet3Common/b3FileUtils.h"
///The GraspDeformable shows the use of rolling friction. ///The GraspDeformable shows grasping a volumetric deformable objects with multibody gripper with moter constraints.
///Spheres will come to a rest on a sloped plane using a constraint. Damping cannot achieve the same.
///Generally it is best to leave the rolling friction coefficient zero (or close to zero).
static btScalar sGripperVerticalVelocity = 0.f; static btScalar sGripperVerticalVelocity = 0.f;
static btScalar sGripperClosingTargetVelocity = 0.f; static btScalar sGripperClosingTargetVelocity = 0.f;
static float friction = 1.; static float friction = 1.;

View File

@@ -11,20 +11,6 @@
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
///create 125 (5x5x5) dynamic object
#define ARRAY_SIZE_X 5
#define ARRAY_SIZE_Y 5
#define ARRAY_SIZE_Z 5
//maximum number of objects (and allow user to shoot additional boxes)
#define MAX_PROXIES (ARRAY_SIZE_X * ARRAY_SIZE_Y * ARRAY_SIZE_Z + 1024)
///scaling of the objects (0.1 = 20 centimeter boxes )
#define SCALING 1.
#define START_POS_X -5
#define START_POS_Y -5
#define START_POS_Z -3
#include "Pinch.h" #include "Pinch.h"
///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. ///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files.
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
@@ -39,21 +25,13 @@
#include "../CommonInterfaces/CommonRigidBodyBase.h" #include "../CommonInterfaces/CommonRigidBodyBase.h"
#include "../Utils/b3ResourcePath.h" #include "../Utils/b3ResourcePath.h"
///The Pinch shows the use of rolling friction. ///The Pinch shows the frictional contact between kinematic rigid objects with deformable objects
///Spheres will come to a rest on a sloped plane using a constraint. Damping cannot achieve the same.
///Generally it is best to leave the rolling friction coefficient zero (or close to zero).
struct TetraCube struct TetraCube
{ {
#include "../SoftDemo/cube.inl" #include "../SoftDemo/cube.inl"
}; };
struct TetraBunny
{
#include "../SoftDemo/bunny.inl"
};
class Pinch : public CommonRigidBodyBase class Pinch : public CommonRigidBodyBase
{ {
btAlignedObjectArray<btDeformableLagrangianForce*> m_forces; btAlignedObjectArray<btDeformableLagrangianForce*> m_forces;

View File

@@ -24,9 +24,7 @@
#include "../CommonInterfaces/CommonRigidBodyBase.h" #include "../CommonInterfaces/CommonRigidBodyBase.h"
#include "../Utils/b3ResourcePath.h" #include "../Utils/b3ResourcePath.h"
///The PinchFriction shows the use of rolling friction. ///The PinchFriction shows the frictional contacts among volumetric deformable objects
///Spheres will come to a rest on a sloped plane using a constraint. Damping cannot achieve the same.
///Generally it is best to leave the rolling friction coefficient zero (or close to zero).
struct TetraCube struct TetraCube
{ {

View File

@@ -11,20 +11,6 @@
3. This notice may not be removed or altered from any source distribution. 3. This notice may not be removed or altered from any source distribution.
*/ */
///create 125 (5x5x5) dynamic object
#define ARRAY_SIZE_X 5
#define ARRAY_SIZE_Y 5
#define ARRAY_SIZE_Z 5
//maximum number of objects (and allow user to shoot additional boxes)
#define MAX_PROXIES (ARRAY_SIZE_X * ARRAY_SIZE_Y * ARRAY_SIZE_Z + 1024)
///scaling of the objects (0.1 = 20 centimeter boxes )
#define SCALING 1.
#define START_POS_X -5
#define START_POS_Y -5
#define START_POS_Z -3
#include "VolumetricDeformable.h" #include "VolumetricDeformable.h"
///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. ///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files.
#include "btBulletDynamicsCommon.h" #include "btBulletDynamicsCommon.h"
@@ -39,10 +25,7 @@
#include "../CommonInterfaces/CommonRigidBodyBase.h" #include "../CommonInterfaces/CommonRigidBodyBase.h"
#include "../Utils/b3ResourcePath.h" #include "../Utils/b3ResourcePath.h"
///The VolumetricDeformable shows the use of rolling friction. ///The VolumetricDeformable shows the contact between volumetric deformable objects and rigid objects.
///Spheres will come to a rest on a sloped plane using a constraint. Damping cannot achieve the same.
///Generally it is best to leave the rolling friction coefficient zero (or close to zero).
struct TetraCube struct TetraCube
{ {

View File

@@ -429,3 +429,8 @@ void btDeformableBodySolver::setImplicit(bool implicit)
m_implicit = implicit; m_implicit = implicit;
m_objective->setImplicit(implicit); m_objective->setImplicit(implicit);
} }
void btDeformableBodySolver::setLineSearch(bool lineSearch)
{
m_lineSearch = lineSearch;
}

View File

@@ -103,16 +103,38 @@ public:
virtual bool checkInitialized(){return true;} virtual bool checkInitialized(){return true;}
// If true, implicit time stepping scheme is used.
// Otherwise, explicit time stepping scheme is used
void setImplicit(bool implicit); void setImplicit(bool implicit);
// If true, newton's method with line search is used when implicit time stepping scheme is turned on
void setLineSearch(bool lineSearch);
// set temporary position x^* = x_n + dt * v
// update the deformation gradient at position x^*
void updateState(); void updateState();
// set dv = dv + scale * ddv
void updateDv(btScalar scale = 1); void updateDv(btScalar scale = 1);
// set temporary position x^* = x_n + dt * v^*
void updateTempPosition(); void updateTempPosition();
// save the current dv to m_backup_dv;
void backupDv(); void backupDv();
// set dv to the backed-up value
void revertDv(); void revertDv();
// set dv = dv + scale * ddv
// set v^* = v_n + dv
// set temporary position x^* = x_n + dt * v^*
// update the deformation gradient at position x^*
void updateEnergy(btScalar scale); void updateEnergy(btScalar scale);
// calculates the appropriately scaled kinetic energy in the system, which is
// 1/2 * dv^T * M * dv
// used in line search
btScalar kineticEnergy(); btScalar kineticEnergy();
}; };

View File

@@ -69,14 +69,14 @@ void btDeformableMultiBodyDynamicsWorld::internalSingleStepSimulation(btScalar t
// End solver-wise simulation step // End solver-wise simulation step
// /////////////////////////////// // ///////////////////////////////
} }
//
//void btDeformableMultiBodyDynamicsWorld::positionCorrection(btScalar timeStep) //void btDeformableMultiBodyDynamicsWorld::positionCorrection(btScalar timeStep)
//{ //{
// // perform position correction for all constraints // // perform position correction for all constraints
// BT_PROFILE("positionCorrection"); // BT_PROFILE("positionCorrection");
// for (int index = 0; index < m_deformableBodySolver->m_objective->projection.m_constraints.size(); ++index) // for (int index = 0; index < m_deformableBodySolver->m_objective->m_projection.m_constraints.size(); ++index)
// { // {
// DeformableContactConstraint& constraint = *m_deformableBodySolver->m_objective->projection.m_constraints.getAtIndex(index); // DeformableContactConstraint& constraint = *m_deformableBodySolver->m_objective->m_projection.m_constraints.getAtIndex(index);
// for (int j = 0; j < constraint.m_contact.size(); ++j) // for (int j = 0; j < constraint.m_contact.size(); ++j)
// { // {
// const btSoftBody::RContact* c = constraint.m_contact[j]; // const btSoftBody::RContact* c = constraint.m_contact[j];
@@ -144,16 +144,11 @@ void btDeformableMultiBodyDynamicsWorld::internalSingleStepSimulation(btScalar t
// } // }
//} //}
void btDeformableMultiBodyDynamicsWorld::positionCorrection(btScalar timeStep)
{
}
void btDeformableMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep) void btDeformableMultiBodyDynamicsWorld::integrateTransforms(btScalar timeStep)
{ {
BT_PROFILE("integrateTransforms"); BT_PROFILE("integrateTransforms");
//m_deformableBodySolver->backupVelocity(); //m_deformableBodySolver->backupVelocity();
//positionCorrection(timeStep); //positionCorrection(timeStep); // looks like position correction is no longer necessary
btMultiBodyDynamicsWorld::integrateTransforms(timeStep); btMultiBodyDynamicsWorld::integrateTransforms(timeStep);
for (int i = 0; i < m_softBodies.size(); ++i) for (int i = 0; i < m_softBodies.size(); ++i)
{ {
@@ -329,6 +324,7 @@ void btDeformableMultiBodyDynamicsWorld::reinitialize(btScalar timeStep)
{ {
m_internalTime += timeStep; m_internalTime += timeStep;
m_deformableBodySolver->setImplicit(m_implicit); m_deformableBodySolver->setImplicit(m_implicit);
m_deformableBodySolver->setLineSearch(m_lineSearch);
m_deformableBodySolver->reinitialize(m_softBodies, timeStep); m_deformableBodySolver->reinitialize(m_softBodies, timeStep);
btDispatcherInfo& dispatchInfo = btMultiBodyDynamicsWorld::getDispatchInfo(); btDispatcherInfo& dispatchInfo = btMultiBodyDynamicsWorld::getDispatchInfo();
dispatchInfo.m_timeStep = timeStep; dispatchInfo.m_timeStep = timeStep;

View File

@@ -47,6 +47,7 @@ class btDeformableMultiBodyDynamicsWorld : public btMultiBodyDynamicsWorld
btScalar m_internalTime; btScalar m_internalTime;
int m_contact_iterations; int m_contact_iterations;
bool m_implicit; bool m_implicit;
bool m_lineSearch;
typedef void (*btSolverCallback)(btScalar time, btDeformableMultiBodyDynamicsWorld* world); typedef void (*btSolverCallback)(btScalar time, btDeformableMultiBodyDynamicsWorld* world);
btSolverCallback m_solverCallback; btSolverCallback m_solverCallback;
@@ -159,6 +160,11 @@ public:
{ {
m_implicit = implicit; m_implicit = implicit;
} }
void setLineSearch(bool lineSearch)
{
m_lineSearch = lineSearch;
}
}; };
#endif //BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H #endif //BT_DEFORMABLE_MULTIBODY_DYNAMICS_WORLD_H