
旋转矩阵的逆等于旋转矩阵的逆(正交矩阵)。
任意旋转可以分解为分别绕xyz轴的旋转的组合。
罗德里格斯旋转公式。
万向节死锁
四元数
视图变换
定义相机
- 位置
- 视角方向
- 上向量
vec3 position; |
约定屏幕垂直向外为z轴正方向,横向向右是x轴正方向,竖向向上是y轴正方向。
首先,世界坐标是正常的坐标,每个物体有它自己的坐标,大小和方向。然后摄像机要看到这些物体,就得知道这些物体相对于摄像机的位置,也就是相对于以相机的位置为原点,相机面向方向为-z,上方向为y,做出的坐标轴的位置。这个问题本质上就是有两个已知的坐标轴,知道这两个坐标轴的相对位置、方向,同时知道物体相对于其中一个坐标轴(世界坐标)的位置,求此物体相对于另一个坐标轴的位置。
可以通过两次旋转和一次平移来完成。
LookAt矩阵
上面已经分析了视图从世界坐标如何变换到摄像机坐标了,那么变换矩阵如何推到呢?
首先要算出从世界坐标到摄像机坐标的变换矩阵,需要一定的参数:
- 摄像机的位置(在世界坐标中)
- 视线的方向
- 上方向(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轴)。
计算摄像机的三个正交基向量:
视线方向(W轴):
$$ W = \text{normalize}(\text{eyePos} - \text{targetPos}) $$
(指向摄像机后方,因OpenGL视图空间Z轴为负)。右方向(U轴):
$$ U = \text{normalize}(\text{upDir} \times W) $$
(叉积保证与W和upDir
正交)。上方向(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范围内,然后再做正交投影。
- 本文标题:Games101-04-transformation-cont
- 创建时间:2025-02-21 20:54:00
- 本文链接:2025/02/21/note/Job/Learning/101/04-transformation-cont/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!