观察变换

观察变换

观察变换作用是决定摄像机从哪看,看向哪里,以及怎么看,也就是模拟一个眼睛在三维坐标里的位置和朝向。

实现:使用 观察矩阵 ,把世界中的所有物体的坐标,从世界坐标系变换到局部坐标系。

代码实现

实践中无需手动求出观察矩阵,只需指定3个重要的参数:

  • 摄像机位置

    cameraPos:摄像机在世界坐标系里的位置

  • 观察目标点

    cameraTarget:摄像机看向哪个点

  • 上方向

    upVector:摄像机头顶的方向

将3个参数传入 glm::lookAt() 函数,即求解出观察矩阵。

示例:

1
2
3
4
5
6
glm::vec3 cameraPos   = glm::vec3(0.0f, 0.0f, 3.0f);   // 摄像机在世界坐标系的位置:Z轴正方向3单位
glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);  // 摄像机看向原点
glm::vec3 cameraUp    = glm::vec3(0.0f, 1.0f, 0.0f);   // 摄像机的上方向是世界Y轴正方向

// 观察矩阵(View Matrix)的计算
glm::mat4 view = glm::lookAt(cameraPos, cameraTarget, cameraUp);

OpenGL 的历史和设计遵循 Y 轴向上的约定。

自由视角

之前生成观察矩阵使用的三个参数中,决定看向哪的参数是一个点。这就导致移动摄像机的位置后,要保持“朝前看”的效果,就要同时更新目标点。

因此可以将第二个参数 cameraTarget 改成 cameraFront ,原生成矩阵的参数更改为:

1
view = lookAt (camearaPos, cameraPos + cameraFront, cameraUp)

这样改变摄像机位置后,视角仍然朝前。

Licensed under CC BY-NC-SA 4.0
最后更新于 2025年12月16日 23:23
使用 Hugo 构建
主题 StackJimmy 设计