[DEV] try to set ray work

This commit is contained in:
Edouard DUPIN 2014-11-26 15:06:43 +01:00
parent e83fc80da3
commit 75b31da54f
2 changed files with 37 additions and 11 deletions

View File

@ -27,11 +27,11 @@ void ege::camera::View::update() {
float tetha = std::asin(pos.y()); float tetha = std::asin(pos.y());
if (pos.x() < 0) { if (pos.x() < 0) {
tetha *= -1; tetha *= -1;
tetha += M_PI; tetha -= M_PI;
} }
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 + psy); m_matrix.rotate(vec3(1,0,0), -M_PI*0.5f + psy);
m_matrix.rotate(vec3(0,0,1), tetha); m_matrix.rotate(vec3(0,0,1), -tetha-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 );
@ -63,16 +63,30 @@ void ege::camera::View::setAngle(float _angle) {
} }
vec3 ege::camera::View::getViewVector() const { vec3 ege::camera::View::getViewVector() const {
return m_eye-m_target; return m_target - m_eye;
} }
ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) { ege::Ray ege::camera::View::getRayFromScreen(const vec2& _offset) {
vec3 direction = getViewVector(); vec2 cameraAngleOffset(m_angleView/2*_offset.x(), 2*_offset.y()*m_aspectRatio/m_angleView);
#if 0
mat4 inverse = m_matrix.invert();
vec3 screenOffset(0,0,-1);
screenOffset.rotate(vec3(1,0,0), cameraAngleOffset.x());
screenOffset.rotate(vec3(0,1,0), cameraAngleOffset.y());
vec3 direction = inverse*screenOffset;
#else
vec3 direction = getViewVector();
//mat4 transformation;
//transformation.indentity();
//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
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 = " << vec2(m_angleView/2*_offset.x(), 2*_offset.y()*m_aspectRatio/m_angleView)); EGE_WARNING(" camera offset = " << cameraAngleOffset);
EGE_WARNING("return ray : " << out); EGE_WARNING("return ray : " << out);
// TODO : Use offset... // TODO : Use offset...

View File

@ -72,6 +72,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_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);
@ -142,12 +143,13 @@ void appl::Windows::onCallbackPeriodicUpdateCamera(const ewol::event::Time& _eve
offset += 0.01; offset += 0.01;
static float offset2 = 0; static float offset2 = 0;
//offset2 += 0.003; //offset2 += 0.003;
m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40*std::cos(offset2))); //m_camera->setEye(vec3(100*std::sin(offset),100*std::cos(offset),40*std::cos(offset2)));
} }
bool appl::Windows::onEventInput(const ewol::event::Input& _event) { bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
static float ploppp=1;
if (_event.getId() == 1) { if (_event.getId() == 1) {
vec2 pos = relativePosition(_event.getPos()); vec2 pos = relativePosition(_event.getPos());
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size); ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
@ -155,20 +157,30 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
APPL_INFO("pos=" << pos << " ray = " << ray); APPL_INFO("pos=" << pos << " ray = " << ray);
ray.testRay(m_env->getPhysicEngine()); ray.testRay(m_env->getPhysicEngine());
return true; return true;
} else if (_event.getId() == 4) {
ploppp += 1.0f;
m_camera->setEye(vec3(100*std::sin(0),100*std::cos(0),40*std::cos(0))*ploppp);
} else if (_event.getId() == 5) {
ploppp -= 1.0f;
if (ploppp == 0) {
ploppp = 1.0f;
}
m_camera->setEye(vec3(100*std::sin(0),100*std::cos(0),40*std::cos(0))*ploppp);
} }
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) {
EWOL_INFO("draw user debug");
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; std::vector<vec3> vertices;
vertices.push_back(m_ray.getOrigin()); //vertices.push_back(m_ray.getOrigin()+vec3(1,0,0));
vertices.push_back(m_ray.getOrigin() + m_ray.getDirection()*1000); //vertices.push_back(vec3(100,0,0));//m_ray.getOrigin() + m_ray.getDirection()*1000);
vertices.push_back(vec3(10,0,0)); //vertices.push_back(m_ray.getOrigin() + m_ray.getDirection()*1000);
vertices.push_back(vec3(0,0,0));
vertices.push_back(m_ray.getDirection()*1000);
mat4 mat; mat4 mat;
mat.identity(); mat.identity();
mat.translate(vec3(0,0,0)); mat.translate(vec3(0,0,0));
_obj->draw(vertices, tmpColor, mat); _obj->drawLine(vertices, tmpColor, mat);
} }