[DEV] set Y as up vector ==> more common and correct the raytacing exemple

This commit is contained in:
Edouard DUPIN 2017-05-24 00:24:01 +00:00
parent 7d51944355
commit 8cbe9d1a80
7 changed files with 84 additions and 58 deletions

View File

@ -79,13 +79,13 @@ vec2 ege::Camera::tansformPositionToAngle(vec3 _vect) {
if (distance == 0.0f) { if (distance == 0.0f) {
return out; return out;
} }
out.setY(std::asin(_vect.z()/distance)); out.setY(std::asin(_vect.y()/distance));
_vect.setZ(0.0f); _vect.setY(0.0f);
if (_vect.x() == 0 && _vect.y() == 0) { if (_vect.x() == 0 && _vect.z() == 0) {
return out; return out;
} }
_vect.normalize(); _vect.normalize();
out.setX(std::asin(_vect.y())); out.setX(std::asin(_vect.z()));
if (_vect.x() < 0) { if (_vect.x() < 0) {
out.setX(out.x()*-1 - M_PI); out.setX(out.x()*-1 - M_PI);
} }

View File

@ -11,23 +11,29 @@
#include <ege/Ray.hpp> #include <ege/Ray.hpp>
void ege::camera::View::update() { 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); //m_matrix.translate(m_eye);
*/
// The camera view to the-z axis ...
m_matrix.identity(); m_matrix.identity();
// basic camera rotation
m_matrix.rotate(vec3(0,0,1), -m_angle); m_matrix.rotate(vec3(0,0,1), -m_angle);
vec3 pos = -getViewVector(); vec3 pos = -getViewVector();
vec2 angles = tansformPositionToAngle(pos); vec2 angles = tansformPositionToAngle(pos);
float distance = pos.length(); float distance = pos.length();
m_matrix.translate(vec3(0,0,-distance)); m_matrix.translate(vec3(0,0,-distance));
m_matrix.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y()); m_matrix.rotate(vec3(1,0,0), angles.y());
m_matrix.rotate(vec3(0,0,1), -angles.x()-M_PI/2.0f); m_matrix.rotate(vec3(0,1,0), angles.x()-M_PI/2.0f);
m_matrix.translate(-m_target); m_matrix.translate(-m_target);
EGE_DEBUG("Camera properties : distance=" << distance ); EGE_DEBUG("Camera properties : distance=" << distance );
EGE_DEBUG(" psy=" << angles.y()); EGE_DEBUG(" psy=" << angles.y());
EGE_DEBUG(" Tetha=" << angles.x()); 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) : 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); vec2 cameraAngleOffset(m_angleView*0.5f*_offset.x(), _offset.y()*0.5f*m_angleView/m_aspectRatio);
#if 1 #if 1
// It is not the best way to create the ray but it work . (My knowlege is not enought now ...) // 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); vec3 screenOffset(0,0,-1);
screenOffset = screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.x()); screenOffset = screenOffset.rotate(vec3(0,1,0), -cameraAngleOffset.x());
screenOffset = screenOffset.rotate(vec3(1,0,0), -cameraAngleOffset.y()); screenOffset = screenOffset.rotate(vec3(1,0,0), cameraAngleOffset.y());
vec2 angles = tansformPositionToAngle(-getViewVector()); vec2 angles = tansformPositionToAngle(getViewVector());
screenOffset = screenOffset.rotate(vec3(1,0,0), -M_PI*0.5f + angles.y()); screenOffset = screenOffset.rotate(vec3(1,0,0), angles.y());
screenOffset = screenOffset.rotate(vec3(0,0,1), angles.x() - M_PI/2.0f); screenOffset = screenOffset.rotate(vec3(0,1,0), -angles.x() - M_PI/2.0f);
vec3 direction = screenOffset; vec3 direction = screenOffset;
#else #else
// lA PROJECTION TOURNE EN FONCTION DE L'ANGLE // lA PROJECTION TOURNE EN FONCTION DE L'ANGLE

View File

