如何在我的程序中调整 glm::lookAt() 以使用 WASD 键移动“相机”?

问题描述 投票:0回答:1

我已经使用 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 键环顾四周。相机看的方向几乎没有区别。

c++ glfw glm-math
1个回答
0
投票

如果你正确地格式化了你的函数,它会实际上看起来像这样:

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);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.