摄像机


需要三个向量:

  1. 摄像机位置:

    • glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
    • 一个从世界原点指向摄像机的向量
  2. 摄像机方向:

    • 1
      2
      glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);
      glm::vec3 cameraDirection = glm::normalize(cameraPos - cameraTarget);
      
    • 指向摄像机的z轴正方向(与摄像机面对的方向刚好相反)

  3. 右轴:

    • 需要一个右向量代表摄像机的x轴,利用叉乘

    • 1
      2
      glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f); 
      glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
      
    • up即为向空间正上方的一个向量(大部分情况下这么做够用了)


Look At矩阵


自由移动

处理按键输入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void processInput(GLFWwindow *window)
{
    ...
    float cameraSpeed = 0.05f; // adjust accordingly
    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;
}

移动速度

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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;
  ...
}

欧拉角


鼠标输入


缩放