diff --git a/Examples/LaparoscopicCamera/main.cpp b/Examples/LaparoscopicCamera/main.cpp index 32c58c5482c6a17be83c11e9c7afe8dcb2950b48..80f89ccebc0690717e2cfbb95e946ee1d8e798a1 100644 --- a/Examples/LaparoscopicCamera/main.cpp +++ b/Examples/LaparoscopicCamera/main.cpp @@ -39,10 +39,13 @@ /// /// \brief Create camera navigation scene /// -bool createCameraNavigationScene(std::shared_ptr<SDK> sdk, char* fileName) +bool createCameraNavigationScene( + std::shared_ptr<SDK> sdk, + char* fileName, + char* fileNameTarget) { //------------------------------------------------------- - // Create scene actor 1: plane + // Create plane //------------------------------------------------------- auto staticSimulator = std::make_shared<DefaultSimulator>(sdk->getErrorLog()); @@ -57,49 +60,80 @@ bool createCameraNavigationScene(std::shared_ptr<SDK> sdk, char* fileName) auto planeRendDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS); - Color grey(0.32, 0.32, 0.32, 1.0); - - planeRendDetail->setAmbientColor(grey); - planeRendDetail->setDiffuseColor(grey); - planeRendDetail->setSpecularColor(grey); + planeRendDetail->setAmbientColor(Color(0.5, 0.5, 0.5, 1.0)); + planeRendDetail->setDiffuseColor(Color(0.5, 0.5, 0.5, 1.0)); + planeRendDetail->setSpecularColor(Color(0.4, 0.4, 0.4, 1.0)); planeRendDetail->setShininess(50.0); plane->getPlaneModel()->setRenderDetail(planeRendDetail); - sdk->addSceneActor(staticObject, staticSimulator); + sdk->getScene(0)->addSceneObject(staticObject); //------------------------------------------------------- - // Create targets + // Create target blocks //------------------------------------------------------- + + Color grey(0.32, 0.32, 0.32, 1.0); + auto meshRenderDetail = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS); - meshRenderDetail->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0)); - meshRenderDetail->setDiffuseColor(Color(0.8, 0.0, 0.0, 1.0)); - meshRenderDetail->setSpecularColor(Color(0.4, 0.4, 0.4, 1.0)); + meshRenderDetail->setAmbientColor(grey); + meshRenderDetail->setDiffuseColor(grey); + meshRenderDetail->setSpecularColor(grey); meshRenderDetail->setShininess(100.0); double radius = 3.0; for (int i = 0; i < 6; i++) { - auto staticSimulator2 = std::make_shared<DefaultSimulator>(sdk->getErrorLog()); + auto staticBlock = std::make_shared<StaticSceneObject>(); + auto targetBlock = std::make_shared<MeshCollisionModel>(); + targetBlock->loadTriangleMesh(fileName); + targetBlock->getMesh()->scale(Eigen::UniformScaling<double>(0.15));//0.2 + staticBlock->setModel(targetBlock); + + targetBlock->setRenderDetail(meshRenderDetail); + + sdk->getScene(0)->addSceneObject(staticBlock); + + targetBlock->getMesh()->translate(Eigen::Translation3d(0, 0, -radius)); + + Eigen::Quaterniond q(cos(i*22.0/42), 0, sin(i*22.0/42), 0); + q.normalize(); + targetBlock->getMesh()->rotate(q); + } + + //------------------------------------------------------- + // Create targets + //------------------------------------------------------- + auto meshRenderDetail2 = std::make_shared<RenderDetail>(SIMMEDTK_RENDER_NORMALS); + + meshRenderDetail2->setAmbientColor(Color(0.2, 0.2, 0.2, 1.0)); + meshRenderDetail2->setDiffuseColor(Color(0.8, 0.0, 0.0, 1.0)); + meshRenderDetail2->setSpecularColor(Color(0.4, 0.4, 0.4, 1.0)); + meshRenderDetail2->setShininess(100.0); + + for (int i = 0; i < 6; i++) + { auto staticTarget = std::make_shared<StaticSceneObject>(); auto targetModel = std::make_shared<MeshCollisionModel>(); - targetModel->loadTriangleMesh(fileName); + targetModel->loadTriangleMesh(fileNameTarget); + targetModel->getMesh()->scale(Eigen::UniformScaling<double>(0.1));//0.2 targetModel->getMesh()->scale(Eigen::UniformScaling<double>(0.15));//0.2 staticTarget->setModel(targetModel); - targetModel->setRenderDetail(meshRenderDetail); + targetModel->setRenderDetail(meshRenderDetail2); - sdk->addSceneActor(staticTarget, staticSimulator2); + sdk->getScene(0)->addSceneObject(staticTarget); targetModel->getMesh()->translate(Eigen::Translation3d(0, 0, -radius)); - Eigen::Quaterniond q(cos(i*22.0/42), 0, sin(i*22.0/42), 0); + Eigen::Quaterniond q(cos(i*22.0 / 42), 0, sin(i*22.0 / 42), 0); q.normalize(); targetModel->getMesh()->rotate(q); } + return true; } @@ -346,7 +380,7 @@ int main(int ac, char** av) auto sdk = SDK::createStandardSDK(); // Create camera navigation scene - createCameraNavigationScene(sdk, "./Target.vtk"); + createCameraNavigationScene(sdk, "./Target.vtk", "./Target-marker.vtk"); //------------------------------------------------------- // Set up the viewer @@ -379,8 +413,9 @@ int main(int ac, char** av) //------------------------------------------------------- - // add a camera controller - std::shared_ptr<LaparoscopicCameraController> camController = addCameraController(sdk); + // Add a camera controller + std::shared_ptr<LaparoscopicCameraController> camController = + addCameraController(sdk); // Enable screenshot capture camController->enableScreenCapture(); @@ -394,7 +429,7 @@ int main(int ac, char** av) // Run the SDK sdk->run(); - //cleanup + // Cleanup sdk->releaseScene(scene); return 0; diff --git a/VirtualTools/LaparoscopicCameraController.cpp b/VirtualTools/LaparoscopicCameraController.cpp index c026b52953823d2de26cf2dd0451df24f9ae0603..a17f1d075138f71ccdd921e77ac513ae494de5cd 100644 --- a/VirtualTools/LaparoscopicCameraController.cpp +++ b/VirtualTools/LaparoscopicCameraController.cpp @@ -68,12 +68,13 @@ void LaparoscopicCameraController::initializeCameraScopeConfiguration() this->bendingRadius = 1.0; // default bending radius angleX = 0.0; angleY = 0.0; - maxAngleX = maxAngleY = 11.0 / 7; //+ 90 deg + maxAngleX = maxAngleY = 11.0 / 7; // 90 deg minAngleX = minAngleY = -11.0 / 7; //- 90 deg deltaAngleXY = (4.0 / 360)*(22.0 / 7);// 2 deg } -void LaparoscopicCameraController::setInputDevice(std::shared_ptr<DeviceInterface> newDevice) +void LaparoscopicCameraController::setInputDevice( + std::shared_ptr<DeviceInterface> newDevice) { this->inputDevice = newDevice; } diff --git a/VirtualTools/LaparoscopicCameraController.h b/VirtualTools/LaparoscopicCameraController.h index a4a7bda82098c1951de088516bacca6c5180f8f9..9ba2560403d3bfa7f066b118d592de31b41920bb 100644 --- a/VirtualTools/LaparoscopicCameraController.h +++ b/VirtualTools/LaparoscopicCameraController.h @@ -74,6 +74,13 @@ struct screenShotData ~screenShotData(){}; }; +/// +/// \class LaparoscopicCameraController +/// +/// \brief This class enables the controll of the vtk camera using an external device +/// Additionally it allows for tip deflection just like you would see in some laparoscopic +/// camera scopes. +/// class LaparoscopicCameraController : public Module { public: @@ -234,7 +241,9 @@ public: void exec() override; private: - TransformType initialTransform; //!< Transform applied to the position obtained from device + TransformType initialTransform; //!< Transform applied to the position + // obtained from device + core::Quaterniond orientation; //!< Previous rotation quaternion from device core::Quaterniond prevOrientation; //!< Previous rotation quaternion from phantom