C++ 在GLFW3中注册从另一个类按下的键

C++ 在GLFW3中注册从另一个类按下的键,c++,input,glfw,C++,Input,Glfw,我在获取键输入以操作类中的几个变量时遇到问题。下面的静态函数key\u callback属于的最新版本/示例。我有一个带有基本相机坐标的渲染类,但我很难确定如何连接我的cam和偏航俯仰滚动变量,以便在按下键时进行更新 我尝试将静态函数移动到渲染器类中,尝试将cam变量设置为静态,但没有任何效果 在渲染器中.h GLfloat camX, camY, camZ, yaw, pitch, roll; 在main.cpp中 static void key_callback(GLFWwindow* w

我在获取键输入以操作类中的几个变量时遇到问题。下面的静态函数
key\u callback
属于的最新版本/示例。我有一个带有基本相机坐标的渲染类,但我很难确定如何连接我的cam和偏航俯仰滚动变量,以便在按下键时进行更新

我尝试将静态函数移动到渲染器类中,尝试将cam变量设置为静态,但没有任何效果

在渲染器中.h

GLfloat camX, camY, camZ, yaw, pitch, roll;
在main.cpp中

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    switch (key)
    {
        case GLFW_KEY_ESCAPE:
            glfwSetWindowShouldClose(window, GL_TRUE); <-- Works
            break;
        case GLFW_KEY_W: camZ += 0.1f; break; <-- What I'm trying to get
        case GLFW_KEY_S: camZ -= 0.1f; break;
        case GLFW_KEY_A: camX += 0.1f; break;
        case GLFW_KEY_D: camX -= 0.1f; break;
        case GLFW_KEY_E: yaw += 0.05f; break;
        case GLFW_KEY_R: yaw -= 0.05f; break;
    }
}

我曾经遇到过类似的回调问题,我解决问题的方法也不是特别优雅,但是我做了以下工作(翻译为匹配您的代码名,并假设您的代码是正确的):

在与主文件相同的文件中:

static void getKeyInput(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    key_callback(window, key, scancode, action, mods);
}
在实际的主要功能中:

glfwSetKeyCallback(window, Renderer::key_callback);
替换为:

glfwSetKeyCallback(window, getKeyInput);

希望这有帮助:)

我想出了一种方法(但我不认为这是目前为止最好的方法)

由于函数仍在main.cpp中,我创建了一个单独的Camera类,其中包含用于相机x、y、z、偏航、俯仰和滚动的基本getter和setter

因此,从那里(因为我不能在int main()之外使用渲染器类),我做了以下工作:

(includes)...
Camera cam;

static void getKeyInput(GLFWwindow* window, int key, int scancode, int action, int mods)
{ 
    GLfloat delta = 0.0f;
    switch (key)
    {
    case GLFW_KEY_ESCAPE:
        glfwSetWindowShouldClose(window, GL_TRUE);
        break;
    case GLFW_KEY_W: 
        delta = cam.getZ();
        delta += 0.1f;
        cam.setZ(delta);
        break; 
    ....

int main()
{
    GLFWwindow* window;
    Renderer rend;
    ...
    glfwSetKeyCallback(window, key_callback);
然后在主循环中,我将渲染函数更改为重载:

    rend.Render(cam.getX(), cam.getZ(), cam.getYaw());
按键现在可以工作了,但我看到的解决方案的唯一问题是,当第一次按下按键时,移动不是瞬间的

    rend.Render(cam.getX(), cam.getZ(), cam.getYaw());