Part of the Khronos Group

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 2 of 2

Thread: Translate to mouse position using GLM

  1. #1
    Junior Member Newbie
    Join Date
    Feb 2013

    Translate to mouse position using GLM

    I'm despairing of the task to zoom in on the current mouse position in OpenGL. I've tried a lot of different things and read other posts on this, but I couldn't adapt the possible solutions to my specific problem. So as far as I understood it, you'll have to get the current window coordinates of the mouse curser, then unproject them to get world coordinates and finally translate to those world coordinates.

    To find the current mouse positions, I use the following code in my GLUT mouse callback function every time the right mouse button is clicked.

    Code :
    if(button == 2)
        mouse_current_x = x;
        mouse_current_y = y;

    Next up, I unproject the current mouse positions in my display function before setting up the ModelView and Projection matrices, which also seems to work perfectly fine:

    Code :
    // Unproject Window Coordinates
    float mouse_current_z;
    glReadPixels(mouse_current_x, mouse_current_y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &mouse_current_z);
    glm::vec3 windowCoordinates = glm::vec3(mouse_current_x, mouse_current_y, mouse_current_z);
    glm::vec4 viewport = glm::vec4(0.0f, 0.0f, (float)width, (float)height);
    glm::vec3 worldCoordinates = glm::unProject(windowCoordinates, modelViewMatrix, projectionMatrix, viewport);
    printf("(%f, %f, %f)\n", worldCoordinates.x, worldCoordinates.y, worldCoordinates.z);

    Now the translation is where the trouble starts. Currently I'm drawing a cube with dimensions (dimensionX, dimensionY, dimensionZ) and translate to the center of that cube, so my zooming happens to the center point as well. I'm achieving zooming by translating in z-direction (dolly):

    Code :
    // Set ModelViewMatrix
    modelViewMatrix = glm::mat4(1.0); // Start with the identity as the transformation matrix
    modelViewMatrix = glm::translate(modelViewMatrix, glm::vec3(0.0, 0.0, -translate_z)); // Zoom in or out by translating in z-direction based on user input 
    modelViewMatrix = glm::rotate(modelViewMatrix, rotate_x, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the whole szene in x-direction based on user input
    modelViewMatrix = glm::rotate(modelViewMatrix,  rotate_y, glm::vec3(0.0f, 1.0f, 0.0f)); // Rotate the whole szene in y-direction based on user input
    modelViewMatrix = glm::rotate(modelViewMatrix, -90.0f, glm::vec3(1.0f, 0.0f, 0.0f)); // Rotate the camera by 90 degrees in negative x-direction to get a frontal look on the szene
    modelViewMatrix = glm::translate(modelViewMatrix, glm::vec3(-dimensionX/2.0f, -dimensionY/2.0f, -dimensionZ/2.0f)); // Translate the origin to be the center of the cube
    glBindBuffer(GL_UNIFORM_BUFFER, globalMatricesUBO);
    glBufferSubData(GL_UNIFORM_BUFFER, sizeof(glm::mat4), sizeof(glm::mat4), glm::value_ptr(modelViewMatrix));
    glBindBuffer(GL_UNIFORM_BUFFER, 0);

    I tried to replace the translation to the center of the cube by translating to the worldCoordinates vector, but this didn't work. I also tried to scale the vector by width or height. Am I missing out on some essential step here?

  2. #2
    Senior Member OpenGL Pro
    Join Date
    Jan 2012
    What you have looks very complex. Try this

    "worldCoordinates" is the new target
    "eye" is where the camera currently is

    then the direction the camera needs to move is
    Code :

    if the distance to move is "translate_z"
    then the new camera location is
    Code :
    eye = glm::normalize(worldCoordinates-eye) * translate_z;

    now use
    Code :
    modelViewMatrix = glm::lookAt(eye,worldCoordinates,up) to create you view matrix

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts