From 75b31da54f9d9af0493550a0bb7b4a6f416f52ba Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 26 Nov 2014 15:06:43 +0100 Subject: [PATCH] [DEV] try to set ray work --- ege/camera/View.cpp | 24 +++++++++++++++++++----- sample/RayTest/appl/Windows.cpp | 24 ++++++++++++++++++------ 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/ege/camera/View.cpp b/ege/camera/View.cpp index 0bd572a..3b10bbd 100644 --- a/ege/camera/View.cpp +++ b/ege/camera/View.cpp @@ -27,11 +27,11 @@ void ege::camera::View::update() { float tetha = std::asin(pos.y()); if (pos.x() < 0) { tetha *= -1; - tetha += M_PI; + 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.rotate(vec3(0,0,1), -tetha-M_PI/2.0f); m_matrix.translate(-m_target); EGE_DEBUG("Camera properties : distance=" << distance ); @@ -63,16 +63,30 @@ void ege::camera::View::setAngle(float _angle) { } vec3 ege::camera::View::getViewVector() const { - return m_eye-m_target; + return m_target - m_eye; } ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) { - vec3 direction = getViewVector(); + vec2 cameraAngleOffset(m_angleView/2*_offset.x(), 2*_offset.y()*m_aspectRatio/m_angleView); + #if 0 + mat4 inverse = m_matrix.invert(); + vec3 screenOffset(0,0,-1); + screenOffset.rotate(vec3(1,0,0), cameraAngleOffset.x()); + screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.y()); + vec3 direction = inverse*screenOffset; + #else + vec3 direction = getViewVector(); + //mat4 transformation; + //transformation.indentity(); + //transformation.rotate(vec3(1,0,0), cameraAngleOffset.x()); + direction.rotate(vec3(1,0,0), cameraAngleOffset.x()); + direction.rotate(vec3(0,1,0), cameraAngleOffset.y()); + #endif direction.safeNormalize(); ege::Ray out(m_eye, direction); EGE_WARNING("request ray from : " << _offset); - EGE_WARNING(" camera offset = " << vec2(m_angleView/2*_offset.x(), 2*_offset.y()*m_aspectRatio/m_angleView)); + EGE_WARNING(" camera offset = " << cameraAngleOffset); EGE_WARNING("return ray : " << out); // TODO : Use offset... diff --git a/sample/RayTest/appl/Windows.cpp b/sample/RayTest/appl/Windows.cpp index 091abd1..9e9e37c 100644 --- a/sample/RayTest/appl/Windows.cpp +++ b/sample/RayTest/appl/Windows.cpp @@ -72,6 +72,7 @@ void appl::Windows::init() { m_env = ege::Environement::create(); // Create basic Camera m_camera = std::make_shared(vec3(30,30,-100), vec3(0,0,0)); + m_camera->setEye(vec3(100*std::sin(0),100*std::cos(0),40*std::cos(0))); m_env->addCamera("basic", m_camera); std::shared_ptr tmpWidget = ege::widget::Scene::create(m_env); @@ -142,12 +143,13 @@ void appl::Windows::onCallbackPeriodicUpdateCamera(const ewol::event::Time& _eve offset += 0.01; static float offset2 = 0; //offset2 += 0.003; - m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40*std::cos(offset2))); + //m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40*std::cos(offset2))); } bool appl::Windows::onEventInput(const ewol::event::Input& _event) { + static float ploppp=1; if (_event.getId() == 1) { vec2 pos = relativePosition(_event.getPos()); ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size); @@ -155,20 +157,30 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { APPL_INFO("pos=" << pos << " ray = " << ray); ray.testRay(m_env->getPhysicEngine()); return true; + } else if (_event.getId() == 4) { + ploppp += 1.0f; + m_camera->setEye(vec3(100*std::sin(0),100*std::cos(0),40*std::cos(0))*ploppp); + } else if (_event.getId() == 5) { + ploppp -= 1.0f; + if (ploppp == 0) { + ploppp = 1.0f; + } + m_camera->setEye(vec3(100*std::sin(0),100*std::cos(0),40*std::cos(0))*ploppp); } return false; } void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr& _obj) { - EWOL_INFO("draw user debug"); etk::Color tmpColor(0.0, 1.0, 0.0, 0.3); std::vector vertices; - vertices.push_back(m_ray.getOrigin()); - vertices.push_back(m_ray.getOrigin() + m_ray.getDirection()*1000); - vertices.push_back(vec3(10,0,0)); + //vertices.push_back(m_ray.getOrigin()+vec3(1,0,0)); + //vertices.push_back(vec3(100,0,0));//m_ray.getOrigin() + m_ray.getDirection()*1000); + //vertices.push_back(m_ray.getOrigin() + m_ray.getDirection()*1000); + vertices.push_back(vec3(0,0,0)); + vertices.push_back(m_ray.getDirection()*1000); mat4 mat; mat.identity(); mat.translate(vec3(0,0,0)); - _obj->draw(vertices, tmpColor, mat); + _obj->drawLine(vertices, tmpColor, mat); }