diff --git a/Base/Scene/Camera/imstkCamera.cpp b/Base/Scene/Camera/imstkCamera.cpp index e14191ba94da2fa4357dfcc67429807931d844a8..d52bfc242240ced972cd4e5375d312eee0bdbdde 100644 --- a/Base/Scene/Camera/imstkCamera.cpp +++ b/Base/Scene/Camera/imstkCamera.cpp @@ -105,7 +105,7 @@ Camera::getController() const return m_cameraController; } -std::shared_ptr<CameraController> +void Camera::setupController(std::shared_ptr<DeviceClient> deviceClient, double scaling) { if(m_cameraController == nullptr) @@ -114,17 +114,5 @@ Camera::setupController(std::shared_ptr<DeviceClient> deviceClient, double scali } m_cameraController->setDeviceClient(deviceClient); m_cameraController->setTranslationScaling(scaling); - m_cameraController->setTranslationOffset(m_position); - - auto viewNormal = (m_position - m_focalPoint).normalized(); - auto viewSide = m_viewUp.cross(viewNormal).normalized(); - m_viewUp = viewNormal.cross(viewSide); - Mat3d rot; - rot.col(0) = viewSide; - rot.col(1) = m_viewUp; - rot.col(2) = viewNormal; - m_cameraController->setRotationOffset(Quatd(rot)); - - return m_cameraController; } } diff --git a/Base/Scene/Camera/imstkCamera.h b/Base/Scene/Camera/imstkCamera.h index 9f95cebcc5310cfab11848e8d4eb4f08e5f6d84b..24286b52ac46e2f6ade6733b57315ae3f5b15f98 100644 --- a/Base/Scene/Camera/imstkCamera.h +++ b/Base/Scene/Camera/imstkCamera.h @@ -61,7 +61,7 @@ public: void setViewAngle(const double& angle); std::shared_ptr<CameraController> getController() const; - std::shared_ptr<CameraController> setupController(std::shared_ptr<DeviceClient> deviceClient, double scaling = 1.0); + void setupController(std::shared_ptr<DeviceClient> deviceClient, double scaling = 1.0); protected: diff --git a/Base/Scene/Controllers/imstkCameraController.cpp b/Base/Scene/Controllers/imstkCameraController.cpp index d994f79d2b85bbeafcd293728c9e371a0f577eb9..498d96ab162a8b4e57088e0bb9ff87e9cc196b2e 100644 --- a/Base/Scene/Controllers/imstkCameraController.cpp +++ b/Base/Scene/Controllers/imstkCameraController.cpp @@ -30,7 +30,20 @@ namespace imstk { void CameraController::initModule() { - + auto pos = m_camera.getPosition(); + auto viewUp = m_camera.getViewUp(); + auto focus = m_camera.getFocalPoint(); + + m_translationOffset = pos; + + auto viewNormal = (pos - focus).normalized(); + auto viewSide = viewUp.cross(viewNormal).normalized(); + viewUp = viewNormal.cross(viewSide); + Mat3d rot; + rot.col(0) = viewSide; + rot.col(1) = viewUp; + rot.col(2) = viewNormal; + m_rotationOffset = Quatd(rot); } void diff --git a/Base/Scene/Object/imstkVirtualCouplingObject.cpp b/Base/Scene/Object/imstkVirtualCouplingObject.cpp index 42c74c9f948251041afc3cdcdc7ced191af35f22..10f74892ca97c5891b1ec4a1aa35bb65349e1de9 100644 --- a/Base/Scene/Object/imstkVirtualCouplingObject.cpp +++ b/Base/Scene/Object/imstkVirtualCouplingObject.cpp @@ -30,6 +30,13 @@ namespace imstk { +void +VirtualCouplingObject::initOffsets() +{ + m_translationOffset = m_collidingGeometry->getPosition(); + m_rotationOffset = m_collidingGeometry->getOrientation(); +} + void VirtualCouplingObject::updateFromDevice() { diff --git a/Base/Scene/Object/imstkVirtualCouplingObject.h b/Base/Scene/Object/imstkVirtualCouplingObject.h index 6b09f152fc4ce7b760b2235d1a34da9236e061c8..4cffd0857af35caa30723d67a29599855090a4aa 100644 --- a/Base/Scene/Object/imstkVirtualCouplingObject.h +++ b/Base/Scene/Object/imstkVirtualCouplingObject.h @@ -45,6 +45,14 @@ public: ~VirtualCouplingObject() = default; + /// + /// \brief Initialise offset based on object geometry + /// + void initOffsets(); + + /// + /// \brief Update geometries transformations + /// void updateFromDevice(); }; diff --git a/Base/SimulationManager/imstkSceneManager.cpp b/Base/SimulationManager/imstkSceneManager.cpp index 8fcf18e0d9c50c2773cad1d8b9c2984697ef63a9..09c39d4792ebecb8b01f5dd43309019f32f3ba51 100644 --- a/Base/SimulationManager/imstkSceneManager.cpp +++ b/Base/SimulationManager/imstkSceneManager.cpp @@ -42,6 +42,15 @@ SceneManager::initModule() { this->startModuleInNewThread(camController); } + + // Init virtual coupling objects offsets + for (auto obj : m_scene->getSceneObjects()) + { + if (auto virtualCoupling = std::dynamic_pointer_cast<VirtualCouplingObject>(obj)) + { + virtualCoupling->initOffsets(); + } + } } void diff --git a/Examples/Sandbox/main.cpp b/Examples/Sandbox/main.cpp index d1af9b575c1395c175a9bdbde0b28fd2840b2e95..3edf3ed4a8db74bad8318b1ffb277c71c67065e8 100644 --- a/Examples/Sandbox/main.cpp +++ b/Examples/Sandbox/main.cpp @@ -91,12 +91,11 @@ void testObjectController() // Sphere auto sphereGeom = std::make_shared<imstk::Sphere>(); - sphereGeom->setPosition(imstk::UP_VECTOR); //does not matter, need to set offset on object if controlled + sphereGeom->setPosition(imstk::UP_VECTOR); sphereGeom->scale(0.2); auto sphereObj = std::make_shared<imstk::VirtualCouplingObject>("VirtualSphere", client, 20); sphereObj->setVisualGeometry(sphereGeom); sphereObj->setCollidingGeometry(sphereGeom); - sphereObj->setTranslationOffset(imstk::UP_VECTOR); // this will work though scene->addSceneObject(sphereObj); // Update Camera position @@ -135,9 +134,9 @@ void testCameraController() cam->setPosition(imstk::Vec3d(8,-8,8)); // Set camera controller - auto controller = cam->setupController(client, 100); - //LOG(INFO) << controller->getTranslationOffset(); // should be the same than initial cam position - //controller->setInversionFlags( (imstk::CameraController::InvertFlag::transX | imstk::CameraController::InvertFlag::transY) ); + cam->setupController(client, 100); + //LOG(INFO) << cam->getController()->getTranslationOffset(); // should be the same than initial cam position + //cam->getController()->setInversionFlags( (imstk::CameraController::InvertFlag::transX | imstk::CameraController::InvertFlag::transY) ); // Run sdk->setCurrentScene("SceneTestDevice");