From ca3ead0c8ce3c24b8e0be38bbad853383a695f8b Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sun, 9 Nov 2014 22:55:08 +0100 Subject: [PATCH] [DEV] basic corect view --- ege/camera/View.cpp | 32 ++++++++++++++++++++++++----- ege/camera/View.h | 18 ++++++++-------- sample/MeshCreator/appl/Windows.cpp | 13 +++++++++++- sample/MeshCreator/appl/Windows.h | 4 ++++ 4 files changed, 52 insertions(+), 15 deletions(-) diff --git a/ege/camera/View.cpp b/ege/camera/View.cpp index 64dc2fa..7a0ebd0 100644 --- a/ege/camera/View.cpp +++ b/ege/camera/View.cpp @@ -9,19 +9,41 @@ #include #include +#include #undef __class__ #define __class__ "camera::View" void ege::camera::View::update() { - m_matrix = etk::matLookAt(m_eye, m_target, m_up); + //m_matrix = etk::matLookAt(m_eye, m_target, m_up); //m_matrix.translate(m_eye); + m_matrix.identity(); + m_matrix.rotate(vec3(0,0,1), -m_angle); + vec3 pos = m_eye-m_target; + float distance = pos.length(); + float psy = std::asin(pos.z()/distance); + pos.setZ(0.0f); + pos.normalize(); + float tetha = std::asin(pos.y()); + if (pos.x() < 0) { + tetha *= -1; + tetha += M_PI; + } + m_matrix.translate(vec3(0,0,-distance)); + m_matrix.rotate(vec3(1,0,0), -M_PI*0.5f + psy); + m_matrix.rotate(vec3(0,0,1), tetha); + m_matrix.translate(m_target); + + EGE_DEBUG("Camera properties : distance=" << distance ); + EGE_DEBUG(" psy=" << psy); + EGE_DEBUG(" Tetha=" << tetha); + EGE_DEBUG(" m_eye=" << etk::to_string(m_eye)); } -ege::camera::View::View(const vec3& _eye, const vec3& _target, const vec3& _up) : +ege::camera::View::View(const vec3& _eye, const vec3& _target, float _angle) : m_eye(_eye), m_target(_target), - m_up(_up) { + m_angle(_angle) { update(); } @@ -35,8 +57,8 @@ void ege::camera::View::setTarget(const vec3& _target) { update(); } -void ege::camera::View::setUp(const vec3& _up) { - m_up = _up; +void ege::camera::View::setAngle(float _angle) { + m_angle = _angle; update(); } diff --git a/ege/camera/View.h b/ege/camera/View.h index f54da5c..93973ba 100644 --- a/ege/camera/View.h +++ b/ege/camera/View.h @@ -23,7 +23,7 @@ namespace ege { /** * @brief Constructor. */ - View(const vec3& _eye=vec3(0,0,0), const vec3& _target=vec3(0,0,1), const vec3& _up=vec3(1,0,0)); + View(const vec3& _eye=vec3(0,0,0), const vec3& _target=vec3(0,0,1), float _angle=0.0f); /** * @brief Destructor. */ @@ -59,19 +59,19 @@ namespace ege { return m_target; }; protected: - vec3 m_up; //!< rotation angle of the camera (in rad) through the axis origin->eye + float m_angle; //!< rotation angle of the camera (in rad) through the axis origin->eye public: /** - * @brief Set the up camera axis. - * @param[in] _up camera up axis. + * @brief Set the camera angle. + * @param[in] _angle camera angle. */ - void setUp(const vec3& _up); + void setAngle(float _angle); /** - * @brief Get the up camera axis. - * @return the up camera axis. + * @brief Get the camera angle. + * @return the up camera angle. */ - const vec3& getUp() const { - return m_up; + float getAngle() const { + return m_angle; }; protected: virtual vec3 getViewVector() const; diff --git a/sample/MeshCreator/appl/Windows.cpp b/sample/MeshCreator/appl/Windows.cpp index 1cdf6cf..4af00cd 100644 --- a/sample/MeshCreator/appl/Windows.cpp +++ b/sample/MeshCreator/appl/Windows.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -71,9 +72,12 @@ void appl::Windows::init() { ewol::widget::Windows::init(); setTitle("example ege : MeshCreator"); + getObjectManager().periodicCall.bind(shared_from_this(), &appl::Windows::onCallbackPeriodicUpdateCamera); + m_env = ege::Environement::create(); // Create basic Camera - m_env->addCamera("basic", std::make_shared(vec3(30,30,-100), vec3(0,0,0))); + m_camera = std::make_shared(vec3(30,30,-100), vec3(50,0,0)); + m_env->addCamera("basic", m_camera); std::shared_ptr tmpWidget = ege::widget::Scene::create(m_env); if (tmpWidget == nullptr) { @@ -139,3 +143,10 @@ void appl::Windows::init() { } +void appl::Windows::onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event) { + static float offset = 0; + offset += 0.01; + m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40)); +} + + diff --git a/sample/MeshCreator/appl/Windows.h b/sample/MeshCreator/appl/Windows.h index 68622c4..2e1c631 100644 --- a/sample/MeshCreator/appl/Windows.h +++ b/sample/MeshCreator/appl/Windows.h @@ -11,17 +11,21 @@ #include #include +#include namespace appl { class Windows : public ewol::widget::Windows { private: std::shared_ptr m_env; + std::shared_ptr m_camera; protected: Windows(); void init(); public: DECLARE_FACTORY(Windows); virtual ~Windows() { }; + private: + void onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event); }; };