相机到底是什么?

预计阅读时间: 5 分钟
本质认识

所谓摄像机,不过是一个矩阵而已。所有的变换,都只是对这个矩阵的变换,在计算机图形学中并没有真正意义上的"相机"。

观察空间(View Space)

讨论摄像机/观察空间(Camera/View Space)时,我们实际上是在讨论以摄像机视角作为场景原点时场景中所有顶点的坐标。观察矩阵(View Matrix)负责将所有世界坐标变换为相对于摄像机位置与方向的观察坐标。

观察空间示意图

相机矩阵推导

要构建相机矩阵,通常需要以下前提条件:

  1. 相机的位置,如:(0, 0, 3)
  2. 相机的目标方向,如:(0, 0, 0)
  3. 世界坐标的向上方向,通常为:(0, 1, 0)

相机的移动实际上是通过改变观察矩阵来实现的。例如,鼠标移动时,我们会根据鼠标的前后变化位置计算各个向量分量,最后应用于观察矩阵的变化。

LookAt矩阵

LookAt矩阵示意图

在计算机图形学中,lookAt矩阵和view矩阵都用于定义摄像机的位置和方向,但它们在实现方式上有所不同。

LookAt矩阵

lookAt矩阵用于将世界坐标系中的点转换到摄像机坐标系中。它通常由三个参数来定义:

  • 摄像机的位置(eye)
  • 目标点(look-at point)
  • 向上向量(up vector)

lookAt矩阵的计算步骤:

  1. 首先计算从摄像机位置到目标点的Z轴(forward vector)
  2. 然后计算X轴,通常使用向上向量和Z轴的叉乘来得到
  3. 接着计算Y轴,使用Z轴和X轴的叉乘
  4. 将这些向量归一化,并构造出一个旋转矩阵
  5. 将摄像机平移至目标点的相反方向,以完成lookAt矩阵

View矩阵

view矩阵,也称为摄像机矩阵或观察矩阵,通常指将世界坐标系中的点转换到摄像机坐标系中的矩阵。

区别说明

在某些上下文中,view矩阵可能与lookAt矩阵相同,但在其他情况下,view矩阵可能包括更广泛的摄像机设置,如视野(field of view)、纵横比(aspect ratio)和近远裁剪平面(near and far clipping planes)。

总的来说,lookAt矩阵是创建view矩阵的一种特定方法,它专注于摄像机的位置和朝向。在某些实现中,这两个术语可能会互换使用,但在更严格的计算机图形学定义中,view矩阵可能包含lookAt矩阵以外的其他摄像机参数。

投影矩阵(Projection Matrix)

除了观察矩阵,相机还涉及投影矩阵,用于将3D场景投影到2D屏幕上。主要有两种投影方式:

  1. 透视投影(Perspective Projection):模拟人眼视觉,远处的物体看起来更小
  2. 正交投影(Orthographic Projection):保持物体原始大小,不考虑深度

投影矩阵与观察矩阵结合,最终决定了场景中物体在屏幕上的显示方式。

哲学思考

你所认识的世界,都是对世界的抽象,有时候很难分清抽象与事物本身的关系。

Three.js中的相机实现

在Three.js中,相机主要分为两类:

  • PerspectiveCamera:透视相机,模拟人眼视觉
  • OrthographicCamera:正交相机,不考虑透视效果

Three.js内部通过计算viewMatrixprojectionMatrix实现相机功能。