From ed1d46a358c5b1863d105b5394702516a7984ab5 Mon Sep 17 00:00:00 2001
From: vahrenkamp <vahrenkamp@042f3d55-54a8-47e9-b7fb-15903f145c44>
Date: Wed, 30 Apr 2014 12:34:42 +0000
Subject: [PATCH] Fixed setPose for dynamics objects

git-svn-id: http://svn.code.sf.net/p/simox/code/trunk@565 042f3d55-54a8-47e9-b7fb-15903f145c44
---
 .../DynamicsEngine/BulletEngine/BulletObject.cpp       | 10 ++++++++--
 .../examples/SimDynamicsViewer/simDynamicsWindow.cpp   |  2 +-
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
index d4c708bcc..92c92045d 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
@@ -181,8 +181,14 @@ void BulletObject::setPosition( const Eigen::Vector3f &posMM )
 
 void BulletObject::setPoseIntern( const Eigen::Matrix4f &pose )
 {
-    // notify motionState
-    motionState->setGlobalPose(pose);
+    /* convert to local coord system, apply comoffset and convert back*/
+    Eigen::Matrix4f poseLocal = sceneObject->getGlobalPose().inverse() * pose;
+    poseLocal.block(0, 3, 3, 1) += com;
+    Eigen::Matrix4f poseGlobal = sceneObject->getGlobalPose() * poseLocal;
+    this->rigidBody->setWorldTransform(BulletEngine::getPoseBullet(poseGlobal));
+
+    // notify motionState -> not needed, automatically done
+    //motionState->setGlobalPose(pose);
 }
 
 void BulletObject::setPose( const Eigen::Matrix4f &pose )
diff --git a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
index 6858a1761..c6623f99c 100644
--- a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
+++ b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
@@ -63,7 +63,7 @@ SimDynamicsWindow::SimDynamicsWindow(std::string &sRobotFilename, Qt::WFlags fla
     o->setMass(1.0f); // 1kg
 
 	dynamicsObject = dynamicsWorld->CreateDynamicsObject(o);
-    dynamicsObject->setPosition(Eigen::Vector3f(3000,3000,10000.0f));
+    dynamicsObject->setPosition(Eigen::Vector3f(1000,2000,1000.0f));
 	dynamicsWorld->addObject(dynamicsObject);
 
 #if 0
-- 
GitLab