add files
This commit is contained in:
150
examples/BlockSolver/RigidBodyBoxes.cpp
Normal file
150
examples/BlockSolver/RigidBodyBoxes.cpp
Normal file
@@ -0,0 +1,150 @@
|
||||
#include "RigidBodyBoxes.h"
|
||||
#include "../CommonInterfaces/CommonParameterInterface.h"
|
||||
#include "../CommonInterfaces/CommonRigidBodyBase.h"
|
||||
#include "BlockSolverExample.h"
|
||||
#include "btBlockSolver.h"
|
||||
|
||||
class RigidBodyBoxes : public CommonRigidBodyBase
|
||||
{
|
||||
int m_option;
|
||||
int m_numIterations;
|
||||
int m_numBoxes = 4;
|
||||
btAlignedObjectArray<btRigidBody*> boxes;
|
||||
static btScalar numSolverIterations;
|
||||
|
||||
public:
|
||||
RigidBodyBoxes(GUIHelperInterface* helper, int option);
|
||||
virtual ~RigidBodyBoxes();
|
||||
|
||||
virtual void initPhysics();
|
||||
|
||||
virtual void stepSimulation(float deltaTime);
|
||||
void resetCubePosition();
|
||||
virtual void resetCamera()
|
||||
{
|
||||
float dist = 3;
|
||||
float pitch = -35;
|
||||
float yaw = 50;
|
||||
float targetPos[3] = {0, 0, .1};
|
||||
m_guiHelper->resetCamera(dist, yaw, pitch, targetPos[0], targetPos[1],
|
||||
targetPos[2]);
|
||||
}
|
||||
|
||||
void createRigidBodyStack();
|
||||
};
|
||||
|
||||
btScalar RigidBodyBoxes::numSolverIterations = 50;
|
||||
|
||||
RigidBodyBoxes::RigidBodyBoxes(GUIHelperInterface* helper, int option)
|
||||
: CommonRigidBodyBase(helper),
|
||||
m_option(option),
|
||||
m_numIterations(numSolverIterations)
|
||||
{
|
||||
m_guiHelper->setUpAxis(2);
|
||||
}
|
||||
|
||||
RigidBodyBoxes::~RigidBodyBoxes()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
void RigidBodyBoxes::createRigidBodyStack()
|
||||
{
|
||||
// create ground
|
||||
btBoxShape* groundShape =
|
||||
createBoxShape(btVector3(btScalar(5.), btScalar(5.), btScalar(5.)));
|
||||
m_collisionShapes.push_back(groundShape);
|
||||
btTransform groundTransform;
|
||||
groundTransform.setIdentity();
|
||||
groundTransform.setOrigin(btVector3(0, 0, -5));
|
||||
btScalar mass(0.);
|
||||
btRigidBody* body = createRigidBody(mass, groundTransform, groundShape,
|
||||
btVector4(0, 0, 1, 1));
|
||||
|
||||
// create a few boxes
|
||||
mass = 1;
|
||||
for (int i = 0; i < m_numBoxes; i++)
|
||||
{
|
||||
btBoxShape* boxShape =
|
||||
createBoxShape(btVector3(btScalar(.1), btScalar(.1), btScalar(.1)));
|
||||
m_collisionShapes.push_back(boxShape);
|
||||
mass *= 4;
|
||||
btTransform tr;
|
||||
tr.setIdentity();
|
||||
tr.setOrigin(btVector3(0, 0, 0.1 + i * 0.2));
|
||||
boxes.push_back(createRigidBody(mass, tr, boxShape));
|
||||
}
|
||||
}
|
||||
|
||||
void RigidBodyBoxes::initPhysics()
|
||||
{
|
||||
/// collision configuration contains default setup for memory, collision setup
|
||||
m_collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||
|
||||
/// 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();
|
||||
|
||||
{
|
||||
SliderParams slider("numSolverIterations", &numSolverIterations);
|
||||
slider.m_minVal = 5;
|
||||
slider.m_maxVal = 500;
|
||||
m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider);
|
||||
}
|
||||
|
||||
if (m_option & BLOCK_SOLVER_SI)
|
||||
{
|
||||
m_solver = new btSequentialImpulseConstraintSolver;
|
||||
b3Printf("Constraint Solver: Sequential Impulse");
|
||||
}
|
||||
if (m_option & BLOCK_SOLVER_BLOCK)
|
||||
{
|
||||
m_solver = new btBlockSolver();
|
||||
b3Printf("Constraint Solver: Block solver");
|
||||
}
|
||||
|
||||
btAssert(m_solver);
|
||||
|
||||
m_dynamicsWorld = new btDiscreteDynamicsWorld(
|
||||
m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration);
|
||||
m_dynamicsWorld->setGravity(btVector3(0, 0, -10));
|
||||
|
||||
createRigidBodyStack();
|
||||
|
||||
m_dynamicsWorld->getSolverInfo().m_numIterations = numSolverIterations;
|
||||
m_dynamicsWorld->getSolverInfo().m_globalCfm = btScalar(1e-6);
|
||||
|
||||
m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld);
|
||||
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
|
||||
}
|
||||
|
||||
void RigidBodyBoxes::resetCubePosition()
|
||||
{
|
||||
for (int i = 0; i < m_numBoxes; i++)
|
||||
{
|
||||
btTransform tr;
|
||||
tr.setIdentity();
|
||||
tr.setOrigin(btVector3(0, 0, 0.1 + i * 0.2));
|
||||
boxes[i]->setWorldTransform(tr);
|
||||
}
|
||||
}
|
||||
|
||||
void RigidBodyBoxes::stepSimulation(float deltaTime)
|
||||
{
|
||||
if ((int)numSolverIterations != m_numIterations)
|
||||
{
|
||||
resetCubePosition();
|
||||
m_numIterations = (int)numSolverIterations;
|
||||
m_dynamicsWorld->getSolverInfo().m_numIterations = m_numIterations;
|
||||
b3Printf("New num iterations; %d", m_numIterations);
|
||||
}
|
||||
|
||||
m_dynamicsWorld->stepSimulation(deltaTime);
|
||||
}
|
||||
|
||||
CommonExampleInterface* RigidBodyBoxesCreateFunc(
|
||||
CommonExampleOptions& options)
|
||||
{
|
||||
return new RigidBodyBoxes(options.m_guiHelper, options.m_option);
|
||||
}
|
||||
6
examples/BlockSolver/RigidBodyBoxes.h
Normal file
6
examples/BlockSolver/RigidBodyBoxes.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef BLOCKSOLVER_RIGIDBODYBOXES_H_
|
||||
#define BLOCKSOLVER_RIGIDBODYBOXES_H_
|
||||
|
||||
class CommonExampleInterface* RigidBodyBoxesCreateFunc(struct CommonExampleOptions& options);
|
||||
|
||||
#endif //BLOCKSOLVER_RIGIDBODYBOXES_H_
|
||||
Reference in New Issue
Block a user