坐标变换与矩阵乘法

主动视角与被动视角:坐标变换的双重理解

        在图形学、线性代数中,我们经常接触各种矩阵变换。尤其是在理解坐标变换、相机矩阵等问题时,可以从主动视角被动视角来理解。

一、主动视角:点在动,坐标系不动

        在主动视角下,我们认为坐标系保持不变,而点的位置发生了变换。也就是说,我们是“主动”地对点施加某种操作,比如旋转、缩放等(平移需要三维齐次)。一个简单的例子:

$$ \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} $向量为例,它在相机坐标系中的表示应该满足:

\[? \cdot \vec{R} + ? \cdot \vec{U} + ? \cdot \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,整个相机矩阵如下:

\[\begin{bmatrix} R_x & R_y & R_z \\ U_x & U_y & U_z \\ D_x & D_y & D_z \end{bmatrix} \]

这个矩阵 $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)是被动视角

posted @ 2025-06-24 23:45  chendaxian  阅读(78)  评论(0)    收藏  举报