我无法获取键输入来操作类中的一些变量。下面的静态函数key_callback
属于 GLFW3的最新版本/示例。我有一个基本相机坐标的渲染类,但我无法弄清楚如何连接我的凸轮和偏航 - 俯仰 - 滚动变量,以便在按下按键时进行更新。
我已经尝试将静态函数移动到我的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)
答案 0 :(得分: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);
希望这会有所帮助:)
答案 1 :(得分:0)
我想出了一种做法(但我不相信这是迄今为止最好的方式)。
该功能仍然在 main.cpp 中,我创建了一个单独的Camera类,以及相机的x,y,z,偏航,俯仰,滚动的基本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());
键现在正常工作,但我在解决方案中看到的唯一问题是,当第一次按下键时,移动不是瞬时的。