Search code examples
javaopengllwjgl

Zooming to Mouse position in LWJGL


I am trying to implement a zoom to an isometric map using LWJGL. Currently I have the functions

public static void setCameraPosition(float x, float y) {

    x *= zoom;
    y *= zoom;

    cameraX = x;
    cameraY = y;

    x -= (Display.getWidth() / 2) * zoom;
    y -= (Display.getHeight() / 2) * zoom;

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    GLU.gluLookAt(x, y, 1f, x, y, 0, 0.0f, 1.0f, 0.0f);
}   

which sets the camera center to a point (x, y),

public static Point getMouseCoordinates() {
    float x = Mouse.getX() * getZoom() + getCameraLeft();
    float y = (Display.getHeight() - Mouse.getY()) * getZoom() + getCameraTop();
    return new Point((int) x, (int) y);
}

which returns the current mouse coordinates, and

public static void setZoom(int newZoom) {

    if (newZoom >= 4) newZoom = 4;
    else if (newZoom <= 1) newZoom = 1;

    if (zoom == newZoom) return;

    float x = ?; <-----
    float y = ?; <-----

    zoom = newZoom;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,  0+Display.getWidth() * zoom , 0+Display.getHeight() * zoom, 0, 1, -1);
    setCameraPosition((int) x, (int) y);
}

which is supposed to set the zoom to an integer value between 1 and 4. As you can see, I would like to set the camera position after changing the zoom to a certain point - and that point needs to be calculated so that the current mouse position does not change (aka zooming in to the mouse position, which is for example what Google Maps does). I have been trying for a good 2 days now, I've tried so many things, but I just couldn't figure out the equation to calculate x and y.

Please note that all points returned and entered are relative to the position of the map, specifically to the top piece of the map (whose top corner point is (0, 0)). The values getCameraLeft() and getCameraTop() in the getMouseCoordinates() function return

public static float getCameraLeft() {
    return cameraX - zoom * (Display.getWidth() / 2);
}

and

public static float getCameraTop() {
    return cameraY - zoom * (Display.getHeight() / 2);
}

.

Any help would be appreciated. I'm hoping, I did not express myself too complicated.


Solution

  • I finally found the correct equation:

            float x = getMouseCoordinates().getX() + (getCameraX() - getMouseCoordinates().getX()) * (float) newZoom / (float) zoom;
            float y = getMouseCoordinates().getY() + (getCameraY() - getMouseCoordinates().getY()) * (float) newZoom / (float) zoom;
    

    Thank you anyways, I'm sure eventually someone would have given me the correct answer :)