diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp index 885e67479f44d96701dbd7e35a175dcdf7f53f43..1b63fa7c392a7cc3543e6745586489b988291ff7 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp @@ -52,13 +52,11 @@ namespace SimDynamics { std::vector<Primitive::PrimitivePtr> primitives = colModel->getVisualization()->primitives; - /*if (primitives.size() == 1 && primitives[0]->transform.isIdentity()) - { - collisionShape.reset(getShapeFromPrimitive(primitives[0])); - } else - */ if (primitives.size() > 0) { + //cout << "Object:" << o->getName() << endl; + //o->print(); + btCompoundShape* compoundShape = new btCompoundShape(true); std::vector<Primitive::PrimitivePtr>::const_iterator it; Eigen::Matrix4f currentTransform = Eigen::Matrix4f::Identity(); @@ -66,17 +64,27 @@ namespace SimDynamics Eigen::Matrix4f localComTransform; localComTransform.setIdentity(); localComTransform.block(0,3,3,1) = -o->getCoMLocal(); - //cout << "localComTransform:\n" << localComTransform; + //cout << "localComTransform:\n" << localComTransform << endl; for (it = primitives.begin(); it != primitives.end(); it++) { //currentTransform *= (*it)->transform; currentTransform = localComTransform*(*it)->transform; + //cout << "primitive: (*it)->transform:\n" << (*it)->transform << endl; + //cout << "primitive: currentTransform:\n" << currentTransform << endl; + compoundShape->addChildShape(BulletEngine::getPoseBullet(currentTransform), getShapeFromPrimitive(*it)); } collisionShape.reset(compoundShape); + + // update com + Eigen::Matrix4f comLoc; + comLoc.setIdentity(); + comLoc.block(0, 3, 3, 1) = o->getCoMGlobal(); + comLoc = (o->getGlobalPose().inverse() * comLoc); + com = comLoc.block(0, 3, 3, 1); } else { diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp index 5672483fa924b94caf149358a6eb68f463a30910..ac701b8b69a554ef05a47b9b8cf819600b045d22 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.cpp @@ -6,6 +6,7 @@ namespace SimDynamics BulletOpenGLViewer::BulletOpenGLViewer(DynamicsWorldPtr world) { + this->world = world; SIMDYNAMICS_ASSERT(world); m_sundirection = btVector3(1, 1, -2) * 1000; @@ -77,15 +78,15 @@ namespace SimDynamics void BulletOpenGLViewer::keyboardCallback(unsigned char key, int x, int y) { - DemoApplication::keyboardCallback(key, x, y); - /*switch (key) + //DemoApplication::keyboardCallback(key, x, y); + switch (key) { - case 'e': - spawnRagdoll(true); + case 'p': + bulletEngine->print(); break; default: DemoApplication::keyboardCallback(key, x, y); - }*/ + } } BulletOpenGLViewer::~BulletOpenGLViewer() diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h index 875fab1b90c46fc4fd39ba022cdebd29db71faf7..a07be7fee1a66ae7e0128b8f1962ae9d040db0d9 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletOpenGLViewer.h @@ -73,6 +73,8 @@ namespace SimDynamics return demo; }*/ + DynamicsWorldPtr world; + void updateRobotConstraints(); GLDebugDrawer debugDrawer; diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp index 3e98dac009c14590fd7dabce5ce52c6e6941331d..35b99eb69ec13aaecff0368b54da78ee499f318e 100644 --- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp +++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp @@ -640,6 +640,9 @@ namespace SimDynamics { const SimDynamics::DynamicsEngine::DynamicsContactInfo& contact = *it; + if (!contact.objectA || !contact.objectB) + continue; + float sign; std::string key; std::string contactBody; diff --git a/SimDynamics/DynamicsWorld.h b/SimDynamics/DynamicsWorld.h index 8968f9f36c58773e4f8f76cd31cf9d5358ac5553..b247cd1fe53a192e15667962e34845b63bc558c4 100644 --- a/SimDynamics/DynamicsWorld.h +++ b/SimDynamics/DynamicsWorld.h @@ -58,7 +58,7 @@ namespace SimDynamics /*! Build a dynamic version of your VirtualRobot::SceneObject. This can be an Obstacle or a ManipulationObject. Internally the value of o->getSimulationtype() is queried in order to specify which type of simulation should be performed. - If the simualtion type is not specified a full dynamic object is created (as with eDynamic). + If the simulation type is not specified a full dynamic object is created (as with eDynamic). */ static DynamicsObjectPtr CreateDynamicsObject(VirtualRobot::SceneObjectPtr o); diff --git a/SimDynamics/examples/BulletDebugViewer/BulletDebugViewerGlut.cpp b/SimDynamics/examples/BulletDebugViewer/BulletDebugViewerGlut.cpp index a5f2bcc1a308e527e774f3f94304eb508ad4f067..8a31e50c7ec2bc0437a8c10274af1d71f2c0db40 100644 --- a/SimDynamics/examples/BulletDebugViewer/BulletDebugViewerGlut.cpp +++ b/SimDynamics/examples/BulletDebugViewer/BulletDebugViewerGlut.cpp @@ -160,20 +160,35 @@ int main(int argc, char* argv[]) world->createFloorPlane(); VirtualRobot::ObstaclePtr o = VirtualRobot::Obstacle::createBox(100.0f, 100.0f, 100.0f); + o->setSimulationType(SceneObject::Physics::eDynamic); + Eigen::Matrix4f gp = Eigen::Matrix4f::Identity(); + gp.block(0,3,3,1) = Eigen::Vector3f(2800, 10400, 5000.0f); + o->setGlobalPose(gp); o->setMass(1.0f); // 1kg SimDynamics::DynamicsObjectPtr dynObj = world->CreateDynamicsObject(o); - dynObj->setPosition(Eigen::Vector3f(3000, 3000, 1000.0f)); world->addObject(dynObj); + o->print(); + #if 0 std::string f = "/home/niko/coding/armarx/SimulationX/data/environment/KIT_Robot_Kitchen.xml"; ManipulationObjectPtr mo = ObjectIO::loadManipulationObject(f); SimDynamics::DynamicsObjectPtr dynObj2 = world->CreateDynamicsObject(mo, DynamicsObject::eKinematic); + world->addObject(dynObj2); +#endif + + +#if 0 + std::string f = "/home/SMBAD/vahrenka/.armarx/mongo/.cache/files/lowersink.xml"; + ManipulationObjectPtr mo = ObjectIO::loadManipulationObject(f); + SimDynamics::DynamicsObjectPtr dynObj2 = world->CreateDynamicsObject(mo); //dynObj->setPosition(Eigen::Vector3f(3000,3000,1000.0f)); world->addObject(dynObj2); #endif + + VirtualRobot::RuntimeEnvironment::getDataFileAbsolute(robFile); VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robFile); diff --git a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp index 095b5be20ddbe81dbd53ccfe98efbb1413e70211..b8916a0e7cf16128d27c86f43404386feef9efce 100644 --- a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp +++ b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp @@ -82,6 +82,17 @@ SimDynamicsWindow::SimDynamicsWindow(std::string& sRobotFilename, Qt::WFlags fla dynamicsWorld->addObject(dynamicsObject2); #endif +#if 0 + std::string f = "/home/SMBAD/vahrenka/.armarx/mongo/.cache/files/lowersink.xml"; + ManipulationObjectPtr mo = ObjectIO::loadManipulationObject(f); + mo->setSimulationType(SceneObject::Physics::eDynamic); + SimDynamics::DynamicsObjectPtr dynObj2 = dynamicsWorld->CreateDynamicsObject(mo); + //dynObj2->setSimType(VirtualRobot::SceneObject::Physics::eDynamic); + dynObj2->setPosition(Eigen::Vector3f(0,0,-200.0f)); + dynamicsWorld->addObject(dynObj2); + dynamicsObjects.push_back(dynObj2); +#endif + setupUI(); loadRobot(robotFilename);