From 8ec1d2833cbacba4ea4dec7819017a0e0a3a06f3 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Thu, 27 Nov 2014 21:13:51 +0100 Subject: [PATCH] [DEV] try to have a good ray tracing --- ege/camera/View.cpp | 32 +++++++++++++++++---------- sample/RayTest/appl/Windows.cpp | 39 ++++++++++++++++++++++++--------- sample/RayTest/appl/Windows.h | 3 +++ 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/ege/camera/View.cpp b/ege/camera/View.cpp index 3b10bbd..f403312 100644 --- a/ege/camera/View.cpp +++ b/ege/camera/View.cpp @@ -68,25 +68,33 @@ vec3 ege::camera::View::getViewVector() const { ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) { - 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; + vec2 cameraAngleOffset(m_angleView*0.5f*_offset.x(), _offset.y()*0.5f*m_angleView/m_aspectRatio); + #if 1 + #if 1 + mat4 inverse = m_matrix.invert(); + vec3 screenOffset(0,0,-1); + screenOffset = getViewVector(); + screenOffset = screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.x()); + screenOffset = screenOffset.rotate(vec3(1,0,0), cameraAngleOffset.y()); + vec3 direction = screenOffset; + #else + mat4 inverse = m_matrix.invert(); + vec3 screenOffset(0,0,-1); + //screenOffset = getViewVector(); + screenOffset = screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.x()); + screenOffset = screenOffset.rotate(vec3(1,0,0), cameraAngleOffset.y()); + vec3 direction = inverse*screenOffset; + #endif #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()); + direction = direction.rotate(vec3(1,0,0), cameraAngleOffset.x()); + direction = 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 = " << cameraAngleOffset); + EGE_WARNING(" angle view x=" << m_angleView << " y=" << m_angleView/m_aspectRatio); EGE_WARNING("return ray : " << out); // TODO : Use offset... diff --git a/sample/RayTest/appl/Windows.cpp b/sample/RayTest/appl/Windows.cpp index 9e9e37c..974e7e7 100644 --- a/sample/RayTest/appl/Windows.cpp +++ b/sample/RayTest/appl/Windows.cpp @@ -22,7 +22,9 @@ #undef __class__ #define __class__ "Windows" -appl::Windows::Windows() { +appl::Windows::Windows() : + m_angleTetha(0), + m_anglePsy(0) { addObjectType("appl::Windows"); } @@ -72,7 +74,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_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))); m_env->addCamera("basic", m_camera); std::shared_ptr tmpWidget = ege::widget::Scene::create(m_env); @@ -158,26 +160,43 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { 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); + ploppp += 0.2f; + m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); } else if (_event.getId() == 5) { - ploppp -= 1.0f; + ploppp -= 0.2f; if (ploppp == 0) { ploppp = 1.0f; } - m_camera->setEye(vec3(100*std::sin(0),100*std::cos(0),40*std::cos(0))*ploppp); + m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); + } else if (_event.getId() == 3) { + if (_event.getStatus() == ewol::key::statusDown) { + m_oldScreenPos = relativePosition(_event.getPos()); + return true; + } else if (_event.getStatus() == ewol::key::statusMove) { + vec2 pos = relativePosition(_event.getPos()); + m_angleTetha -= (m_oldScreenPos.x()-pos.x())*0.05f; + m_anglePsy += (m_oldScreenPos.y()-pos.y())*0.05f; + m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); + m_oldScreenPos = relativePosition(_event.getPos()); + return true; + } } return false; } void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr& _obj) { etk::Color tmpColor(0.0, 1.0, 0.0, 0.3); - std::vector vertices; - //vertices.push_back(m_ray.getOrigin()+vec3(1,0,0)); + static std::vector vertices; + //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); + #if 0 + vertices.push_back(vec3(0,0,0)); + vertices.push_back(m_ray.getDirection()*50); + #else + vertices.push_back(m_ray.getOrigin()); + vertices.push_back(m_ray.getOrigin()+m_ray.getDirection()*100); + #endif mat4 mat; mat.identity(); mat.translate(vec3(0,0,0)); diff --git a/sample/RayTest/appl/Windows.h b/sample/RayTest/appl/Windows.h index ad5c3c5..32d110c 100644 --- a/sample/RayTest/appl/Windows.h +++ b/sample/RayTest/appl/Windows.h @@ -30,6 +30,9 @@ namespace appl { bool onEventInput(const ewol::event::Input& _event); void onCallbackDisplayDebug(const std::shared_ptr& _obj); ege::Ray m_ray; + float m_angleTetha; + float m_anglePsy; + vec2 m_oldScreenPos; }; };