[DEV] basic corect view
This commit is contained in:
parent
d6527d28ad
commit
ca3ead0c8c
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user