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