在LWJGL中缩放到鼠标位置

时间:2015-07-20 22:43:08

标签: java opengl lwjgl

我正在尝试使用LWJGL实现缩放到等轴测图。目前我有功能

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);
}   

将摄像机中心设置为点(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);
}

返回当前鼠标坐标,

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);
}

应该将缩放设置为1到4之间的整数值。如您所见,我想在将缩放更改为某个点后设置相机位置 - 并且需要计算该点以便当前鼠标位置不会改变(也就是放大到鼠标位置,例如谷歌地图的作用)。我已经尝试了好两天了,我已经尝试了很多东西,但我无法弄清楚计算x和y的等式。

请注意,返回和输入的所有点都是相对于地图的位置,特别是地图的顶部(其顶角点是(0,0))。 getMouseCoordinates()函数中的值getCameraLeft()和getCameraTop()返回

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

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

任何帮助将不胜感激。我希望,我没有表达自己太复杂。

1 个答案:

答案 0 :(得分:1)

我终于找到了正确的等式:

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

无论如何,谢谢你,我相信最终会有人给我正确答案:)