[DEV] try to have a good ray tracing
This commit is contained in:
parent
75b31da54f
commit
8ec1d2833c
@ -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...
|
||||||
|
@ -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));
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user