1-9摄像机

46 阅读1分钟

在观察矩阵中,需要定义一个摄像机,包含世界空间的位置,观察方向和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;
  ...
}