This is an old topic,I know, but I did not find any clear explanation in the forum. I want to implement a ray caster that shoots a ray from the camera to the mouse position, in order to check if a ray intersects or not with some meshes.
I was reading this:
But I can not understand the solution proposed, and it looks a bit hacky to me. I am looking at the moment at this tutorial http://antongerdelan.net/opengl/raycasting.html where things are explained clearly, but my implementation does not work.
This is my code:
void ofApp::setFromCamera(const glm::vec2 coords, const ofCamera camera){
// 2d Viewport Coordinates
float x = (2.0f * coords.x) / ofGetWidth() - 1.0f;
float y = 1.0f - (2.0f * coords.y) / ofGetHeight();
// 3D Normalised Device Coordinates
float z = -1.0f; // the camera looks on the negative z axis
glm::vec3 rayNds = glm::vec3(x, y, z);
// 4D Homogeneous Clip Coordinates
glm::vec4 rayClip = glm::vec4(rayNds, 1.0);
// 4D Eye (Camera) Coordinates
glm::vec4 rayEye = glm::inverse(camera.getProjectionMatrix()) * rayClip;
// Now, we only needed to un-project the x,y part, so let's manually set the z,w part to mean "forwards, and not a point". From http://antongerdelan.net/opengl/raycasting.html
rayEye = glm::vec4(rayEye.x,rayEye.y, -1.0, 0.0);
// 4D World Coordinates
glm::vec3 rayWorld = glm::vec3(glm::inverse(camera.getModelViewMatrix()) * rayEye);
rayWorld = glm::normalize(rayWorld);
};
I think it could be something related to the order in which OF is applying the transformation, that it should be vertex * matrix instead matrix * vertex as it happens in GLSL.
Any hints is much appreciated.