Games101-04-transformation-cont
Dionysen

旋转矩阵的逆等于旋转矩阵的逆(正交矩阵)。

任意旋转可以分解为分别绕xyz轴的旋转的组合。

罗德里格斯旋转公式。

万向节死锁

四元数

视图变换

定义相机

  • 位置
  • 视角方向
  • 上向量
vec3 position;
vec3 direction;
vec3 Up;

约定屏幕垂直向外为z轴正方向,横向向右是x轴正方向,竖向向上是y轴正方向。

首先,世界坐标是正常的坐标,每个物体有它自己的坐标,大小和方向。然后摄像机要看到这些物体,就得知道这些物体相对于摄像机的位置,也就是相对于以相机的位置为原点,相机面向方向为-z,上方向为y,做出的坐标轴的位置。这个问题本质上就是有两个已知的坐标轴,知道这两个坐标轴的相对位置、方向,同时知道物体相对于其中一个坐标轴(世界坐标)的位置,求此物体相对于另一个坐标轴的位置。

可以通过两次旋转和一次平移来完成。

LookAt矩阵

上面已经分析了视图从世界坐标如何变换到摄像机坐标了,那么变换矩阵如何推到呢?

首先要算出从世界坐标到摄像机坐标的变换矩阵,需要一定的参数:

  1. 摄像机的位置(在世界坐标中)
  2. 视线的方向
  3. 上方向(WorldUp,即世界坐标中的Y轴方向)

视线的方向是摄像机坐标z轴的负方向,此时我们只确定了一个坐标轴的方向,然后通过与世界坐标的Y轴叉乘,可以得到一个与Z轴垂直的x轴,因为摄像机的上方向虽然不确定,但我们为了保证摄像机看到的物体不会歪,摄像机坐标的上方向会与摄像机z轴与世界坐标Y轴所在的平面共面,故而Y与z叉乘的得到的就是摄像机坐标的x轴。

然后再用x轴叉乘z轴,得到y轴。所有叉乘的结果都标准化为单位向量,便于计算。

此时我们得到了在世界坐标中摄像机坐标三个轴的方向向量。同时我们又有摄像机的位置。位置可以通过平移变换,方向可以通过旋转变换。

由于旋转矩阵都是正交矩阵,其逆矩阵等于其转置矩阵。因此直接将三个轴组成的矩阵转置即可得到变换矩阵的逆矩阵。

LookAt矩阵的本质

LookAt矩阵是一个4x4齐次变换矩阵,作用是将世界坐标系下的顶点坐标转换到以摄像机为原点的坐标系(视图空间)。其核心是:

  • 平移:将摄像机位置移动到世界坐标系原点。
  • 旋转:将摄像机的局部坐标系(U/V/W轴)对齐到标准坐标系(X/Y/Z轴)。
推导步骤
(1) 定义摄像机坐标系

给定参数:

  • 摄像机位置 eyePos(世界坐标)。
  • 目标点 targetPos(视线方向)。
  • 上方向 upDir(通常为世界坐标的Y轴)。

计算摄像机的三个正交基向量:

  1. 视线方向(W轴)
    $$ W = \text{normalize}(\text{eyePos} - \text{targetPos}) $$
    (指向摄像机后方,因OpenGL视图空间Z轴为负)。

  2. 右方向(U轴)
    $$ U = \text{normalize}(\text{upDir} \times W) $$
    (叉积保证与W和upDir正交)。

  3. 上方向(V轴)
    $$ V = \text{normalize}(W \times U) $$
    (修正upDir可能不与W垂直的情况)。

(2) 构造旋转矩阵

将摄像机坐标系(U/V/W)对齐到世界坐标系(X/Y/Z)的旋转矩阵 R 是正交矩阵,其逆矩阵等于转置矩阵:
$$
R = \begin{bmatrix}
U_x & U_y & U_z & 0 \
V_x & V_y & V_z & 0 \
-W_x & -W_y & -W_z & 0 \
0 & 0 & 0 & 1
\end{bmatrix}
$$

(3) 构造平移矩阵

将摄像机位置平移至原点的平移矩阵 T
$$
T = \begin{bmatrix}
1 & 0 & 0 & -\text{eyePos}_x \
0 & 1 & 0 & -\text{eyePos}_y \
0 & 0 & 1 & -\text{eyePos}_z \
0 & 0 & 0 & 1
\end{bmatrix}
$$

(4) 合并为LookAt矩阵

视图矩阵是旋转和平移的复合变换:
$$
M_{\text{View}} = R \cdot T = \begin{bmatrix}
U_x & U_y & U_z & -U \cdot \text{eyePos} \
V_x & V_y & V_z & -V \cdot \text{eyePos} \
-W_x & -W_y & -W_z & W \cdot \text{eyePos} \
0 & 0 & 0 & 1
\end{bmatrix}
$$


关键点
  • 正交矩阵性质:旋转矩阵的逆等于转置,简化计算。
  • 右手坐标系:OpenGL中摄像机Z轴指向屏幕内(负方向)。
  • 基变换:LookAt矩阵本质是将世界坐标系的基向量变换为摄像机坐标系的基向量。

投影变换

正交投影相等于透视投影的相机无限远。

透视投影可以理解为将视锥体挤压到NDC范围内,然后再做正交投影。

显示评论