2

So I'm trying to implement a simple mouseLook method for exploring a game world in LWJGL. For now I just want it to work on the rotation-Y axis. The movement at first was limited because of the dimensions of the screen stopped the mouse from moving. So i hid the cursor and set the x-position of the mouse to 0 after deltaX is returned. When i wrote it out on paper the calculations seem to be right I think, however when i run it, the rotation keeps snapping back to 0, and creates a jitter effect. How can i solve this?

public void rotate() { //rotate the camera

    System.out.println(getGlobalDX() + "   " + MouseInfo.getPointerInfo().getLocation().getX());

    float speed = 0.03f;

    //START OF CODE TO IGNORE
    float ratioX = (float)Display.getWidth() / 360;
    float ratioY = (float)Display.getHeight() / 360;

    float mouseRotX = Mouse.getX() / ratioX;
    float mouseRotY = Mouse.getY() / ratioY;

    //END OF CODE TO IGNORE

    rotY += getGlobalDX() * speed; // add the deltaX of the mouse position X and multiply it by our speed in order to rotate the camera based on the mouse
    lockCursor();
}

public float getGlobalDX() { //returns the difference between the current mouse position and the mouse position during the last frame



    frames += 1; //add 1 to frames variable every frame

    if(frames >= 1.5) { //if 1.5 frames have passed since last method call, run method again. this is to smooth things out since it doesnt work properly every frame

        float mouseX = (float) MouseInfo.getPointerInfo().getLocation().getX(); //get x pos of mouse
        frames = 0; //set frames to zero

        if(lastMouseX != mouseX) { //if the lastmouse position isnt equal to our current mouse position, then continue

            if(mouseX == 963) { //if the mouse position is equal to the centered X position of the screen then continue

                lastMouseX = (float) MouseInfo.getPointerInfo().getLocation().getX(); //set this variable to the new x position
                System.out.println("returning zero"); //debug by checking if this code runs (it does)
                return 0; //return 0 since we dont want to undo the position we returned last frame

            }

            float deltaX = (float) (mouseX - lastMouseX); // difference between current mouse position and last to get the overall change in position
            lastMouseX = (float) MouseInfo.getPointerInfo().getLocation().getX(); //set to new x position
            MouseInfo.getPointerInfo().getLocation().setLocation(MouseInfo.getPointerInfo().getLocation().getX()/2, MouseInfo.getPointerInfo().getLocation().getY()/2); // set mouse position to 0 for infinite movement
            return deltaX; //return the overall change in position and add it to the rotation Y of our camera

        } else { // return 0 if the lastMouse position is equal to the current mouse position, since there was no change in position

            return 0;

        }

    } else { //return 0 since a frame was skipped

        return 0;

    }


}
4

1 回答 1

0

与其自己重置鼠标的位置,不如Mouse.setGrabbed(true)在开始使用鼠标之前调用它。

于 2012-10-25T13:45:43.517 回答