0

我无法获得关键输入来操作类中的一些变量。下面的静态函数key_callback属于GLFW3的最新版本/示例。我有一个带有基本相机坐标的渲染类,但是我无法弄清楚如何连接我的 cam 和 yaw-pitch-roll 变量以在按下键时进行更新。

我尝试将静态函数移动到我的 Renderer 类中,尝试将我的 cam 变量设为静态,但没有任何效果。

Renderer.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;
    }
}

int main()内

GLFWwindow* window;
Renderer rend;
....
glfwSetKeyCallback(window, key_callback);
rend.Initialize();
(Main loop)
4

2 回答 2

0

我在回调方面遇到了类似的问题,我能够解决它的方式并不是特别优雅,但是我做了以下事情(翻译成与您的代码名称相匹配,并假设您的代码是正确的):

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

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);

希望这可以帮助:)

于 2013-11-03T11:58:07.423 回答
0

我想出了一种方法(但我不相信这是迄今为止最好的方法)。

由于该函数仍在main.cpp 中,我创建了一个单独的 Camera 类,以及用于相机 x、y、z、yaw、pitch、roll 的基本 getter 和 setter。

所以从那里(因为我不能在 int main() 之外使用我的 Renderer 类),我这样做了:

(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);

然后在主循环中,我将 Render 函数更改为重载:

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

按键现在可以工作,但我在解决方案中看到的唯一问题是第一次按下按键时移动不是瞬时的。

于 2013-11-03T18:06:30.843 回答