diff --git a/modules/viz/include/opencv2/viz/viz3d.hpp b/modules/viz/include/opencv2/viz/viz3d.hpp index db8819afd7..8fbaacd55a 100644 --- a/modules/viz/include/opencv2/viz/viz3d.hpp +++ b/modules/viz/include/opencv2/viz/viz3d.hpp @@ -38,6 +38,9 @@ namespace cv void setWidgetPose(const String &id, const Affine3f &pose); void updateWidgetPose(const String &id, const Affine3f &pose); Affine3f getWidgetPose(const String &id) const; + + Affine3f getViewerPose(); + void setViewerPose(const Affine3f &pose); void spin(); void spinOnce(int time = 1, bool force_redraw = false); diff --git a/modules/viz/src/viz3d.cpp b/modules/viz/src/viz3d.cpp index f4a300b212..6bf00172c1 100644 --- a/modules/viz/src/viz3d.cpp +++ b/modules/viz/src/viz3d.cpp @@ -45,3 +45,6 @@ cv::viz::Widget cv::viz::Viz3d::getWidget(const String &id) const { return impl_ void cv::viz::Viz3d::setWidgetPose(const String &id, const Affine3f &pose) { impl_->setWidgetPose(id, pose); } void cv::viz::Viz3d::updateWidgetPose(const String &id, const Affine3f &pose) { impl_->updateWidgetPose(id, pose); } cv::Affine3f cv::viz::Viz3d::getWidgetPose(const String &id) const { return impl_->getWidgetPose(id); } + +void cv::viz::Viz3d::setViewerPose(const Affine3f &pose) { impl_->setViewerPose(pose); } +cv::Affine3f cv::viz::Viz3d::getViewerPose() { return impl_->getViewerPose(); } diff --git a/modules/viz/src/viz3d_impl.cpp b/modules/viz/src/viz3d_impl.cpp index ca4b75bbf7..fb72047c5c 100644 --- a/modules/viz/src/viz3d_impl.cpp +++ b/modules/viz/src/viz3d_impl.cpp @@ -591,6 +591,28 @@ void cv::viz::Viz3d::VizImpl::getCameras (cv::viz::Camera& camera) camera.window_pos = cv::Vec2d::all(0); } +///////////////////////////////////////////////////////////////////////////////////////////// +void cv::viz::Viz3d::VizImpl::setViewerPose(const Affine3f &pose) +{ + vtkCamera& camera = *renderer_->GetActiveCamera (); + + // Position = extrinsic translation + cv::Vec3f pos_vec = pose.translation(); + + // Rotate the view vector + cv::Matx33f rotation = pose.rotation(); + cv::Vec3f y_axis (0.f, 1.f, 0.f); + cv::Vec3f up_vec (rotation * y_axis); + + // Compute the new focal point + cv::Vec3f z_axis (0.f, 0.f, 1.f); + cv::Vec3f focal_vec = pos_vec + rotation * z_axis; + + camera.SetPosition(pos_vec[0], pos_vec[1], pos_vec[2]); + camera.SetFocalPoint(focal_vec[0], focal_vec[1], focal_vec[2]); + camera.SetViewUp(up_vec[0], up_vec[1], up_vec[2]); +} + ///////////////////////////////////////////////////////////////////////////////////////////// cv::Affine3f cv::viz::Viz3d::VizImpl::getViewerPose () { diff --git a/modules/viz/src/viz3d_impl.hpp b/modules/viz/src/viz3d_impl.hpp index c6bef09885..704cf08a87 100644 --- a/modules/viz/src/viz3d_impl.hpp +++ b/modules/viz/src/viz3d_impl.hpp @@ -140,6 +140,7 @@ public: void getCameras (Camera& camera); //to implement Viz3d set/getViewerPose() + void setViewerPose(const Affine3f &pose); Affine3f getViewerPose();