I am trying to convert screen coords to world cords so that I can move an object with the mouse cursor in C++ using glew and glfw. I've been following an article on raycasting, which gets me part of the way.
In my program, I am able to move the object but it either moves too far or too little.
The code I have right now is:
Projection/View Declaration
...
GlobalProjection = glm::perspective(1.0f, 4.0f / 3.0f, 1.0f, 1024.1f);
GlobalView = glm::lookAt(
glm::vec3(0, 0, 1024.0f), // Camera location
glm::vec3(0, 0, 0), // Where camera is looking
glm::vec3(0, 1, 0) // Camera head is facing up
);
...
Transform Function
glm::vec3 Application::viewToWorldCoordTransform(int mouse_x, int mouse_y) {
double x = 2.0 * mouse_x / 1024 - 1;
double y = 2.0 * mouse_y / 768 - 1;
glm::mat4 ProjectView = GlobalProjection * GlobalView;
glm::mat4 viewProjectionInverse = inverse(ProjectView);
glm::vec4 screenPos = glm::vec4(x, -y, -1.0f, -1.0f);
glm::vec4 worldPos = viewProjectionInverse * screenPos;
return glm::normalize(glm::vec3(worldPos));
}
I have a loose understanding of how this all works, and I get lost when inverse is used.
If there's any existing code out there that I can get referred to or if someone can point out where I'm going awry I would appreciate it.