[DEV] try to have a good ray tracing

This commit is contained in:
Edouard DUPIN 2014-11-27 21:13:51 +01:00
parent 75b31da54f
commit 8ec1d2833c
3 changed files with 52 additions and 22 deletions

View File

@ -68,25 +68,33 @@ vec3 ege::camera::View::getViewVector() const {
ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) { ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) {
vec2 cameraAngleOffset(m_angleView/2*_offset.x(), 2*_offset.y()*m_aspectRatio/m_angleView); vec2 cameraAngleOffset(m_angleView*0.5f*_offset.x(), _offset.y()*0.5f*m_angleView/m_aspectRatio);
#if 0 #if 1
mat4 inverse = m_matrix.invert(); #if 1
vec3 screenOffset(0,0,-1); mat4 inverse = m_matrix.invert();
screenOffset.rotate(vec3(1,0,0), cameraAngleOffset.x()); vec3 screenOffset(0,0,-1);
screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.y()); screenOffset = getViewVector();
vec3 direction = inverse*screenOffset; 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 #else
vec3 direction = getViewVector(); vec3 direction = getViewVector();
//mat4 transformation; direction = direction.rotate(vec3(1,0,0), cameraAngleOffset.x());
//transformation.indentity(); direction = direction.rotate(vec3(0,1,0), cameraAngleOffset.y());
//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 #endif
direction.safeNormalize(); direction.safeNormalize();
ege::Ray out(m_eye, direction); ege::Ray out(m_eye, direction);
EGE_WARNING("request ray from : " << _offset); EGE_WARNING("request ray from : " << _offset);
EGE_WARNING(" camera offset = " << cameraAngleOffset); EGE_WARNING(" camera offset = " << cameraAngleOffset);
EGE_WARNING(" angle view x=" << m_angleView << " y=" << m_angleView/m_aspectRatio);
EGE_WARNING("return ray : " << out); EGE_WARNING("return ray : " << out);
// TODO : Use offset... // TODO : Use offset...

View File

@ -22,7 +22,9 @@
#undef __class__ #undef __class__
#define __class__ "Windows" #define __class__ "Windows"
appl::Windows::Windows() { appl::Windows::Windows() :
m_angleTetha(0),
m_anglePsy(0) {
addObjectType("appl::Windows"); addObjectType("appl::Windows");
} }
@ -72,7 +74,7 @@ void appl::Windows::init() {
m_env = ege::Environement::create(); m_env = ege::Environement::create();
// Create basic Camera // Create basic Camera
m_camera = std::make_shared<ege::camera::View>(vec3(30,30,-100), vec3(0,0,0)); m_camera = std::make_shared<ege::camera::View>(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); m_env->addCamera("basic", m_camera);
std::shared_ptr<ege::widget::Scene> tmpWidget = ege::widget::Scene::create(m_env); std::shared_ptr<ege::widget::Scene> 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()); ray.testRay(m_env->getPhysicEngine());
return true; return true;
} else if (_event.getId() == 4) { } else if (_event.getId() == 4) {
ploppp += 1.0f; ploppp += 0.2f;
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() == 5) { } else if (_event.getId() == 5) {
ploppp -= 1.0f; ploppp -= 0.2f;
if (ploppp == 0) { if (ploppp == 0) {
ploppp = 1.0f; 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; return false;
} }
void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj) { void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj) {
etk::Color<float> tmpColor(0.0, 1.0, 0.0, 0.3); etk::Color<float> tmpColor(0.0, 1.0, 0.0, 0.3);
std::vector<vec3> vertices; static std::vector<vec3> vertices;
//vertices.push_back(m_ray.getOrigin()+vec3(1,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(vec3(100,0,0));//m_ray.getOrigin() + m_ray.getDirection()*1000);
//vertices.push_back(m_ray.getOrigin() + m_ray.getDirection()*1000); //vertices.push_back(m_ray.getOrigin() + m_ray.getDirection()*1000);
vertices.push_back(vec3(0,0,0)); #if 0
vertices.push_back(m_ray.getDirection()*1000); 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; mat4 mat;
mat.identity(); mat.identity();
mat.translate(vec3(0,0,0)); mat.translate(vec3(0,0,0));

View File

@ -30,6 +30,9 @@ namespace appl {
bool onEventInput(const ewol::event::Input& _event); bool onEventInput(const ewol::event::Input& _event);
void onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj); void onCallbackDisplayDebug(const std::shared_ptr<ewol::resource::Colored3DObject>& _obj);
ege::Ray m_ray; ege::Ray m_ray;
float m_angleTetha;
float m_anglePsy;
vec2 m_oldScreenPos;
}; };
}; };