[DEV] correst ray tracing

This commit is contained in:
Edouard DUPIN 2014-11-28 23:14:30 +01:00
parent 8ec1d2833c
commit a92e7413ed
7 changed files with 71 additions and 42 deletions

View File

@ -41,7 +41,7 @@ std::ostream& ege::operator <<(std::ostream& _os, const ege::Ray& _obj) {
return _os;
}
void ege::Ray::testRay(ege::physics::Engine& _engine) {
std::pair<vec3,vec3> ege::Ray::testRay(ege::physics::Engine& _engine) {
vec3 start = m_origin;
vec3 stop = m_origin+m_direction*1000.0f;
// Start and End are vectors
@ -53,8 +53,9 @@ void ege::Ray::testRay(ege::physics::Engine& _engine) {
vec3 end = rayCallback.m_hitPointWorld;
vec3 normal = rayCallback.m_hitNormalWorld;
EGE_ERROR(" hit at point=" << end << " normal=" << normal);
} else {
EGE_ERROR(" No Hit");
return std::pair<vec3,vec3>(end,normal);
}
EGE_ERROR(" No Hit");
return std::pair<vec3,vec3>(vec3(0,0,0),vec3(0,0,0));
}

View File

@ -66,7 +66,7 @@ namespace ege {
*/
void set(const vec3& _origin, const vec3& _direction);
public:
void testRay(ege::physics::Engine& _engine);
std::pair<vec3,vec3> testRay(ege::physics::Engine& _engine);
};
std::ostream& operator <<(std::ostream& _os, const ege::Ray& _obj);
};

View File

@ -77,3 +77,21 @@ ege::Ray ege::Camera::getRayFromScreenPosition(const vec2& _position, const vec2
return getRayFromScreen(_position/half - vec2(1,1));
}
vec2 ege::Camera::tansformPositionToAngle(vec3 _vect) {
vec2 out(0.0f, 0.0f);
float distance = _vect.length();
if (distance == 0.0f) {
return out;
}
out.setY(std::asin(_vect.z()/distance));
_vect.setZ(0.0f);
if (_vect.x() == 0 && _vect.y() == 0) {
return out;
}
_vect.normalize();
out.setX(std::asin(_vect.y()));
if (_vect.x() < 0) {
out.setX(out.x()*-1 - M_PI);
}
return out;
}

View File

@ -159,6 +159,14 @@ namespace ege {
* @return the ray requested.
*/
ege::Ray getRayFromScreenPosition(const vec2& _position, const vec2& _size);
protected:
/**
* @brief get Tetha and psy angle from a position:
* @param[in] _vect Vector to transform in the euler angle
* @return x: tetha; y: psy
*/
vec2 tansformPositionToAngle(vec3 _vect);
};
};

View File

@ -19,24 +19,18 @@ void ege::camera::View::update() {
//m_matrix.translate(m_eye);
m_matrix.identity();
m_matrix.rotate(vec3(0,0,1), -m_angle);
vec3 pos = m_eye-m_target;
vec3 pos = -getViewVector();
vec2 angles = tansformPositionToAngle(pos);
float distance = pos.length();
float psy = std::asin(pos.z()/distance);
pos.setZ(0.0f);
pos.normalize();
float tetha = std::asin(pos.y());
if (pos.x() < 0) {
tetha *= -1;
tetha -= M_PI;
}
m_matrix.translate(vec3(0,0,-distance));
m_matrix.rotate(vec3(1,0,0), -M_PI*0.5f + psy);
m_matrix.rotate(vec3(0,0,1), -tetha-M_PI/2.0f);
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.translate(-m_target);
EGE_DEBUG("Camera properties : distance=" << distance );
EGE_DEBUG(" psy=" << psy);
EGE_DEBUG(" Tetha=" << tetha);
EGE_DEBUG(" psy=" << angles.y());
EGE_DEBUG(" Tetha=" << angles.x());
EGE_DEBUG(" m_eye=" << etk::to_string(m_eye));
}
@ -70,33 +64,26 @@ vec3 ege::camera::View::getViewVector() const {
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
#if 1
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 = 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
// 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);
vec3 direction = screenOffset;
#else
vec3 direction = getViewVector();
direction = direction.rotate(vec3(1,0,0), cameraAngleOffset.x());
direction = direction.rotate(vec3(0,1,0), cameraAngleOffset.y());
// lA PROJECTION TOURNE EN FONCTION DE L'ANGLE
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
direction.safeNormalize();
ege::Ray out(m_eye, direction);
EGE_WARNING("request ray from : " << _offset);
EGE_WARNING(" camera offset = " << cameraAngleOffset);
EGE_WARNING(" angle view x=" << m_angleView << " y=" << m_angleView/m_aspectRatio);
EGE_WARNING("return ray : " << out);
// TODO : Use offset...
EGE_VERBOSE("return ray : " << out);
return out;
}

View File

@ -157,7 +157,7 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
ege::Ray ray = m_camera->getRayFromScreenPosition(pos, m_size);
m_ray = ray;
APPL_INFO("pos=" << pos << " ray = " << ray);
ray.testRay(m_env->getPhysicEngine());
m_destination = ray.testRay(m_env->getPhysicEngine());
return true;
} else if (_event.getId() == 4) {
ploppp += 0.2f;
@ -186,7 +186,9 @@ bool appl::Windows::onEventInput(const ewol::event::Input& _event) {
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> tmpColor2(1.0, 0.0, 0.0, 0.3);
static std::vector<vec3> vertices;
static std::vector<vec3> vertices2;
//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(m_ray.getOrigin() + m_ray.getDirection()*1000);
@ -197,9 +199,21 @@ void appl::Windows::onCallbackDisplayDebug(const std::shared_ptr<ewol::resource:
vertices.push_back(m_ray.getOrigin());
vertices.push_back(m_ray.getOrigin()+m_ray.getDirection()*100);
#endif
if (vertices.size() > 50) {
vertices.erase(vertices.begin(), vertices.begin()+vertices.size()-50);
}
if (m_destination.second != vec3(0,0,0)) {
vertices2.push_back(m_destination.first);
vertices2.push_back(m_destination.first + m_destination.second*100);
m_destination.second = vec3(0,0,0);
}
if (vertices2.size() > 50) {
vertices2.erase(vertices2.begin(), vertices2.begin()+vertices2.size()-50);
}
mat4 mat;
mat.identity();
mat.translate(vec3(0,0,0));
_obj->drawLine(vertices, tmpColor, mat);
_obj->drawLine(vertices2, tmpColor2, mat);
}

View File

@ -33,6 +33,7 @@ namespace appl {
float m_angleTetha;
float m_anglePsy;
vec2 m_oldScreenPos;
std::pair<vec3,vec3> m_destination;
};
};