变换(模型、视图、投影)
三维变换
- 仿射变换
- 三维旋转变换
- 逆时针角度为正
- 右手系原因,y轴逆时针看去是 zox 平面,所以转角应该是 − α -\alpha −α
- 也可理解为
-
z
×
x
=
y
,
x
×
z
=
−
y
z \times x = y\ , \quad x \times z = -y
z×x=y ,x×z=−y
-
z
×
x
=
y
,
x
×
z
=
−
y
z \times x = y\ , \quad x \times z = -y
z×x=y ,x×z=−y
- Rodrigues’ Rotation Formula
- 给定过原点旋转轴 n, 旋转角 α \alpha α,旋转矩阵如下
- 非过原点轴,先把轴平移到原点,旋转,再平移回去
- 四元数(略)
观测变换(Viewing transformation)
视图 (View)
- 什么是视图变换
- 模型变换与视图变换,两者通常一同处理
- 改变模型动作,模型变换
- 改变相机视角,视图变换
- 拍照,相当于投影变换
- 为什么要模型 / 视图变换
- 因为模型有很多顶点
- 这些顶点坐标是模型空间下的
- 需要移动到世界坐标
- 所以要做模型变换
定义相机
- 位置 / position e ⃗ \quad \vec{e} e
- 朝向 / gaze direction g ^ \quad \hat{g} g^
- 向上方向 / Up direction t ^ \quad \hat{t} t^
- 约定俗成的相机
- 永远放在原点
- 永远朝向 − Z -Z −Z
- t ^ = Y \hat{t} = Y t^=Y
如何将相机移动到约定俗成位置
- 相机变换过程
- 平移到原点
- 旋转 g ^ = − Z \ \hat{g} = -Z g^=−Z
- 旋转 t ^ = Y \ \hat{t} = Y t^=Y
- 旋转 g × t = X \ g \times t = X g×t=X
- 相机变换矩阵推导(旋转矩阵可以逆向思维)
投影 (Projection)
- 3D到2D
- 正交是垂直
- 透视投影平行线不再平行
- 近大远小
正交(Orthography) M o \quad M_o Mo
- 简单的正交投影
- Z归零
- 归一化 [ − 1 , 1 ] \ [-1,\ 1] [−1, 1]
- 常规的正交投影
- 立方体中心平移到原点
- 边长归一化 [ − 1 , 1 ] \ [-1,\ 1] [−1, 1]
- 正交变换矩阵如下:
透视(Perspective) M p \quad M_p Mp
- 特点
- 最广泛的投影
- 近大远小
- 平行线不再平行
- 投影方法
- 从透视变换到正交
- 正交投影
- 假设显示屏幕距原点距离为 n \ n n
- 透视到投影矩阵推导(根据以下三个点)
- 通俗的讲,把梯形压缩成长方形
- 中间点等比例变换
- 近平面、远平面上的 Z Z Z 坐标不变
- 通俗的讲,把梯形压缩成长方形
(
x
,
y
,
z
,
1
)
→
(
x
′
,
y
′
,
z
,
1
)
(
x
′
,
y
′
,
z
′
,
1
)
→
(
x
′
,
y
′
,
z
′
,
1
)
(x, y, z, 1) \rightarrow (x', y', z, 1) \quad \quad (x', y', z', 1) \rightarrow (x', y', z', 1)
(x,y,z,1)→(x′,y′,z,1)(x′,y′,z′,1)→(x′,y′,z′,1)
- 透视变换矩阵如下
M p = M o ⋅ ( n 0 0 0 0 n 0 0 0 0 n + z − n z 0 0 1 0 ) M_p = M_o \cdot \left( \begin{matrix} n & 0 & 0 & 0 \\ 0 & n & 0 & 0 \\ 0 & 0 & n+z & -nz \\ 0 & 0 & 1 & 0 \end{matrix} \right) Mp=Mo⋅⎝⎜⎜⎛n0000n0000n+z100−nz0⎠⎟⎟⎞