如题,最近刚开始用glfw+glad开发opengl,想用WSAD控制模型的移动,每按一次移动一步。我是利用矩阵平移来传递参数的,在用glfwGetKey函数进行键盘调用时,
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
updown += 0.15;
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
updown -= 0.15;
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
leftright -= 0.15;
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
leftright += 0.15;
}
每按一下,模型一直在移动,上网查了一下说可以利用回调函数解决,然而我在写了回调函数后还是一样的情况。反复思考,左右横跳,突然找到了问题所在:
trans = glm::translate(trans, glm::vec3(leftright, updown, 0));
unsigned int transformLoc = glGetUniformLocation(shaderProgram, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
glUseProgram(shaderProgram);
// render the triangle
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, f_num, GL_UNSIGNED_INT, 0);
// 每次绘制一次
updown = 0;
leftright = 0;
因为之前updown和leftright有值后,每次窗口绘制都会进行矩阵平移,而窗口是在不停调用的,所以模型会不断平移。因此,我们只需在每次绘制结束时把updown和leftright值重新赋成0就可以了。