[我正在关注this tutorial上有关使用LWJGL和OpenGL进行3D游戏开发的信息。在本系列中,讲师正在使用LWJGL 2,而我正在将LWJGL 3与GLFW一起使用。而且在特定的部分中,他使用了仅在LWJGL 2中可用的LWJGL的输入实现,因此我被迫使用GLFW的回调系统。我能够为键输入,光标移动和鼠标按钮输入添加输入功能,但是当我尝试添加滚动回调时,似乎偏移量仅返回-1和1作为滚动方向,添加时, (第三人称)相机会无限期地前后移动,其目的是让相机在每次滚动时都向前或向后平移一定距离。实际上,我期望每次滚动都获得增量值。以前,我一直在混乱,试图查看是否可以将偏移值设置为一定的延迟时间,然后将其重新设置为0,但无济于事。我尝试寻找答案,但没有发现与我的问题有关的任何内容。我可能很愚蠢,但这是代码。
MouseScroll回调类:
import org.lwjgl.glfw.GLFWScrollCallback;
public class MouseScroll extends GLFWScrollCallback {
private static float XScroll;
private static float YScroll;
private static float DXScroll;
private static float DYScroll;
@Override
public void invoke(long window, double xoffset, double yoffset) {
XScroll = (float) xoffset;
YScroll = (float) yoffset;
// Don't know how to achieve this here
}
/* Returns raw offset values */
public float getXScroll() {
return XScroll;
}
public float getYScroll() {
return YScroll;
}
/* Returns the rate of each scrolling movement */
public float getDXScroll() {
return DXScroll;
}
public float getDYScroll() {
return DYScroll;
}
}
在Input类中获取YScroll的方法:
public static float getMouseYScroll() {
return mouseScroll.getYScroll(); // mouseScroll is reference to MouseScroll callback
}
使用Camera.java中的回调的方法:
private void calculateZoom() {
float zoomLevel = Input.getMouseYScroll() * 0.1f;
distanceFromPlayer -= zoomLevel;
}
Camera.java中的更新方法:
public void move() {
calculateZoom();
calculatePitch();
calculateAngleAroundPlayer();
float horizontalDistance = calculateHorizontalDistance();
float verticalDistance = calculateVerticalDistance();
calculateCameraPosition(horizontalDistance, verticalDistance);
this.yaw = 180 - (player.getRotY() + angleAroundPlayer);
}
最后还有camera.move()
在每次循环迭代中被调用
GLFWScrollCallback会在用户生成某些滚动操作(上下左右,甚至左右)时被调用。结果,将XScroll
/ YScroll
设置为-1
或1
并保持原样,直到发生下一个滚动事件为止。您需要采取某种方式将其重置为零。可能您可以做类似>>的操作
public float getYScroll() { float value = YScroll; YScroll = 0.0f; return value; }
,但是仅当您每帧仅调用
getYScroll
一次时,此方法才有效。尚不清楚您要如何处理此类事件(即是否要存储它们直到消耗掉-可能不是每个帧),但是很可能您只需在MouseScroll
中添加一些重置方法即可调用,每帧的结尾-由于您在每帧中都按了滚轮,因此不会丢失任何事件。