在观察矩阵中,需要定义一个摄像机,包含世界空间的位置,观察方向和right和up
摄像机位置:
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
摄像机方向:
glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);//目标位置
glm::vec3 cameraDirection = glm::normalize(cameraPos - cameraTarget);//方向向量
right向量:
glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f); //世界向上
glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
up上轴:
glm::vec3 cameraUp = glm::cross(cameraDirection, cameraRight);
Look At:
创建给定目标的观察矩阵
glm::mat4 view;
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), //位置
glm::vec3(0.0f, 0.0f, 0.0f), //目标
glm::vec3(0.0f, 1.0f, 0.0f));//上坐标
定义一个processInput函数来执行按键命令
void processInput(GLFWwindow *window)
{
float cameraSpeed = 0.05f; //移动速度
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
cameraPos += cameraSpeed * cameraFront;
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)
cameraPos -= cameraSpeed * cameraFront;
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
cameraPos -= glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
cameraPos += glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
}
计算deltaTime
float deltaTime = 0.0f; // 当前帧与上一帧的时间差
float lastFrame = 0.0f; // 上一帧的时间
float currentFrame = glfwGetTime();
deltaTime = currentFrame - lastFrame;
lastFrame = currentFrame;
void processInput(GLFWwindow *window)
{
float cameraSpeed = 2.5f * deltaTime;
...
}