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