From 8cbe9d1a80b5db39a956fccd42a898b7c33e89d0 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 24 May 2017 00:24:01 +0000 Subject: [PATCH] [DEV] set Y as up vector ==> more common and correct the raytacing exemple --- ege/camera/Camera.cpp | 8 +- ege/camera/View.cpp | 27 +++--- ege/widget/Scene.cpp | 1 + sample/Collision/appl/Windows.cpp | 14 --- sample/RayTest/appl/Windows.cpp | 87 +++++++++++++------ sample/RayTest/appl/Windows.hpp | 3 +- sample/RayTest/lutin_ege-sample-raytracing.py | 2 +- 7 files changed, 84 insertions(+), 58 deletions(-) diff --git a/ege/camera/Camera.cpp b/ege/camera/Camera.cpp index c5d40a4..172e937 100644 --- a/ege/camera/Camera.cpp +++ b/ege/camera/Camera.cpp @@ -79,13 +79,13 @@ vec2 ege::Camera::tansformPositionToAngle(vec3 _vect) { if (distance == 0.0f) { return out; } - out.setY(std::asin(_vect.z()/distance)); - _vect.setZ(0.0f); - if (_vect.x() == 0 && _vect.y() == 0) { + out.setY(std::asin(_vect.y()/distance)); + _vect.setY(0.0f); + if (_vect.x() == 0 && _vect.z() == 0) { return out; } _vect.normalize(); - out.setX(std::asin(_vect.y())); + out.setX(std::asin(_vect.z())); if (_vect.x() < 0) { out.setX(out.x()*-1 - M_PI); } diff --git a/ege/camera/View.cpp b/ege/camera/View.cpp index c8a3161..692f8f9 100644 --- a/ege/camera/View.cpp +++ b/ege/camera/View.cpp @@ -11,23 +11,29 @@ #include void ege::camera::View::update() { - //m_matrix = etk::matLookAt(m_eye, m_target, m_up); + /* + vec3 m_up(0,1,0); + m_matrix = etk::matLookAt(m_eye, m_target, m_up); + //m_matrix.transpose(); //m_matrix.translate(m_eye); + */ + // The camera view to the-z axis ... m_matrix.identity(); + // basic camera rotation m_matrix.rotate(vec3(0,0,1), -m_angle); + vec3 pos = -getViewVector(); vec2 angles = tansformPositionToAngle(pos); float distance = pos.length(); m_matrix.translate(vec3(0,0,-distance)); - 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.rotate(vec3(1,0,0), angles.y()); + m_matrix.rotate(vec3(0,1,0), angles.x()-M_PI/2.0f); m_matrix.translate(-m_target); - EGE_DEBUG("Camera properties : distance=" << distance ); EGE_DEBUG(" psy=" << angles.y()); EGE_DEBUG(" Tetha=" << angles.x()); - EGE_DEBUG(" m_eye=" << etk::to_string(m_eye)); + EGE_DEBUG(" m_eye=" << m_eye); } ege::camera::View::View(const vec3& _eye, const vec3& _target, float _angle) : @@ -68,13 +74,12 @@ 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 // 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); + 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), angles.y()); + screenOffset = screenOffset.rotate(vec3(0,1,0), -angles.x() - M_PI/2.0f); vec3 direction = screenOffset; #else // lA PROJECTION TOURNE EN FONCTION DE L'ANGLE diff --git a/ege/widget/Scene.cpp b/ege/widget/Scene.cpp index a22f2f5..c318326 100644 --- a/ege/widget/Scene.cpp +++ b/ege/widget/Scene.cpp @@ -73,6 +73,7 @@ void ege::widget::Scene::onDraw() { #endif gale::openGL::clearColor(etk::color::black); m_env->render(echrono::Duration(1.0/60.0), m_cameraName); + signalDisplayDebug.emit(m_debugDrawProperty); #ifdef SCENE_DISPLAY_SPEED echrono::Duration localTime = echrono::Steady::now() - g_startTime; if (localTime>1) { diff --git a/sample/Collision/appl/Windows.cpp b/sample/Collision/appl/Windows.cpp index 242cccd..ee93acb 100644 --- a/sample/Collision/appl/Windows.cpp +++ b/sample/Collision/appl/Windows.cpp @@ -288,20 +288,6 @@ void appl::Windows::init() { } m_env->propertyStatus.set(ege::gameStart); } -/* -namespace appl { - class EntityHerit : public ege::EntityPhysic { - public: - EntityHerit(const ememory::SharedPtr& _env, bool _autoRigidBody=true) : - ege::EntityPhysic(_env, _autoRigidBody) { - setCollisionDetectionStatus(true); - } - virtual void onCollisionDetected(const ememory::SharedPtr& _obj, const vec3& _point, const vec3& _normal) { - APPL_WARNING("[" << getUID() << "] collision : pos=" << _point << " norm=" <<_normal); - } - }; -} -*/ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { diff --git a/sample/RayTest/appl/Windows.cpp b/sample/RayTest/appl/Windows.cpp index 536f2bc..7317f3b 100644 --- a/sample/RayTest/appl/Windows.cpp +++ b/sample/RayTest/appl/Windows.cpp @@ -14,10 +14,15 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include appl::Windows::Windows() : m_angleTetha(0), @@ -61,7 +66,7 @@ static ememory::SharedPtr createViewBoxStar() { } return out; } - +ememory::SharedPtr componentPhysicsPlop; void appl::Windows::init() { ewol::widget::Windows::init(); @@ -75,7 +80,7 @@ void appl::Windows::init() { // Create basic Camera m_camera = ememory::makeShared(vec3(30,30,-100), vec3(0,0,0)); - m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))); + m_camera->setEye(vec3(100*std::sin(m_angleTetha),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha))); m_env->addCamera("basic", m_camera); ememory::SharedPtr tmpWidget = ege::widget::Scene::create(); @@ -124,7 +129,7 @@ void appl::Windows::init() { ememory::SharedPtr element = ememory::makeShared(m_env); // add all component: // 1st Position component: - etk::Transform3D transform(vec3(20,-10,10), etk::Quaternion::identity()); + etk::Transform3D transform(vec3(-20,10,0), etk::Quaternion::identity()); //ememory::SharedPtr componentPosition = ememory::makeShared(transform); //element->addComponent(componentPosition); // 2nd something to diplay: @@ -132,6 +137,7 @@ void appl::Windows::init() { element->addComponent(componentRender); // 3rd some physic: ememory::SharedPtr componentPhysics = ememory::makeShared(m_env, transform); + componentPhysicsPlop = componentPhysics; ememory::SharedPtr physic = ememory::makeShared(); physic->setSize(vec3(3.01,3.01,3.01)); physic->setMass(50000); @@ -146,7 +152,7 @@ void appl::Windows::init() { ememory::SharedPtr element = ememory::makeShared(m_env); // add all component: // 1st Position component: - etk::Transform3D transform(vec3(-20,10,10), etk::Quaternion::identity()); + etk::Transform3D transform(vec3(20,10,0), etk::Quaternion::identity()); //ememory::SharedPtr componentPosition = ememory::makeShared(transform); //element->addComponent(componentPosition); // 2nd something to diplay: @@ -166,28 +172,43 @@ void appl::Windows::init() { m_env->propertyStatus.set(ege::gameStart); } +std::vector listpos; 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); - m_ray = ray; - APPL_DEBUG("pos=" << pos << " ray = " << ray); - m_destination = ray.testRay(m_env->getPhysicEngine()); - std::pair, std::pair> result = ray.testRayObject(m_env->getPhysicEngine()); - if (result.first != nullptr) { - APPL_INFO("Select Object :" << result.first->getUID()); + if (_event.getStatus() == gale::key::status::down) { + vec2 pos = relativePosition(_event.getPos()); + ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size); + m_ray = std::make_pair(ray.getOrigin(), ray.getOrigin()+ray.getDirection()*50000); + APPL_DEBUG("pos=" << pos << " ray = " << ray); + ememory::SharedPtr engine = ememory::dynamicPointerCast(m_env->getEngine("physics")); + if (engine != nullptr) { + /* + std::pair, std::pair> result = engine->testRayObject(m_ray); + if (result.first != nullptr) { + APPL_INFO("Select Object :" << result.first->getUID()); + } + */ + std::pair result = engine->testRay(ray); + if (result.second != vec3(0,0,0)) { + APPL_INFO("impact at: pos=" << result.first << " normal=" << result.second); + m_destination = std::make_pair(result.first, result.first+result.second*50); + m_ray.second = result.first; + } + } + return true; } - return true; } else if (_event.getId() == 4) { ploppp += 0.2f; - m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); + m_camera->setEye(vec3(100*std::sin(m_angleTetha),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha))*ploppp); + listpos.push_back(m_camera->getEye()); } else if (_event.getId() == 5) { ploppp -= 0.2f; if (ploppp == 0) { ploppp = 1.0f; } - m_camera->setEye(vec3(100*std::sin(m_angleTetha),100*std::cos(m_angleTetha),40*std::cos(m_anglePsy))*ploppp); + m_camera->setEye(vec3(100*std::sin(m_angleTetha),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha))*ploppp); + listpos.push_back(m_camera->getEye()); } else if (_event.getId() == 3) { if (_event.getStatus() == gale::key::status::down) { m_oldScreenPos = relativePosition(_event.getPos()); @@ -196,7 +217,8 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) { 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_camera->setEye(vec3(100*std::sin(m_angleTetha),40*std::cos(m_anglePsy),100*std::cos(m_angleTetha))*ploppp); + listpos.push_back(m_camera->getEye()); m_oldScreenPos = relativePosition(_event.getPos()); return true; } @@ -211,14 +233,14 @@ void appl::Windows::onCallbackDisplayDebug(const ememory::SharedPtr vertices; - if (m_ray.getOrigin() != vec3(0,0,0)) { - vertices.push_back(m_ray.getOrigin()); - vertices.push_back(m_ray.getOrigin()+m_ray.getDirection()*50); + if (m_ray.first != vec3(0,0,0)) { + vertices.push_back(m_ray.first); + vertices.push_back(m_ray.second); // prevent Ray removing with empty - m_ray.setOrigin(vec3(0,0,0)); + m_ray.first = vec3(0,0,0); } if (vertices.size() > 250) { - vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-250); + vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-25); } obj->drawLine(vertices, etk::Color(0.0, 1.0, 0.0, 0.8), mat); } @@ -227,13 +249,24 @@ void appl::Windows::onCallbackDisplayDebug(const ememory::SharedPtr vertices; if (m_destination.second != vec3(0,0,0)) { vertices.push_back(m_destination.first); - vertices.push_back(m_destination.first + m_destination.second*20); + vertices.push_back(m_destination.second); m_destination.second = vec3(0,0,0); } if (vertices.size() > 250) { - vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-250); + vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-25); } obj->drawLine(vertices, etk::Color(1.0, 0.0, 0.0, 0.8), mat); } + if (listpos.size() >= 1) { + vec3 last(0,0,0); + static std::vector vertices; + for (auto &it: listpos) { + vertices.push_back(last); + last = it; + vertices.push_back(last); + + } + obj->drawLine(vertices, etk::Color(1.0, 1.0, 0.0, 0.8), mat); + } } diff --git a/sample/RayTest/appl/Windows.hpp b/sample/RayTest/appl/Windows.hpp index a2d2d76..5ed2bb0 100644 --- a/sample/RayTest/appl/Windows.hpp +++ b/sample/RayTest/appl/Windows.hpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace appl { class Windows : public ewol::widget::Windows { @@ -26,7 +27,7 @@ namespace appl { private: bool onEventInput(const ewol::event::Input& _event); void onCallbackDisplayDebug(const ememory::SharedPtr& _obj); - ege::Ray m_ray; + std::pair m_ray; float m_angleTetha; float m_anglePsy; vec2 m_oldScreenPos; diff --git a/sample/RayTest/lutin_ege-sample-raytracing.py b/sample/RayTest/lutin_ege-sample-raytracing.py index 1619ecf..75d454e 100644 --- a/sample/RayTest/lutin_ege-sample-raytracing.py +++ b/sample/RayTest/lutin_ege-sample-raytracing.py @@ -28,7 +28,7 @@ def get_maintainer(): return ["Mr DUPIN Edouard "] def get_version(): - return [0,1] + return [0,2] def configure(target, my_module):