diff --git a/ege/Ray.cpp b/ege/Ray.cpp index f516784..9d464d1 100644 --- a/ege/Ray.cpp +++ b/ege/Ray.cpp @@ -41,7 +41,7 @@ std::ostream& ege::operator <<(std::ostream& _os, const ege::Ray& _obj) { return _os; } -void ege::Ray::testRay(ege::physics::Engine& _engine) { +std::pair ege::Ray::testRay(ege::physics::Engine& _engine) { vec3 start = m_origin; vec3 stop = m_origin+m_direction*1000.0f; // Start and End are vectors @@ -53,8 +53,9 @@ void ege::Ray::testRay(ege::physics::Engine& _engine) { vec3 end = rayCallback.m_hitPointWorld; vec3 normal = rayCallback.m_hitNormalWorld; EGE_ERROR(" hit at point=" << end << " normal=" << normal); - } else { - EGE_ERROR(" No Hit"); + return std::pair(end,normal); } + EGE_ERROR(" No Hit"); + return std::pair(vec3(0,0,0),vec3(0,0,0)); } diff --git a/ege/Ray.h b/ege/Ray.h index 200052b..011749d 100644 --- a/ege/Ray.h +++ b/ege/Ray.h @@ -66,7 +66,7 @@ namespace ege { */ void set(const vec3& _origin, const vec3& _direction); public: - void testRay(ege::physics::Engine& _engine); + std::pair testRay(ege::physics::Engine& _engine); }; std::ostream& operator <<(std::ostream& _os, const ege::Ray& _obj); }; diff --git a/ege/camera/Camera.cpp b/ege/camera/Camera.cpp index 79e6cbb..5b95854 100644 --- a/ege/camera/Camera.cpp +++ b/ege/camera/Camera.cpp @@ -77,3 +77,21 @@ ege::Ray ege::Camera::getRayFromScreenPosition(const vec2& _position, const vec2 return getRayFromScreen(_position/half - vec2(1,1)); } +vec2 ege::Camera::tansformPositionToAngle(vec3 _vect) { + vec2 out(0.0f, 0.0f); + float distance = _vect.length(); + if (distance == 0.0f) { + return out; + } + out.setY(std::asin(_vect.z()/distance)); + _vect.setZ(0.0f); + if (_vect.x() == 0 && _vect.y() == 0) { + return out; + } + _vect.normalize(); + out.setX(std::asin(_vect.y())); + if (_vect.x() < 0) { + out.setX(out.x()*-1 - M_PI); + } + return out; +} \ No newline at end of file diff --git a/ege/camera/Camera.h b/ege/camera/Camera.h index b42f982..bb68d72 100644 --- a/ege/camera/Camera.h +++ b/ege/camera/Camera.h @@ -159,6 +159,14 @@ namespace ege { * @return the ray requested. */ ege::Ray getRayFromScreenPosition(const vec2& _position, const vec2& _size); + protected: + /** + * @brief get Tetha and psy angle from a position: + * @param[in] _vect Vector to transform in the euler angle + * @return x: tetha; y: psy + */ + vec2 tansformPositionToAngle(vec3 _vect); + }; }; diff --git a/ege/camera/View.cpp b/ege/camera/View.cpp index f403312..95f9bd1 100644 --- a/ege/camera/View.cpp +++ b/ege/camera/View.cpp @@ -19,24 +19,18 @@ void ege::camera::View::update() { //m_matrix.translate(m_eye); m_matrix.identity(); m_matrix.rotate(vec3(0,0,1), -m_angle); - vec3 pos = m_eye-m_target; + vec3 pos = -getViewVector(); + vec2 angles = tansformPositionToAngle(pos); 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_PI/2.0f); + m_matrix.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y()); + m_matrix.rotate(vec3(0,0,1), -angles.x()-M_PI/2.0f); m_matrix.translate(-m_target); EGE_DEBUG("Camera properties : distance=" << distance ); - EGE_DEBUG(" psy=" << psy); - EGE_DEBUG(" Tetha=" << tetha); + EGE_DEBUG(" psy=" << angles.y()); + EGE_DEBUG(" Tetha=" << angles.x()); EGE_DEBUG(" m_eye=" << etk::to_string(m_eye)); } @@ -70,33 +64,26 @@ vec3 ege::camera::View::getViewVector() const { ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) { 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 + // It is not the best way to create the ray but it work . (My knowlege is not enought now ...) + mat4 inverse = m_matrix.invert(); + vec3 screenOffset(0,0,-1); + screenOffset = screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.x()); + screenOffset = screenOffset.rotate(vec3(1,0,0), -cameraAngleOffset.y()); + vec2 angles = tansformPositionToAngle(-getViewVector()); + screenOffset = screenOffset.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y()); + screenOffset = screenOffset.rotate(vec3(0,0,1), angles.x() - M_PI/2.0f); + vec3 direction = screenOffset; #else - vec3 direction = getViewVector(); - direction = direction.rotate(vec3(1,0,0), cameraAngleOffset.x()); - direction = direction.rotate(vec3(0,1,0), cameraAngleOffset.y()); + // lA PROJECTION TOURNE EN FONCTION DE L'ANGLE + 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 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... + EGE_VERBOSE("return ray : " << out); return out; } diff --git a/sample/RayTest/appl/Windows.cpp b/sample/RayTest/appl/Windows.cpp index 974e7e7..af94699 100644 --- a/sample/RayTest/appl/Windows.cpp +++ b/sample/RayTest/appl/Windows.cpp @@ -157,7 +157,7 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size); m_ray = ray; APPL_INFO("pos=" << pos << " ray = " << ray); - ray.testRay(m_env->getPhysicEngine()); + m_destination = ray.testRay(m_env->getPhysicEngine()); return true; } else if (_event.getId() == 4) { ploppp += 0.2f; @@ -186,7 +186,9 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr& _obj) { etk::Color tmpColor(0.0, 1.0, 0.0, 0.3); + etk::Color tmpColor2(1.0, 0.0, 0.0, 0.3); static std::vector vertices; + static std::vector vertices2; //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); @@ -197,9 +199,21 @@ void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr 50) { + vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-50); + } + if (m_destination.second != vec3(0,0,0)) { + vertices2.push_back(m_destination.first); + vertices2.push_back(m_destination.first + m_destination.second*100); + m_destination.second = vec3(0,0,0); + } + if (vertices2.size() > 50) { + vertices2.erase(vertices2.begin(), vertices2.begin()+vertices2.size()-50); + } mat4 mat; mat.identity(); mat.translate(vec3(0,0,0)); _obj->drawLine(vertices, tmpColor, mat); + _obj->drawLine(vertices2, tmpColor2, mat); } diff --git a/sample/RayTest/appl/Windows.h b/sample/RayTest/appl/Windows.h index 32d110c..b4fe862 100644 --- a/sample/RayTest/appl/Windows.h +++ b/sample/RayTest/appl/Windows.h @@ -33,6 +33,7 @@ namespace appl { float m_angleTetha; float m_anglePsy; vec2 m_oldScreenPos; + std::pair m_destination; }; };