123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #include "ConstraintPhysicsSetup.h"
- #include "../CommonInterfaces/CommonRigidBodyBase.h"
- #include "../CommonInterfaces/CommonParameterInterface.h"
- struct ConstraintPhysicsSetup : public CommonRigidBodyBase
- {
- ConstraintPhysicsSetup(struct GUIHelperInterface* helper);
- virtual ~ConstraintPhysicsSetup();
- virtual void initPhysics();
- virtual void stepSimulation(float deltaTime);
-
- virtual void resetCamera()
- {
- float dist = 7;
- float pitch = 721;
- float yaw = 44;
- float targetPos[3]={8,1,-11};
- m_guiHelper->resetCamera(dist,pitch,yaw,targetPos[0],targetPos[1],targetPos[2]);
- }
-
- };
- ConstraintPhysicsSetup::ConstraintPhysicsSetup(struct GUIHelperInterface* helper)
- :CommonRigidBodyBase(helper)
- {
- }
- 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()
- {
- m_guiHelper->setUpAxis(1);
- createEmptyDynamicsWorld();
- m_guiHelper->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;
- m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider);
- }
- {
- SliderParams slider("max impulse",&maxImpulse);
- slider.m_minVal=0;
- slider.m_maxVal=1000;
- m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider);
- }
- {
- SliderParams slider("actual vel",&actualHingeVelocity);
- slider.m_minVal=-4;
- slider.m_maxVal=4;
- m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider);
- }
- val=1.f;
- {
- SliderParams slider("angle",&val);
- slider.m_minVal=-720;
- slider.m_maxVal=720;
- m_guiHelper->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));
- }
-
- m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
- }
- class CommonExampleInterface* ConstraintCreateFunc(CommonExampleOptions& options)
- {
- return new ConstraintPhysicsSetup(options.m_guiHelper);
- }
|