@ -73,6 +73,7 @@ void ege::widget::Scene::onDraw() {
#endif #endif
gale::openGL::clearColor(etk::color::black); gale::openGL::clearColor(etk::color::black);
m_env->render(echrono::Duration(1.0/60.0), m_cameraName); m_env->render(echrono::Duration(1.0/60.0), m_cameraName);
signalDisplayDebug.emit(m_debugDrawProperty);
#ifdef SCENE_DISPLAY_SPEED #ifdef SCENE_DISPLAY_SPEED
echrono::Duration localTime = echrono::Steady::now() - g_startTime; echrono::Duration localTime = echrono::Steady::now() - g_startTime;
if (localTime>1) { if (localTime>1) {

View File

@ -288,20 +288,6 @@ void appl::Windows::init() {
} }
m_env->propertyStatus.set(ege::gameStart); m_env->propertyStatus.set(ege::gameStart);
} }
/*
namespace appl {
class EntityHerit : public ege::EntityPhysic {
public:
EntityHerit(const ememory::SharedPtr<ege::Environement>& _env, bool _autoRigidBody=true) :
ege::EntityPhysic(_env, _autoRigidBody) {
setCollisionDetectionStatus(true);
}
virtual void onCollisionDetected(const ememory::SharedPtr<ege::Entity>& _obj, const vec3& _point, const vec3& _normal) {
APPL_WARNING("[" << getUID() << "] collision : pos=" << _point << " norm=" <<_normal);
}
};
}
*/
bool appl::Windows::onEventInput(const ewol::event::Input& _event) { bool appl::Windows::onEventInput(const ewol::event::Input& _event) {

View File

@ -14,10 +14,15 @@
#include <ege/widget/Scene.hpp> #include <ege/widget/Scene.hpp>
#include <ege/camera/View.hpp> #include <ege/camera/View.hpp>
#include <etk/tool.hpp> #include <etk/tool.hpp>
#include <ege/elements/ElementBase.hpp> #include <ege/Entity.hpp>
#include <ege/elements/ElementPhysic.hpp> #include <ege/physics/shape/Box.hpp>
#include <ege/physicsShape/PhysicsBox.hpp> #include <ege/physics/shape/Sphere.hpp>
#include <ege/physicsShape/PhysicsSphere.hpp> #include <ege/physics/shape/Cylinder.hpp>
#include <ege/physics/shape/Capsule.hpp>
#include <ege/physics/shape/Cone.hpp>
#include <ege/position/Component.hpp>
#include <ege/render/Component.hpp>
#include <ege/physics/Component.hpp>
appl::Windows::Windows() : appl::Windows::Windows() :
m_angleTetha(0), m_angleTetha(0),
@ -61,7 +66,7 @@ static ememory::SharedPtr<ege::resource::Mesh> createViewBoxStar() {
} }
return out; return out;
} }
ememory::SharedPtr<ege::physics::Component> componentPhysicsPlop;
void appl::Windows::init() { void appl::Windows::init() {
ewol::widget::Windows::init(); ewol::widget::Windows::init();
@ -75,7 +80,7 @@ void appl::Windows::init() {
// Create basic Camera // Create basic Camera
m_camera = ememory::makeShared<ege::camera::View>(vec3(30,30,-100), vec3(0,0,0)); m_camera = ememory::makeShared<ege::camera::View>(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); m_env->addCamera("basic", m_camera);
ememory::SharedPtr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create(); ememory::SharedPtr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create();
@ -124,7 +129,7 @@ void appl::Windows::init() {
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env); ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
// add all component: // add all component:
// 1st Position 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<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform); //ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
//element->addComponent(componentPosition); //element->addComponent(componentPosition);
// 2nd something to diplay: // 2nd something to diplay:
@ -132,6 +137,7 @@ void appl::Windows::init() {
element->addComponent(componentRender); element->addComponent(componentRender);
// 3rd some physic: // 3rd some physic:
ememory::SharedPtr<ege::physics::Component> componentPhysics = ememory::makeShared<ege::physics::Component>(m_env, transform); ememory::SharedPtr<ege::physics::Component> componentPhysics = ememory::makeShared<ege::physics::Component>(m_env, transform);
componentPhysicsPlop = componentPhysics;
ememory::SharedPtr<ege::physics::shape::Box> physic = ememory::makeShared<ege::physics::shape::Box>(); ememory::SharedPtr<ege::physics::shape::Box> physic = ememory::makeShared<ege::physics::shape::Box>();
physic->setSize(vec3(3.01,3.01,3.01)); physic->setSize(vec3(3.01,3.01,3.01));
physic->setMass(50000); physic->setMass(50000);
@ -146,7 +152,7 @@ void appl::Windows::init() {
ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env); ememory::SharedPtr<ege::Entity> element = ememory::makeShared<ege::Entity>(m_env);
// add all component: // add all component:
// 1st Position 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<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform); //ememory::SharedPtr<ege::position::Component> componentPosition = ememory::makeShared<ege::position::Component>(transform);
//element->addComponent(componentPosition); //element->addComponent(componentPosition);
// 2nd something to diplay: // 2nd something to diplay:
@ -166,28 +172,43 @@ void appl::Windows::init() {
m_env->propertyStatus.set(ege::gameStart); m_env->propertyStatus.set(ege::gameStart);
} }
std::vector<vec3> listpos;
bool appl::Windows::onEventInput(const ewol::event::Input& _event) { bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
static float ploppp=1; static float ploppp=1;
if (_event.getId() == 1) { if (_event.getId() == 1) {
vec2 pos = relativePosition(_event.getPos()); if (_event.getStatus() == gale::key::status::down) {
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size); vec2 pos = relativePosition(_event.getPos());
m_ray = ray; ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
APPL_DEBUG("pos=" << pos << " ray = " << ray); m_ray = std::make_pair(ray.getOrigin(), ray.getOrigin()+ray.getDirection()*50000);
m_destination = ray.testRay(m_env->getPhysicEngine()); APPL_DEBUG("pos=" << pos << " ray = " << ray);
std::pair<ememory::SharedPtr<ege::Element>, std::pair<vec3,vec3>> result = ray.testRayObject(m_env->getPhysicEngine()); ememory::SharedPtr<ege::physics::Engine> engine = ememory::dynamicPointerCast<ege::physics::Engine>(m_env->getEngine("physics"));
if (result.first != nullptr) { if (engine != nullptr) {
APPL_INFO("Select Object :" << result.first->getUID()); /*
std::pair<ememory::SharedPtr<ege::physic::Component>, std::pair<vec3,vec3>> result = engine->testRayObject(m_ray);
if (result.first != nullptr) {
APPL_INFO("Select Object :" << result.first->getUID());
}
*/
std::pair<vec3,vec3> 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) { } else if (_event.getId() == 4) {
ploppp += 0.2f; 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) { } else if (_event.getId() == 5) {
ploppp -= 0.2f; ploppp -= 0.2f;
if (ploppp == 0) { if (ploppp == 0) {
ploppp = 1.0f; 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) { } else if (_event.getId() == 3) {
if (_event.getStatus() == gale::key::status::down) { if (_event.getStatus() == gale::key::status::down) {
m_oldScreenPos = relativePosition(_event.getPos()); m_oldScreenPos = relativePosition(_event.getPos());
@ -196,7 +217,8 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
vec2 pos = relativePosition(_event.getPos()); vec2 pos = relativePosition(_event.getPos());
m_angleTetha -= (m_oldScreenPos.x()-pos.x())*0.05f; m_angleTetha -= (m_oldScreenPos.x()-pos.x())*0.05f;
m_anglePsy += (m_oldScreenPos.y()-pos.y())*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()); m_oldScreenPos = relativePosition(_event.getPos());
return true; return true;
} }
@ -211,14 +233,14 @@ void appl::Windows::onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resour
// Display ray line // Display ray line
if (true) { if (true) {
static std::vector<vec3> vertices; static std::vector<vec3> vertices;
if (m_ray.getOrigin() != vec3(0,0,0)) { if (m_ray.first != vec3(0,0,0)) {
vertices.push_back(m_ray.getOrigin()); vertices.push_back(m_ray.first);
vertices.push_back(m_ray.getOrigin()+m_ray.getDirection()*50); vertices.push_back(m_ray.second);
// prevent Ray removing with empty // prevent Ray removing with empty
m_ray.setOrigin(vec3(0,0,0)); m_ray.first = vec3(0,0,0);
} }
if (vertices.size() > 250) { 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<float>(0.0, 1.0, 0.0, 0.8), mat); obj->drawLine(vertices, etk::Color<float>(0.0, 1.0, 0.0, 0.8), mat);
} }
@ -227,13 +249,24 @@ void appl::Windows::onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resour
static std::vector<vec3> vertices; static std::vector<vec3> vertices;
if (m_destination.second != vec3(0,0,0)) { if (m_destination.second != vec3(0,0,0)) {
vertices.push_back(m_destination.first); 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); m_destination.second = vec3(0,0,0);
} }
if (vertices.size() > 250) { 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<float>(1.0, 0.0, 0.0, 0.8), mat); obj->drawLine(vertices, etk::Color<float>(1.0, 0.0, 0.0, 0.8), mat);
} }
if (listpos.size() >= 1) {
vec3 last(0,0,0);
static std::vector<vec3> vertices;
for (auto &it: listpos) {
vertices.push_back(last);
last = it;
vertices.push_back(last);
}
obj->drawLine(vertices, etk::Color<float>(1.0, 1.0, 0.0, 0.8), mat);
}
} }

View File

@ -11,6 +11,7 @@
#include <ege/Environement.hpp> #include <ege/Environement.hpp>
#include <ege/camera/View.hpp> #include <ege/camera/View.hpp>
#include <ewol/resource/Colored3DObject.hpp> #include <ewol/resource/Colored3DObject.hpp>
#include <ege/Ray.hpp>
namespace appl { namespace appl {
class Windows : public ewol::widget::Windows { class Windows : public ewol::widget::Windows {
@ -26,7 +27,7 @@ namespace appl {
private: private:
bool onEventInput(const ewol::event::Input& _event); bool onEventInput(const ewol::event::Input& _event);
void onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resource::Colored3DObject>& _obj); void onCallbackDisplayDebug(const ememory::SharedPtr<ewol::resource::Colored3DObject>& _obj);
ege::Ray m_ray; std::pair<vec3,vec3> m_ray;
float m_angleTetha; float m_angleTetha;
float m_anglePsy; float m_anglePsy;
vec2 m_oldScreenPos; vec2 m_oldScreenPos;

View File

@ -28,7 +28,7 @@ def get_maintainer():
return ["Mr DUPIN Edouard <yui.heero@gmail.com>"] return ["Mr DUPIN Edouard <yui.heero@gmail.com>"]
def get_version(): def get_version():
return [0,1] return [0,2]
def configure(target, my_module): def configure(target, my_module):