坐标变换与矩阵乘法
主动视角与被动视角:坐标变换的双重理解
在图形学、线性代数中,我们经常接触各种矩阵变换。尤其是在理解坐标变换、相机矩阵等问题时,可以从主动视角与被动视角来理解。
一、主动视角:点在动,坐标系不动
在主动视角下,我们认为坐标系保持不变,而点的位置发生了变换。也就是说,我们是“主动”地对点施加某种操作,比如旋转、缩放等(平移需要三维齐次)。一个简单的例子:
$$ \begin{bmatrix} 2 & 0 \\ 0 & 3 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} 2x \\ 3y \end{bmatrix} $$这表示一个点 (x, y),在原始坐标系 $\vec{i}, \vec{j} $中,经过一个线性变换后被拉伸成了 (2x, 3y)。你可以理解为:点被沿 x 方向拉伸了 2 倍,沿 y 方向拉伸了 3 倍,坐标轴本身没有变。
二、被动视角:点不动,坐标系变了
被动视角与主动视角相对,它关注的是坐标系在变,而点的位置保持不动。
我们的问题变成了:已知一个点在旧坐标系中的坐标为 (x, y),现在更换了新的坐标轴(新的基底),我们希望知道这个点在新坐标系下的表示方式。
设原始坐标轴为 $\vec{i}, \vec{j}$,我们定义新的坐标轴为 $\vec{u}, \vec{v}$。假设:
$$\vec{i} = a\vec{u} + b\vec{v}, \quad \vec{j} = c\vec{u} + d\vec{v}$$
那么点的位置为:
$$\vec{p} = x\vec{i} + y\vec{j} = x(a\vec{u} + b\vec{v}) + y(c\vec{u} + d\vec{v}) = (xa + yc)\vec{u} + (xb + yd)\vec{v}$$
所以,在新基底 $\vec{u}, \vec{v}$ 下,点的坐标是:
\begin{bmatrix} xa + yc \\ xb + yd \end{bmatrix}
注意,这个变换可以写作矩阵乘以向量的形式 $$ \begin{bmatrix} a & c \\ b & d \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} ax + yc \\ bx + yd \end{bmatrix} $$ 但这个矩阵的意义发生了变化:
-
它不再表示“作用在点上的变换”,
-
而是“新坐标系如何描述旧坐标系”的变换。
换句话说,这个矩阵是将“旧坐标下的坐标”转换为“新坐标下的坐标”。
三、主动与被动:本质是同一个过程的两个视角
用一个非常简单直观的比喻来理解它们的等价性:
点向右移动一格,其实也可以理解为坐标系整体向左移动一格,而点没动。
换一个角度看,我们看到的“变化”到底是点变了,还是坐标系变了,取决于我们的参照系。这正是主动视角和被动视角的本质区别。
虽然在实际计算中,主动和被动视角都可以表示为“矩阵乘以向量”,但矩阵的含义不同:
理解这一点,可以帮助我们准确判断一个变换矩阵的“含义”和“上下文”。
四、相机的 LookAt 矩阵:一个典型的被动视角变换
在 3D 图形学中,我们通常用一个视图矩阵(View Matrix)将世界坐标系中的点转换为相机坐标系下的点。这实际上是一个被动视角的变换 —— 点在世界中是固定的,我们只是从相机的角度重新观察它们。
相机坐标系的三个轴向量:
-
$\vec{R}$:Right(右方向)
-
$\vec{U}$:Up(上方向)
-
$\vec{D}$:Direction(视线方向,通常是 Look 或 Forward)
我们的问题是:
世界坐标中的向量 $\vec{i}, \vec{j}, \vec{k}$,在相机坐标系 $\vec{R}, \vec{U}, \vec{D}$ 下是什么样的?根据上面的被动视角推导,我们可以这样理解相机视图矩阵的构成:
视图矩阵的每一列,本质上是将世界坐标轴中的基向量,例如 \(\vec{i}\)用相机坐标系下的基向量 \(\vec{R}、\vec{U}、\vec{D}\)表示出来。
以世界坐标系中的 $\vec{i} $向量为例,它在相机坐标系中的表示应该满足:
由于 \(\vec{R}、\vec{U} 、\vec{D}\)都可以用\(\vec{i}, \vec{j}, \vec{k}\) 表示,(即它们在世界坐标系中的分量是 ( (R_x, R_y, R_z) ) 等)。我们是用\(\vec{R}、\vec{U} 、\vec{D}\)来表示是 \(\vec{i} = (1, 0, 0)\),从投影来看,对\(\vec{i}\)产生贡献的,只有 ( R_x )、( U_x )、( D_x )分量。
也就是说,相机视图矩阵的第一列构成为R_x,U_x,U_y,整个相机矩阵如下:
这个矩阵 $M_{\text{view}}$,将世界坐标中的点 $\vec{p}$ 映射为相机坐标系下的表示:
$$\vec{p}{\text{camera}} = \begin{bmatrix} R_x & R_y & R_z \\ U_x & U_y & U_z \\ D_x & D_y & D_z \end{bmatrix} \cdot \vec{p}{\text{world}}$$
这个矩阵中的每一行,实际上是原始世界坐标轴在相机坐标系中的投影(即相机“看”向世界坐标轴的方式),正体现了“新坐标系下描述旧坐标系”的思路。换言之,这是一个被动视角矩阵。
五、总结
-
主动视角:我们改变点的“物理位置”,坐标系不动。
-
被动视角:我们改变“观察角度”或“基底”,点本身不变。
-
数学形式上,两者都可以写作“矩阵乘以向量”,但矩阵的含义不同:
-
主动:矩阵是作用在点上的变换;
-
被动:矩阵是新坐标系描述旧坐标系的方式。
-
-
在图形学中:
-
模型矩阵(Model Matrix)通常是主动视角;
-
相机矩阵(View Matrix)是被动视角。
-

浙公网安备 33010602011771号