[DEV] correst ray tracing
This commit is contained in:
parent
8ec1d2833c
commit
a92e7413ed
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
@ -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);
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@ namespace appl {
|
||||
float m_angleTetha;
|
||||
float m_anglePsy;
|
||||
vec2 m_oldScreenPos;
|
||||
std::pair<vec3,vec3> m_destination;
|
||||
};
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user