add TestHingeTorque example using btRigidBody and btHingeConstraint, setup is similar to TestJointTorque using btMultiBody and a revolute joint.
This commit is contained in:
153
examples/Constraints/TestHingeTorque.cpp
Normal file
153
examples/Constraints/TestHingeTorque.cpp
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
#include "TestHingeTorque.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "../CommonInterfaces/CommonRigidBodyBase.h"
|
||||||
|
#include "../CommonInterfaces/CommonParameterInterface.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct TestHingeTorque : public CommonRigidBodyBase
|
||||||
|
{
|
||||||
|
bool m_once;
|
||||||
|
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TestHingeTorque::stepSimulation(float deltaTime)
|
||||||
|
{
|
||||||
|
if (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./60,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]);
|
||||||
|
|
||||||
|
//CommonRigidBodyBase::stepSimulation(deltaTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void TestHingeTorque::initPhysics()
|
||||||
|
{
|
||||||
|
m_guiHelper->setUpAxis(2);
|
||||||
|
|
||||||
|
createEmptyDynamicsWorld();
|
||||||
|
m_dynamicsWorld->setGravity(btVector3(0,0,0));
|
||||||
|
|
||||||
|
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 = 1;
|
||||||
|
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 = 1.f;
|
||||||
|
float linkMass = 1.f;
|
||||||
|
|
||||||
|
btRigidBody* base = createRigidBody(baseMass,baseWorldTrans,baseBox);
|
||||||
|
m_dynamicsWorld->removeRigidBody(base);
|
||||||
|
base->setDamping(0,0);
|
||||||
|
m_dynamicsWorld->addRigidBody(base,0,0);
|
||||||
|
btBoxShape* linkBox = new btBoxShape(linkHalfExtents);
|
||||||
|
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));
|
||||||
|
|
||||||
|
btRigidBody* linkBody = createRigidBody(linkMass,linkTrans,linkBox);
|
||||||
|
m_dynamicsWorld->removeRigidBody(linkBody);
|
||||||
|
m_dynamicsWorld->addRigidBody(linkBody,0,0);
|
||||||
|
linkBody->setDamping(0,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);
|
||||||
|
m_dynamicsWorld->addConstraint(hinge,true);
|
||||||
|
prevBody = linkBody;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld);
|
||||||
|
}
|
||||||
|
|
||||||
|
class CommonExampleInterface* TestHingeTorqueCreateFunc(CommonExampleOptions& options)
|
||||||
|
{
|
||||||
|
return new TestHingeTorque(options.m_guiHelper);
|
||||||
|
}
|
||||||
7
examples/Constraints/TestHingeTorque.h
Normal file
7
examples/Constraints/TestHingeTorque.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#ifndef TEST_HINGE_TORQUE_H
|
||||||
|
#define TEST_HINGE_TORQUE_H
|
||||||
|
|
||||||
|
class CommonExampleInterface* TestHingeTorqueCreateFunc(struct CommonExampleOptions& options);
|
||||||
|
|
||||||
|
#endif //TEST_HINGE_TORQUE_H
|
||||||
|
|
||||||
@@ -97,6 +97,8 @@ SET(App_ExampleBrowser_SRCS
|
|||||||
../MultiBody/TestJointTorqueSetup.h
|
../MultiBody/TestJointTorqueSetup.h
|
||||||
../MultiBody/MultiDofDemo.cpp
|
../MultiBody/MultiDofDemo.cpp
|
||||||
../MultiBody/MultiDofDemo.h
|
../MultiBody/MultiDofDemo.h
|
||||||
|
../Constraints/TestHingeTorque.cpp
|
||||||
|
../Constraints/TestHingeTorque.h
|
||||||
../Constraints/ConstraintDemo.cpp
|
../Constraints/ConstraintDemo.cpp
|
||||||
../Constraints/ConstraintDemo.h
|
../Constraints/ConstraintDemo.h
|
||||||
../Constraints/Dof6Spring2Setup.cpp
|
../Constraints/Dof6Spring2Setup.cpp
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
#include "../RollingFrictionDemo/RollingFrictionDemo.h"
|
#include "../RollingFrictionDemo/RollingFrictionDemo.h"
|
||||||
#include "../SharedMemory/PhysicsServer.h"
|
#include "../SharedMemory/PhysicsServer.h"
|
||||||
#include "../SharedMemory/PhysicsClient.h"
|
#include "../SharedMemory/PhysicsClient.h"
|
||||||
|
#include "../Constraints/TestHingeTorque.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef ENABLE_LUA
|
#ifdef ENABLE_LUA
|
||||||
#include "../LuaDemo/LuaPhysicsSetup.h"
|
#include "../LuaDemo/LuaPhysicsSetup.h"
|
||||||
@@ -79,7 +81,9 @@ static ExampleEntry gDefaultExamples[]=
|
|||||||
AllConstraintCreateFunc),
|
AllConstraintCreateFunc),
|
||||||
|
|
||||||
ExampleEntry(1,"Motorized Hinge","Use of a btHingeConstraint. You can adjust the first slider to change the target velocity, and the second slider to adjust the maximum impulse applied to reach the target velocity. Note that the hinge angle can reach beyond -360 and 360 degrees.", ConstraintCreateFunc),
|
ExampleEntry(1,"Motorized Hinge","Use of a btHingeConstraint. You can adjust the first slider to change the target velocity, and the second slider to adjust the maximum impulse applied to reach the target velocity. Note that the hinge angle can reach beyond -360 and 360 degrees.", ConstraintCreateFunc),
|
||||||
|
ExampleEntry(1,"TestHingeTorque", "Apply a torque in the hinge axis. This example uses a btHingeConstraint and btRigidBody. The setup is similar to the multi body example TestJointTorque.",
|
||||||
|
TestHingeTorqueCreateFunc),
|
||||||
|
|
||||||
// ExampleEntry(0,"What's new in 2.83"),
|
// ExampleEntry(0,"What's new in 2.83"),
|
||||||
|
|
||||||
ExampleEntry(1,"6DofSpring2","Show the use of the btGeneric6DofSpring2Constraint. This is a replacement of the btGeneric6DofSpringConstraint, it has various improvements. This includes improved spring implementation and better control over the restitution (bounce) when the constraint hits its limits.",
|
ExampleEntry(1,"6DofSpring2","Show the use of the btGeneric6DofSpring2Constraint. This is a replacement of the btGeneric6DofSpringConstraint, it has various improvements. This includes improved spring implementation and better control over the restitution (bounce) when the constraint hits its limits.",
|
||||||
@@ -94,7 +98,7 @@ static ExampleEntry gDefaultExamples[]=
|
|||||||
|
|
||||||
ExampleEntry(0,"MultiBody"),
|
ExampleEntry(0,"MultiBody"),
|
||||||
ExampleEntry(1,"MultiDofCreateFunc","Create a basic btMultiBody with 3-DOF spherical joints (mobilizers). The demo uses a fixed base or a floating base at restart.", MultiDofCreateFunc),
|
ExampleEntry(1,"MultiDofCreateFunc","Create a basic btMultiBody with 3-DOF spherical joints (mobilizers). The demo uses a fixed base or a floating base at restart.", MultiDofCreateFunc),
|
||||||
ExampleEntry(1,"TestJointTorque","Apply a torque to a btMultiBody with 1-DOF joints (mobilizers).", TestJointTorqueCreateFunc),
|
ExampleEntry(1,"TestJointTorque","Apply a torque to a btMultiBody with 1-DOF joints (mobilizers). This setup is similar to API/TestHingeTorque.", TestJointTorqueCreateFunc),
|
||||||
|
|
||||||
|
|
||||||
#ifdef INCLUDE_CLOTH_DEMOS
|
#ifdef INCLUDE_CLOTH_DEMOS
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
struct TestJointTorqueSetup : public CommonMultiBodyBase
|
struct TestJointTorqueSetup : public CommonMultiBodyBase
|
||||||
{
|
{
|
||||||
btMultiBody* m_multiBody;
|
btMultiBody* m_multiBody;
|
||||||
|
bool m_once;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TestJointTorqueSetup(struct GUIHelperInterface* helper);
|
TestJointTorqueSetup(struct GUIHelperInterface* helper);
|
||||||
@@ -31,7 +31,8 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
TestJointTorqueSetup::TestJointTorqueSetup(struct GUIHelperInterface* helper)
|
TestJointTorqueSetup::TestJointTorqueSetup(struct GUIHelperInterface* helper)
|
||||||
:CommonMultiBodyBase(helper)
|
:CommonMultiBodyBase(helper),
|
||||||
|
m_once(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,10 +89,10 @@ void TestJointTorqueSetup::initPhysics()
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
bool floating = false;
|
bool floating = true;
|
||||||
bool damping = true;
|
bool damping = false;
|
||||||
bool gyro = true;
|
bool gyro = false;
|
||||||
int numLinks = 5;
|
int numLinks = 1;
|
||||||
bool spherical = false; //set it ot false -to use 1DoF hinges instead of 3DoF sphericals
|
bool spherical = false; //set it ot false -to use 1DoF hinges instead of 3DoF sphericals
|
||||||
bool canSleep = false;
|
bool canSleep = false;
|
||||||
bool selfCollide = false;
|
bool selfCollide = false;
|
||||||
@@ -173,7 +174,7 @@ void TestJointTorqueSetup::initPhysics()
|
|||||||
//gravity[upAxis] = -9.81;
|
//gravity[upAxis] = -9.81;
|
||||||
m_dynamicsWorld->setGravity(gravity);
|
m_dynamicsWorld->setGravity(gravity);
|
||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
if(numLinks > 0)
|
if(0)//numLinks > 0)
|
||||||
{
|
{
|
||||||
btScalar q0 = 45.f * SIMD_PI/ 180.f;
|
btScalar q0 = 45.f * SIMD_PI/ 180.f;
|
||||||
if(!spherical)
|
if(!spherical)
|
||||||
@@ -275,8 +276,27 @@ void TestJointTorqueSetup::initPhysics()
|
|||||||
|
|
||||||
void TestJointTorqueSetup::stepSimulation(float deltaTime)
|
void TestJointTorqueSetup::stepSimulation(float deltaTime)
|
||||||
{
|
{
|
||||||
m_multiBody->addJointTorque(0, 10.0);
|
if (m_once)
|
||||||
m_dynamicsWorld->stepSimulation(deltaTime);
|
{
|
||||||
|
m_once=false;
|
||||||
|
m_multiBody->addJointTorque(0, 10.0);
|
||||||
|
|
||||||
|
btScalar torque = m_multiBody->getJointTorque(0);
|
||||||
|
b3Printf("t = %f,%f,%f\n",torque,torque,torque);//[0],torque[1],torque[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_dynamicsWorld->stepSimulation(1./60,0);
|
||||||
|
b3Printf("base angvel = %f,%f,%f",m_multiBody->getBaseOmega()[0],
|
||||||
|
m_multiBody->getBaseOmega()[1],
|
||||||
|
m_multiBody->getBaseOmega()[2]
|
||||||
|
);
|
||||||
|
|
||||||
|
btScalar jointVel =m_multiBody->getJointVel(0);
|
||||||
|
|
||||||
|
b3Printf("child angvel = %f",jointVel);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -120,11 +120,14 @@ struct btMultibodyLink
|
|||||||
btVector3 m_cachedRVector; // vector from COM of parent to COM of this link, in local frame.
|
btVector3 m_cachedRVector; // vector from COM of parent to COM of this link, in local frame.
|
||||||
|
|
||||||
btVector3 m_appliedForce; // In WORLD frame
|
btVector3 m_appliedForce; // In WORLD frame
|
||||||
btVector3 m_appliedTorque; // In WORLD frame
|
btVector3 m_appliedTorque; // In WORLD frame
|
||||||
|
|
||||||
btScalar m_jointPos[7];
|
btScalar m_jointPos[7];
|
||||||
btScalar m_jointTorque[6]; //TODO
|
|
||||||
|
//m_jointTorque is the joint torque applied by the user using 'addJointTorque'.
|
||||||
|
//It gets set to zero after each internal stepSimulation call
|
||||||
|
btScalar m_jointTorque[6];
|
||||||
|
|
||||||
class btMultiBodyLinkCollider* m_collider;
|
class btMultiBodyLinkCollider* m_collider;
|
||||||
int m_flags;
|
int m_flags;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user