GLFW 3:如何使用ScrollCallback(LWJGL 3)获取鼠标滚轮的增量

问题描述 投票:0回答:1

[我正在关注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()在每次循环迭代中被调用

opengl callback lwjgl glfw
1个回答
0
投票

GLFWScrollCallback会在用户生成某些滚动操作(上下左右,甚至左右)时被调用。结果,将XScroll / YScroll设置为-11 并保持原样,直到发生下一个滚动事件为止。您需要采取某种方式将其重置为零。可能您可以做类似>>的操作

    public float getYScroll() {
        float value = YScroll;
        YScroll = 0.0f;
        return value;
    }

,但是仅当您每帧仅调用getYScroll一次时,此方法才有效。尚不清楚您要如何处理此类事件(即是否要存储它们直到消耗掉-可能不是每个帧),但是很可能您只需在MouseScroll中添加一些重置方法即可调用,每帧的结尾-由于您在每帧中都按了滚轮,因此不会丢失任何事件。

© www.soinside.com 2019 - 2024. All rights reserved.