[DEV] basic corect view

This commit is contained in:
Edouard DUPIN 2014-11-09 22:55:08 +01:00
parent d6527d28ad
commit ca3ead0c8c
4 changed files with 52 additions and 15 deletions

View File

@ -9,19 +9,41 @@
#include <ege/camera/View.h> #include <ege/camera/View.h>
#include <ege/debug.h> #include <ege/debug.h>
#include <etk/math/Vector3D.h>
#undef __class__ #undef __class__
#define __class__ "camera::View" #define __class__ "camera::View"
void ege::camera::View::update() { 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.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_eye(_eye),
m_target(_target), m_target(_target),
m_up(_up) { m_angle(_angle) {
update(); update();
} }
@ -35,8 +57,8 @@ void ege::camera::View::setTarget(const vec3& _target) {
update(); update();
} }
void ege::camera::View::setUp(const vec3& _up) { void ege::camera::View::setAngle(float _angle) {
m_up = _up; m_angle = _angle;
update(); update();
} }

View File

@ -23,7 +23,7 @@ namespace ege {
/** /**
* @brief Constructor. * @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. * @brief Destructor.
*/ */
@ -59,19 +59,19 @@ namespace ege {
return m_target; return m_target;
}; };
protected: 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: public:
/** /**
* @brief Set the up camera axis. * @brief Set the camera angle.
* @param[in] _up camera up axis. * @param[in] _angle camera angle.
*/ */
void setUp(const vec3& _up); void setAngle(float _angle);
/** /**
* @brief Get the up camera axis. * @brief Get the camera angle.
* @return the up camera axis. * @return the up camera angle.
*/ */
const vec3& getUp() const { float getAngle() const {
return m_up; return m_angle;
}; };
protected: protected:
virtual vec3 getViewVector() const; virtual vec3 getViewVector() const;

View File

@ -10,6 +10,7 @@
#include <appl/debug.h> #include <appl/debug.h>
#include <appl/Windows.h> #include <appl/Windows.h>
#include <ewol/widget/Label.h> #include <ewol/widget/Label.h>
#include <ewol/object/Manager.h>
#include <ege/widget/Scene.h> #include <ege/widget/Scene.h>
#include <ege/camera/View.h> #include <ege/camera/View.h>
#include <etk/tool.h> #include <etk/tool.h>
@ -71,9 +72,12 @@ void appl::Windows::init() {
ewol::widget::Windows::init(); ewol::widget::Windows::init();
setTitle("example ege : MeshCreator"); setTitle("example ege : MeshCreator");
getObjectManager().periodicCall.bind(shared_from_this(), &appl::Windows::onCallbackPeriodicUpdateCamera);
m_env = ege::Environement::create(); m_env = ege::Environement::create();
// Create basic Camera // Create basic Camera
m_env->addCamera("basic", std::make_shared<ege::camera::View>(vec3(30,30,-100), vec3(0,0,0))); m_camera = std::make_shared<ege::camera::View>(vec3(30,30,-100), vec3(50,0,0));
m_env->addCamera("basic", m_camera);
std::shared_ptr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create(m_env); std::shared_ptr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create(m_env);
if (tmpWidget == nullptr) { 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));
}

View File

@ -11,17 +11,21 @@
#include <ewol/widget/Windows.h> #include <ewol/widget/Windows.h>
#include <ege/Environement.h> #include <ege/Environement.h>
#include <ege/camera/View.h>
namespace appl { namespace appl {
class Windows : public ewol::widget::Windows { class Windows : public ewol::widget::Windows {
private: private:
std::shared_ptr<ege::Environement> m_env; std::shared_ptr<ege::Environement> m_env;
std::shared_ptr<ege::camera::View> m_camera;
protected: protected:
Windows(); Windows();
void init(); void init();
public: public:
DECLARE_FACTORY(Windows); DECLARE_FACTORY(Windows);
virtual ~Windows() { }; virtual ~Windows() { };
private:
void onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event);
}; };
}; };