[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/debug.h>
#include <etk/math/Vector3D.h>
#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();
}

View File

@ -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;

View File

@ -10,6 +10,7 @@
#include <appl/debug.h>
#include <appl/Windows.h>
#include <ewol/widget/Label.h>
#include <ewol/object/Manager.h>
#include <ege/widget/Scene.h>
#include <ege/camera/View.h>
#include <etk/tool.h>
@ -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<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);
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 <ege/Environement.h>
#include <ege/camera/View.h>
namespace appl {
class Windows : public ewol::widget::Windows {
private:
std::shared_ptr<ege::Environement> m_env;
std::shared_ptr<ege::camera::View> m_camera;
protected:
Windows();
void init();
public:
DECLARE_FACTORY(Windows);
virtual ~Windows() { };
private:
void onCallbackPeriodicUpdateCamera(const ewol::event::Time& _event);
};
};