そこで、LWJGL でゲームの世界を探索するための単純な mouseLook メソッドを実装しようとしています。今のところ、回転 Y 軸で動作させたいだけです。画面のサイズがマウスの動きを妨げたため、最初は動きが制限されていました。そのため、カーソルを非表示にして、deltaX が返された後にマウスの x 位置を 0 に設定しました。紙に書いたとき、計算は正しいように思えますが、実行すると、回転が 0 に戻り続け、ジッター効果が生じます。どうすればこれを解決できますか?
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;
}
}