我已经使用 OpenGL 创建了一个地平面,并尝试在按下 W 时向前移动“相机”,在按下 S 时向后移动,在按下 D 时向右看,在按下 A 时向左看。我想继续前进地平面而不是沿 z 轴。
这些是我在显示功能中设置的值:
cx = 0.0f + eyex;
cy = 0.0f + eyey;
cz = 0.0f;
view = glm::lookAt(glm::vec3(eyex, eyey, eyez),
glm::vec3(cx, cy, cz),
glm::vec3(0.0f, -1.0f, 0.0f));
其中 (cx, cy, cz) 是相机观察的方向。
这些是我在主函数中设置的初始值:
eyex = 0.0;
eyey = 0.0;
eyez = 5.0;
theta = 3.14f;
r = 50.0;
这是我的 key_callback 函数:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
const float cameraSpeed = 1.0f;
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GLFW_TRUE);
if (key == GLFW_KEY_A && action == GLFW_PRESS)
theta -= 0.5;
cx = r*sin(theta);
cy = r*cos(theta);
if (key == GLFW_KEY_D && action == GLFW_PRESS)
theta += 0.5;
cx = r*sin(theta);
cy = r*cos(theta);
if (key == GLFW_KEY_W && action == GLFW_PRESS)
eyex = eyex + cameraSpeed * r * sin(theta);
eyey = eyey + cameraSpeed * r * cos(theta);
if (key == GLFW_KEY_S && action == GLFW_PRESS)
eyex = eyex - cameraSpeed * r * sin(theta);
eyey = eyey - cameraSpeed * r * cos(theta);
}
问题
当我按下 W 和 S 时,我只沿着 x 轴移动,而不是 y 轴。而且我无法使用 A 和 D 键环顾四周。相机看的方向几乎没有区别。
如果你正确地格式化了你的函数,它会实际上看起来像这样:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
const float cameraSpeed = 1.0f;
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GLFW_TRUE);
if (key == GLFW_KEY_A && action == GLFW_PRESS)
theta -= 0.5;
cx = r*sin(theta);
cy = r*cos(theta);
if (key == GLFW_KEY_D && action == GLFW_PRESS)
theta += 0.5;
cx = r*sin(theta);
cy = r*cos(theta);
if (key == GLFW_KEY_W && action == GLFW_PRESS)
eyex = eyex + cameraSpeed * r * sin(theta);
eyey = eyey + cameraSpeed * r * cos(theta);
if (key == GLFW_KEY_S && action == GLFW_PRESS)
eyex = eyex - cameraSpeed * r * sin(theta);
eyey = eyey - cameraSpeed * r * cos(theta);
}
(我还放了一些换行符以使问题更加明显)。
在 C/C++ 中缩进并不重要。所以,你应该在你的 if-arms 中的语句周围加上花括号:
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
const float cameraSpeed = 1.0f;
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GLFW_TRUE);
}
if (key == GLFW_KEY_A && action == GLFW_PRESS) {
theta -= 0.5;
cx = r*sin(theta);
cy = r*cos(theta);
}
if (key == GLFW_KEY_D && action == GLFW_PRESS) {
theta += 0.5;
cx = r*sin(theta);
cy = r*cos(theta);
}
if (key == GLFW_KEY_W && action == GLFW_PRESS) {
eyex = eyex + cameraSpeed * r * sin(theta);
eyey = eyey + cameraSpeed * r * cos(theta);
}
if (key == GLFW_KEY_S && action == GLFW_PRESS) {
eyex = eyex - cameraSpeed * r * sin(theta);
eyey = eyey - cameraSpeed * r * cos(theta);
}
}