123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- #include "TestHingeTorque.h"
- #include "../CommonInterfaces/CommonRigidBodyBase.h"
- #include "../CommonInterfaces/CommonParameterInterface.h"
- short collisionFilterGroup = short(btBroadphaseProxy::CharacterFilter);
- short collisionFilterMask = short(btBroadphaseProxy::AllFilter ^ (btBroadphaseProxy::CharacterFilter));
- static btScalar radius(0.2);
- struct TestHingeTorque : public CommonRigidBodyBase
- {
- bool m_once;
- btAlignedObjectArray<btJointFeedback*> m_jointFeedback;
- TestHingeTorque(struct GUIHelperInterface* helper);
- virtual ~ TestHingeTorque();
- virtual void initPhysics();
- virtual void stepSimulation(float deltaTime);
-
- virtual void resetCamera()
- {
-
- float dist = 5;
- float pitch = 270;
- float yaw = 21;
- float targetPos[3]={-1.34,3.4,-0.44};
- m_guiHelper->resetCamera(dist,pitch,yaw,targetPos[0],targetPos[1],targetPos[2]);
- }
-
- };
- TestHingeTorque::TestHingeTorque(struct GUIHelperInterface* helper)
- :CommonRigidBodyBase(helper),
- m_once(true)
- {
- }
- TestHingeTorque::~ TestHingeTorque()
- {
- for (int i=0;i<m_jointFeedback.size();i++)
- {
- delete m_jointFeedback[i];
- }
- }
- void TestHingeTorque::stepSimulation(float deltaTime)
- {
- if (0)//m_once)
- {
- m_once=false;
- btHingeConstraint* hinge = (btHingeConstraint*)m_dynamicsWorld->getConstraint(0);
-
- btRigidBody& bodyA = hinge->getRigidBodyA();
- btTransform trA = bodyA.getWorldTransform();
- btVector3 hingeAxisInWorld = trA.getBasis()*hinge->getFrameOffsetA().getBasis().getColumn(2);
- hinge->getRigidBodyA().applyTorque(-hingeAxisInWorld*10);
- hinge->getRigidBodyB().applyTorque(hingeAxisInWorld*10);
-
- }
-
- m_dynamicsWorld->stepSimulation(1./240,0);
-
- static int count = 0;
- if ((count& 0x0f)==0)
- {
- btRigidBody* base = btRigidBody::upcast(m_dynamicsWorld->getCollisionObjectArray()[0]);
-
- b3Printf("base angvel = %f,%f,%f",base->getAngularVelocity()[0],
- base->getAngularVelocity()[1],
-
- base->getAngularVelocity()[2]);
-
- btRigidBody* child = btRigidBody::upcast(m_dynamicsWorld->getCollisionObjectArray()[1]);
-
-
- b3Printf("child angvel = %f,%f,%f",child->getAngularVelocity()[0],
- child->getAngularVelocity()[1],
- child->getAngularVelocity()[2]);
-
- for (int i=0;i<m_jointFeedback.size();i++)
- {
- b3Printf("Applied force at the COM/Inertial frame B[%d]:(%f,%f,%f), torque B:(%f,%f,%f)\n", i,
-
- m_jointFeedback[i]->m_appliedForceBodyB.x(),
- m_jointFeedback[i]->m_appliedForceBodyB.y(),
- m_jointFeedback[i]->m_appliedForceBodyB.z(),
- m_jointFeedback[i]->m_appliedTorqueBodyB.x(),
- m_jointFeedback[i]->m_appliedTorqueBodyB.y(),
- m_jointFeedback[i]->m_appliedTorqueBodyB.z());
- }
- }
- count++;
- //CommonRigidBodyBase::stepSimulation(deltaTime);
- }
- void TestHingeTorque::initPhysics()
- {
- int upAxis = 1;
- m_guiHelper->setUpAxis(upAxis);
- createEmptyDynamicsWorld();
- m_dynamicsWorld->getSolverInfo().m_splitImpulse = false;
-
- m_dynamicsWorld->setGravity(btVector3(0,0,-10));
-
- m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld);
- int mode = btIDebugDraw::DBG_DrawWireframe
- +btIDebugDraw::DBG_DrawConstraints
- +btIDebugDraw::DBG_DrawConstraintLimits;
- m_dynamicsWorld->getDebugDrawer()->setDebugMode(mode);
- { // create a door using hinge constraint attached to the world
-
- int numLinks = 2;
- bool spherical = false; //set it ot false -to use 1DoF hinges instead of 3DoF sphericals
- bool canSleep = false;
- bool selfCollide = false;
- btVector3 linkHalfExtents(0.05, 0.37, 0.1);
- btVector3 baseHalfExtents(0.05, 0.37, 0.1);
- btBoxShape* baseBox = new btBoxShape(baseHalfExtents);
- btVector3 basePosition = btVector3(-0.4f, 3.f, 0.f);
- btTransform baseWorldTrans;
- baseWorldTrans.setIdentity();
- baseWorldTrans.setOrigin(basePosition);
-
- //mbC->forceMultiDof(); //if !spherical, you can comment this line to check the 1DoF algorithm
- //init the base
- btVector3 baseInertiaDiag(0.f, 0.f, 0.f);
- float baseMass = 0.f;
- float linkMass = 1.f;
-
- btRigidBody* base = createRigidBody(baseMass,baseWorldTrans,baseBox);
- m_dynamicsWorld->removeRigidBody(base);
- base->setDamping(0,0);
- m_dynamicsWorld->addRigidBody(base,collisionFilterGroup,collisionFilterMask);
- btBoxShape* linkBox1 = new btBoxShape(linkHalfExtents);
- btSphereShape* linkSphere = new btSphereShape(radius);
-
- btRigidBody* prevBody = base;
-
- for (int i=0;i<numLinks;i++)
- {
- btTransform linkTrans;
- linkTrans = baseWorldTrans;
-
- linkTrans.setOrigin(basePosition-btVector3(0,linkHalfExtents[1]*2.f*(i+1),0));
-
- btCollisionShape* colOb = 0;
-
- if (i==0)
- {
- colOb = linkBox1;
- } else
- {
- colOb = linkSphere;
- }
- btRigidBody* linkBody = createRigidBody(linkMass,linkTrans,colOb);
- m_dynamicsWorld->removeRigidBody(linkBody);
- m_dynamicsWorld->addRigidBody(linkBody,collisionFilterGroup,collisionFilterMask);
- linkBody->setDamping(0,0);
- btTypedConstraint* con = 0;
-
- if (i==0)
- {
- //create a hinge constraint
- btVector3 pivotInA(0,-linkHalfExtents[1],0);
- btVector3 pivotInB(0,linkHalfExtents[1],0);
- btVector3 axisInA(1,0,0);
- btVector3 axisInB(1,0,0);
- bool useReferenceA = true;
- btHingeConstraint* hinge = new btHingeConstraint(*prevBody,*linkBody,
- pivotInA,pivotInB,
- axisInA,axisInB,useReferenceA);
- con = hinge;
- } else
- {
-
- btTransform pivotInA(btQuaternion::getIdentity(),btVector3(0, -radius, 0)); //par body's COM to cur body's COM offset
- btTransform pivotInB(btQuaternion::getIdentity(),btVector3(0, radius, 0)); //cur body's COM to cur body's PIV offset
- btGeneric6DofSpring2Constraint* fixed = new btGeneric6DofSpring2Constraint(*prevBody, *linkBody,
- pivotInA,pivotInB);
- fixed->setLinearLowerLimit(btVector3(0,0,0));
- fixed->setLinearUpperLimit(btVector3(0,0,0));
- fixed->setAngularLowerLimit(btVector3(0,0,0));
- fixed->setAngularUpperLimit(btVector3(0,0,0));
-
- con = fixed;
- }
- btAssert(con);
- if (con)
- {
- btJointFeedback* fb = new btJointFeedback();
- m_jointFeedback.push_back(fb);
- con->setJointFeedback(fb);
- m_dynamicsWorld->addConstraint(con,true);
- }
- prevBody = linkBody;
-
- }
-
- }
-
- if (1)
- {
- btVector3 groundHalfExtents(1,1,0.2);
- groundHalfExtents[upAxis]=1.f;
- btBoxShape* box = new btBoxShape(groundHalfExtents);
- box->initializePolyhedralFeatures();
-
- btTransform start; start.setIdentity();
- btVector3 groundOrigin(-0.4f, 3.f, 0.f);
- btVector3 basePosition = btVector3(-0.4f, 3.f, 0.f);
- btQuaternion groundOrn(btVector3(0,1,0),0.25*SIMD_PI);
-
- groundOrigin[upAxis] -=.5;
- groundOrigin[2]-=0.6;
- start.setOrigin(groundOrigin);
- // start.setRotation(groundOrn);
- btRigidBody* body = createRigidBody(0,start,box);
- body->setFriction(0);
-
- }
- m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
- }
- class CommonExampleInterface* TestHingeTorqueCreateFunc(CommonExampleOptions& options)
- {
- return new TestHingeTorque(options.m_guiHelper);
- }
|