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

cyej8jka  于 2023-02-22  发布在  其他
关注(0)|答案(1)|浏览(138)

我已经使用OpenGL创建了一个地平面,并尝试在按W键时向前移动"相机",在按S键时向后移动,在按D键时向右看,在按A键时向左看。我希望在地平面上移动,而不是沿z轴移动。
以下是我在display函数中设置的值:

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)是摄像机观察的方向。
这些是我在main函数中设置的初始值:

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键环顾四周,摄像机看的方向几乎没有什么不同。

ndasle7k

ndasle7k1#

如果你已经正确地格式化了你的函数,它 * 实际上 * 看起来应该是这样的:

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-arm语句的两边加上大括号:

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

相关问题