diff --git a/applications/gui/src/main.cpp b/applications/gui/src/main.cpp index c93f64381b9fefb968e1f2424813afd4b01e45d4..2f71531d15da62d1c0cb7b758cd18c259d2632d6 100644 --- a/applications/gui/src/main.cpp +++ b/applications/gui/src/main.cpp @@ -219,6 +219,17 @@ namespace { } +static Eigen::Affine3f create_rotation_matrix(float ax, float ay, float az) { + Eigen::Affine3f rx = + Eigen::Affine3f(Eigen::AngleAxisf(ax, Eigen::Vector3f(1, 0, 0))); + Eigen::Affine3f ry = + Eigen::Affine3f(Eigen::AngleAxisf(ay, Eigen::Vector3f(0, 1, 0))); + Eigen::Affine3f rz = + Eigen::Affine3f(Eigen::AngleAxisf(az, Eigen::Vector3f(0, 0, 1))); + return ry * rz * rx; +} + + class FTLApplication : public nanogui::Screen { public: explicit FTLApplication(ftl::Configurable *root, ftl::net::Universe *net, ftl::ctrl::Master *controller) : nanogui::Screen(Eigen::Vector2i(1024, 768), "FT-Lab GUI") { @@ -230,9 +241,9 @@ class FTLApplication : public nanogui::Screen { //src_ = nullptr; eye_ = Eigen::Vector3f(0.0f, 0.0f, 0.0f); - centre_ = Eigen::Vector3f(0.0f, 0.0f, -4.0f); + orientation_ = Eigen::Vector3f(0.0f, 0.0f, 0.0f); up_ = Eigen::Vector3f(0,1.0f,0); - lookPoint_ = Eigen::Vector3f(0.0f,0.0f,-4.0f); + //lookPoint_ = Eigen::Vector3f(0.0f,0.0f,-4.0f); lerpSpeed_ = 0.4f; depth_ = false; ftime_ = (float)glfwGetTime(); @@ -262,6 +273,18 @@ class FTLApplication : public nanogui::Screen { mShader.free(); } + bool mouseMotionEvent(const Eigen::Vector2i &p, const Eigen::Vector2i &rel, int button, int modifiers) { + if (Screen::mouseMotionEvent(p, rel, button, modifiers)) { + return true; + } else { + if (button == 1) { + orientation_[0] += ((float)rel[1] * 0.2f * delta_); + //orientation_[2] += std::cos(orientation_[1])*((float)rel[1] * 0.2f * delta_); + orientation_[1] -= (float)rel[0] * 0.2f * delta_; + } + } + } + bool mouseButtonEvent(const nanogui::Vector2i &p, int button, bool down, int modifiers) { if (Screen::mouseButtonEvent(p, button, down, modifiers)) { return true; @@ -288,7 +311,7 @@ class FTLApplication : public nanogui::Screen { camPos *= -1.0f; Eigen::Vector4f worldPos = src_->getPose() * camPos; - lookPoint_ = Eigen::Vector3f(worldPos[0],worldPos[1],worldPos[2]); + //lookPoint_ = Eigen::Vector3f(worldPos[0],worldPos[1],worldPos[2]); LOG(INFO) << "Depth at click = " << -camPos[2]; return true; } @@ -297,18 +320,34 @@ class FTLApplication : public nanogui::Screen { } bool keyboardEvent(int key, int scancode, int action, int modifiers) { + using namespace Eigen; if (Screen::keyboardEvent(key, scancode, action, modifiers)) { return true; } else { LOG(INFO) << "Key press " << key << " - " << action; if (key == 263 || key == 262) { - // TODO Should rotate around lookAt object, but requires correct depth - Eigen::Quaternion<float> q; q = Eigen::AngleAxis<float>((key == 262) ? 0.01f : -0.01f, up_); - eye_ = (q * (eye_ - centre_)) + centre_; + float scalar = (key == 263) ? -0.1f : 0.1f; + Eigen::Affine3f r = create_rotation_matrix(orientation_[0], orientation_[1], orientation_[2]); + Vector4f neye = r.matrix()*Vector4f(scalar,0.0,0.0,1.0); + eye_[0] += neye[0]; + eye_[1] += neye[1]; + eye_[2] += neye[2]; return true; } else if (key == 264 || key == 265) { - float scalar = (key == 264) ? 0.99f : 1.01f; - eye_ = ((eye_ - centre_) * scalar) + centre_; + float scalar = (key == 264) ? -0.1f : 0.1f; + Eigen::Affine3f r = create_rotation_matrix(orientation_[0], orientation_[1], orientation_[2]); + Vector4f neye = r.matrix()*Vector4f(0.0,0.0,scalar,1.0); + eye_[0] += neye[0]; + eye_[1] += neye[1]; + eye_[2] += neye[2]; + return true; + } else if (key == 266 || key == 267) { + float scalar = (key == 266) ? -0.1f : 0.1f; + Eigen::Affine3f r = create_rotation_matrix(orientation_[0], orientation_[1], orientation_[2]); + Vector4f neye = r.matrix()*Vector4f(0.0,scalar,0.0,1.0); + eye_[0] += neye[0]; + eye_[1] += neye[1]; + eye_[2] += neye[2]; return true; } else if (action == 1 && key == 'H') { swindow_->setVisible(!swindow_->visible()); @@ -327,13 +366,21 @@ class FTLApplication : public nanogui::Screen { imageSize = {0, 0}; float now = (float)glfwGetTime(); - float delta = now - ftime_; + delta_ = now - ftime_; ftime_ = now; if (src_) { cv::Mat rgb, depth; - centre_ += (lookPoint_ - centre_) * (lerpSpeed_ * delta); - Eigen::Matrix4f viewPose = lookAt<float>(eye_,centre_,up_).inverse(); + //centre_ += (lookPoint_ - centre_) * (lerpSpeed_ * delta); + //Eigen::Matrix4f viewPose = lookAt<float>(eye_,centre_,up_).inverse(); + + Eigen::Affine3f r = create_rotation_matrix(orientation_[0], orientation_[1], orientation_[2]); + Eigen::Translation3f trans(eye_); + Eigen::Affine3f t(trans); + Eigen::Matrix4f viewPose = (t * r).matrix(); + + //Eigen::Matrix4f viewPose = t.matrix(); + //viewPose *= r.matrix(); src_->setPose(viewPose); src_->grab(); @@ -416,12 +463,13 @@ class FTLApplication : public nanogui::Screen { //Source *src_; GLTexture texture_; Eigen::Vector3f eye_; - Eigen::Vector3f centre_; + Eigen::Vector3f orientation_; Eigen::Vector3f up_; - Eigen::Vector3f lookPoint_; + //Eigen::Vector3f lookPoint_; float lerpSpeed_; bool depth_; float ftime_; + float delta_; Eigen::Vector2f imageSize; };