add very basic multibody vehicle
tweak finite element experiment with parameter
This commit is contained in:
@@ -1,77 +1,127 @@
|
||||
#include "ConstraintPhysicsSetup.h"
|
||||
|
||||
ConstraintPhysicsSetup::ConstraintPhysicsSetup()
|
||||
{
|
||||
}
|
||||
ConstraintPhysicsSetup::~ConstraintPhysicsSetup()
|
||||
{
|
||||
}
|
||||
|
||||
btScalar val;
|
||||
btHingeAccumulatedAngleConstraint* spDoorHinge=0;
|
||||
void ConstraintPhysicsSetup::stepSimulation(float deltaTime)
|
||||
{
|
||||
val=spDoorHinge->getAccumulatedHingeAngle()*SIMD_DEGS_PER_RAD;// spDoorHinge->getHingeAngle()*SIMD_DEGS_PER_RAD;
|
||||
if (m_dynamicsWorld)
|
||||
{
|
||||
m_dynamicsWorld->stepSimulation(deltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#include "Bullet3Common/b3Logging.h"
|
||||
|
||||
void ConstraintPhysicsSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge)
|
||||
{
|
||||
b3Printf(__FILE__);
|
||||
|
||||
gfxBridge.setUpAxis(1);
|
||||
|
||||
createEmptyDynamicsWorld();
|
||||
|
||||
gfxBridge.createPhysicsDebugDrawer(m_dynamicsWorld);
|
||||
int mode = btIDebugDraw::DBG_DrawWireframe
|
||||
+btIDebugDraw::DBG_DrawConstraints
|
||||
+btIDebugDraw::DBG_DrawConstraintLimits;
|
||||
m_dynamicsWorld->getDebugDrawer()->setDebugMode(mode);
|
||||
|
||||
val=1.f;
|
||||
SliderParams slider("hinge angle",&val);
|
||||
slider.m_minVal=-720;
|
||||
slider.m_maxVal=720;
|
||||
gfxBridge.getParameterInterface()->registerSliderFloatParameter(slider);
|
||||
|
||||
|
||||
{ // create a door using hinge constraint attached to the world
|
||||
btCollisionShape* pDoorShape = new btBoxShape(btVector3(2.0f, 5.0f, 0.2f));
|
||||
m_collisionShapes.push_back(pDoorShape);
|
||||
btTransform doorTrans;
|
||||
doorTrans.setIdentity();
|
||||
doorTrans.setOrigin(btVector3(-5.0f, -2.0f, 0.0f));
|
||||
btRigidBody* pDoorBody = createRigidBody( 1.0, doorTrans, pDoorShape);
|
||||
pDoorBody->setActivationState(DISABLE_DEACTIVATION);
|
||||
const btVector3 btPivotA(10.f + 2.1f, -2.0f, 0.0f ); // right next to the door slightly outside
|
||||
btVector3 btAxisA( 0.0f, 1.0f, 0.0f ); // pointing upwards, aka Y-axis
|
||||
|
||||
spDoorHinge = new btHingeAccumulatedAngleConstraint( *pDoorBody, btPivotA, btAxisA );
|
||||
spDoorHinge->setParam(BT_CONSTRAINT_ERP,0.5);
|
||||
btScalar erp = spDoorHinge->getParam(BT_CONSTRAINT_ERP);
|
||||
|
||||
// spDoorHinge->setLimit( 0.0f, SIMD_PI_2 );
|
||||
// test problem values
|
||||
// spDoorHinge->setLimit( -SIMD_PI, SIMD_PI*0.8f);
|
||||
|
||||
// spDoorHinge->setLimit( 1.f, -1.f);
|
||||
// spDoorHinge->setLimit( -SIMD_PI*0.8f, SIMD_PI);
|
||||
// spDoorHinge->setLimit( -SIMD_PI*0.8f, SIMD_PI, 0.9f, 0.3f, 0.0f);
|
||||
// spDoorHinge->setLimit( -SIMD_PI*0.8f, SIMD_PI, 0.9f, 0.01f, 0.0f); // "sticky limits"
|
||||
// spDoorHinge->setLimit( -SIMD_PI * 0.25f, SIMD_PI * 0.25f );
|
||||
// spDoorHinge->setLimit( 0.0f, 0.0f );
|
||||
m_dynamicsWorld->addConstraint(spDoorHinge);
|
||||
spDoorHinge->setDbgDrawSize(btScalar(5.f));
|
||||
|
||||
//doorTrans.setOrigin(btVector3(-5.0f, 2.0f, 0.0f));
|
||||
//btRigidBody* pDropBody = localCreateRigidBody( 10.0, doorTrans, shape);
|
||||
}
|
||||
|
||||
}
|
||||
#include "ConstraintPhysicsSetup.h"
|
||||
|
||||
ConstraintPhysicsSetup::ConstraintPhysicsSetup()
|
||||
{
|
||||
}
|
||||
ConstraintPhysicsSetup::~ConstraintPhysicsSetup()
|
||||
{
|
||||
}
|
||||
|
||||
static btScalar val;
|
||||
static btScalar targetVel=0;
|
||||
static btScalar maxImpulse=10000;
|
||||
static btHingeAccumulatedAngleConstraint* spDoorHinge=0;
|
||||
static btScalar actualHingeVelocity=0.f;
|
||||
|
||||
static btVector3 btAxisA(0,1,0);
|
||||
|
||||
void ConstraintPhysicsSetup::stepSimulation(float deltaTime)
|
||||
{
|
||||
val=spDoorHinge->getAccumulatedHingeAngle()*SIMD_DEGS_PER_RAD;
|
||||
if (m_dynamicsWorld)
|
||||
{
|
||||
spDoorHinge->enableAngularMotor(true,targetVel,maxImpulse);
|
||||
|
||||
m_dynamicsWorld->stepSimulation(deltaTime,10,1./240.);
|
||||
|
||||
|
||||
btHingeConstraint* hinge = spDoorHinge;
|
||||
|
||||
if (hinge)
|
||||
{
|
||||
|
||||
const btRigidBody& bodyA = hinge->getRigidBodyA();
|
||||
const btRigidBody& bodyB = hinge->getRigidBodyB();
|
||||
|
||||
|
||||
btTransform trA = bodyA.getWorldTransform();
|
||||
btVector3 angVelA = bodyA.getAngularVelocity();
|
||||
btVector3 angVelB = bodyB.getAngularVelocity();
|
||||
|
||||
{
|
||||
btVector3 ax1 = trA.getBasis()*hinge->getFrameOffsetA().getBasis().getColumn(2);
|
||||
btScalar vel = angVelA.dot(ax1);
|
||||
vel -= angVelB.dot(ax1);
|
||||
printf("hinge velocity (q) = %f\n", vel);
|
||||
actualHingeVelocity=vel;
|
||||
}
|
||||
btVector3 ortho0,ortho1;
|
||||
btPlaneSpace1(btAxisA,ortho0,ortho1);
|
||||
{
|
||||
|
||||
btScalar vel2 = angVelA.dot(ortho0);
|
||||
vel2 -= angVelB.dot(ortho0);
|
||||
printf("hinge orthogonal1 velocity (q) = %f\n", vel2);
|
||||
}
|
||||
{
|
||||
|
||||
btScalar vel0 = angVelA.dot(ortho1);
|
||||
vel0 -= angVelB.dot(ortho1);
|
||||
printf("hinge orthogonal0 velocity (q) = %f\n", vel0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ConstraintPhysicsSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge)
|
||||
{
|
||||
gfxBridge.setUpAxis(1);
|
||||
|
||||
createEmptyDynamicsWorld();
|
||||
|
||||
gfxBridge.createPhysicsDebugDrawer(m_dynamicsWorld);
|
||||
int mode = btIDebugDraw::DBG_DrawWireframe
|
||||
+btIDebugDraw::DBG_DrawConstraints
|
||||
+btIDebugDraw::DBG_DrawConstraintLimits;
|
||||
m_dynamicsWorld->getDebugDrawer()->setDebugMode(mode);
|
||||
|
||||
|
||||
{
|
||||
SliderParams slider("target vel",&targetVel);
|
||||
slider.m_minVal=-4;
|
||||
slider.m_maxVal=4;
|
||||
gfxBridge.getParameterInterface()->registerSliderFloatParameter(slider);
|
||||
}
|
||||
|
||||
{
|
||||
SliderParams slider("max impulse",&maxImpulse);
|
||||
slider.m_minVal=0;
|
||||
slider.m_maxVal=1000;
|
||||
gfxBridge.getParameterInterface()->registerSliderFloatParameter(slider);
|
||||
}
|
||||
|
||||
{
|
||||
SliderParams slider("actual vel",&actualHingeVelocity);
|
||||
slider.m_minVal=-4;
|
||||
slider.m_maxVal=4;
|
||||
gfxBridge.getParameterInterface()->registerSliderFloatParameter(slider);
|
||||
}
|
||||
|
||||
val=1.f;
|
||||
{
|
||||
SliderParams slider("angle",&val);
|
||||
slider.m_minVal=-720;
|
||||
slider.m_maxVal=720;
|
||||
gfxBridge.getParameterInterface()->registerSliderFloatParameter(slider);
|
||||
}
|
||||
|
||||
{ // create a door using hinge constraint attached to the world
|
||||
btCollisionShape* pDoorShape = new btBoxShape(btVector3(2.0f, 5.0f, 0.2f));
|
||||
m_collisionShapes.push_back(pDoorShape);
|
||||
btTransform doorTrans;
|
||||
doorTrans.setIdentity();
|
||||
doorTrans.setOrigin(btVector3(-5.0f, -2.0f, 0.0f));
|
||||
btRigidBody* pDoorBody = createRigidBody( 1.0, doorTrans, pDoorShape);
|
||||
pDoorBody->setActivationState(DISABLE_DEACTIVATION);
|
||||
const btVector3 btPivotA(10.f + 2.1f, -2.0f, 0.0f ); // right next to the door slightly outside
|
||||
|
||||
spDoorHinge = new btHingeAccumulatedAngleConstraint( *pDoorBody, btPivotA, btAxisA );
|
||||
|
||||
m_dynamicsWorld->addConstraint(spDoorHinge);
|
||||
|
||||
spDoorHinge->setDbgDrawSize(btScalar(5.f));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user