#include "ImportMJCFSetup.h" #include "BulletDynamics/ConstraintSolver/btGeneric6DofSpring2Constraint.h" //#define TEST_MULTIBODY_SERIALIZATION 1 #include "BulletDynamics/Featherstone/btMultiBodyLinkCollider.h" #include "Bullet3Common/b3FileUtils.h" #include "BulletDynamics/Featherstone/btMultiBodyJointMotor.h" #include "BulletDynamics/Featherstone/btMultiBodyDynamicsWorld.h" #include "../CommonInterfaces/CommonParameterInterface.h" #include "../../Utils/b3ResourcePath.h" #include "../CommonInterfaces/CommonMultiBodyBase.h" #include "../ImportURDFDemo/MyMultiBodyCreator.h" #include "BulletMJCFImporter.h" #include "../ImportURDFDemo/URDF2Bullet.h" class ImportMJCFSetup : public CommonMultiBodyBase { char m_fileName[1024]; struct ImportMJCFInternalData* m_data; bool m_useMultiBody; btAlignedObjectArray m_nameMemory; btScalar m_grav; int m_upAxis; public: ImportMJCFSetup(struct GUIHelperInterface* helper, int option, const char* fileName); virtual ~ImportMJCFSetup(); virtual void initPhysics(); virtual void stepSimulation(float deltaTime); void setFileName(const char* mjcfFileName); virtual void resetCamera() { float dist = 3.5; float pitch = -28; float yaw = -136; float targetPos[3]={0.47,0,-0.64}; m_guiHelper->resetCamera(dist,yaw,pitch,targetPos[0],targetPos[1],targetPos[2]); } }; static btAlignedObjectArray gMCFJFileNameArray; #define MAX_NUM_MOTORS 1024 struct ImportMJCFInternalData { ImportMJCFInternalData() :m_numMotors(0), m_mb(0) { for (int i=0;i=numFileNames) { count=0; } sprintf(m_fileName,"%s",gMCFJFileNameArray[count++].c_str()); } } ImportMJCFSetup::~ImportMJCFSetup() { for (int i=0;isetUpAxis(m_upAxis); createEmptyDynamicsWorld(); //MuJoCo uses a slightly different collision filter mode, use the FILTER_GROUPAMASKB_OR_GROUPBMASKA2 //@todo also use the modified collision filter for raycast and other collision related queries m_filterCallback->m_filterMode = FILTER_GROUPAMASKB_OR_GROUPBMASKA2; //m_dynamicsWorld->getSolverInfo().m_numIterations = 50; m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld); m_dynamicsWorld->getDebugDrawer()->setDebugMode( btIDebugDraw::DBG_DrawConstraints +btIDebugDraw::DBG_DrawContactPoints +btIDebugDraw::DBG_DrawAabb );//+btIDebugDraw::DBG_DrawConstraintLimits); if (m_guiHelper->getParameterInterface()) { SliderParams slider("Gravity", &m_grav); slider.m_minVal = -10; slider.m_maxVal = 10; m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); } int flags=0; BulletMJCFImporter importer(m_guiHelper, 0,flags); MyMJCFLogger logger; bool result = importer.loadMJCF(m_fileName,&logger); if (result) { btTransform rootTrans; rootTrans.setIdentity(); for (int m =0; m