- 旋转 θ \theta θ 的矩阵等于旋转 − θ -\theta −θ 的矩阵的逆
- 在旋转里,旋转的逆等于旋转矩阵的转置
- 在数学上,如果一个矩阵的逆等于他的转置,称之为正交矩阵
3D变化
-
3D point = (x, y, z, 1) ^T
-
3D vector = (x, y, z, 0) ^T
-
-
是先应用线性变换,再加一个平移量(与二维一样)
-
缩放
-
平移
-
旋转
-
绕x
-
绕y
因为是z 叉乘 x 才能的到y,所以 s i n α sin\alpha sinα符号反了
-
绕z
-
欧拉角旋转
- R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) R_{xyz}(\alpha, \beta,\gamma) = R_x(\alpha)R_y(\beta)R_z(\gamma) Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)
- 绕x, y, z轴的旋转变成pitch, yaw, roll
- 罗德里格斯旋转公式
- n是旋转轴, α \alpha α 是旋转角
- R ( n , α ) = c o s ( α ) I + ( 1 − c o s ( α ) ) n n T + s i n ( α ) [ 0 − n z n y n z 0 − n x − n y n x 0 ] R(n,\alpha) = cos(\alpha)I + (1 - cos(\alpha))nn^T + sin(\alpha)\left[ \begin{matrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \end{matrix} \right] R(n,α)=cos(α)I+(1−cos(α))nnT+sin(α)⎣⎡0nz−ny−nz0nxny−nx0⎦⎤
-
四元数
- 解决旋转与旋转之间的差值
-
Viewing(观测)Transformation
view 视图变换 / 相机变换
把3维中的物体变成二维的一张图
-
拍照过程
- 搭建模型 (modeling)
- 找一个好的角度来放置相机(视图变换)(view)
- 投影变换 (projection)简称MVP变换
-
什么是视图变换
-
先得定义相机
- Position e ⃗ \vec{e} e
- 相机朝向 g ^ \hat{g} g^
- 向上的方向 t ^ \hat{t} t^
-
如何进行视图变换
-
假定相机永远在原点,永远看向-z
-
先把 e ⃗ \vec{e} e平移到原点
-
再把 g ^ \hat{g} g^ 移向-z方向
-
所以是得先乘平移矩阵再考虑旋转
-
将旋转轴移向坐标轴不好直接求,可以考虑将坐标轴移向旋转轴并用他的逆变换
-
M v i e w = R v i e w T v i e w M_{view} = R_{view}T_{view} Mview=RviewTview
-
-
总结
- 用相机移动来变换物体
- 相机移到原点后,向上移到Y,看向方向移到-Z
- 这同时也叫做模型视图变换
-
Projection (投影)Transformation
-
Orthographic(正交) projection 投影
-
相当于相机无限远(成像效果)
-
将相机放到原点,看向-Z,向上方向为Y
-
将Z坐标扔掉、
-
将所有东西缩放到 [-1,1] 的正方形上
-
正式一点的做法
-
-
构建[l,r] * [b,t] * [f,n]的立方体
-
将立方体中心平移到原点
-
缩放成[-1,1] ** 3
-
-
(此时物体被拉伸,在之后进行视口变换后就能够恢复原有比例)
-
-
-
0,1Perspective (透视) projection 投影
-
简单来说,平行线不再平行
-
-
将远平面往里挤,挤成和近平面一样大小,再做一次正交投影
- 近平面不变
- 远平面z值不变
- 中心点连线不变
-
于是问题转换成了怎么去将Frustum挤压成cuboid
-
通过相似三角形计算
-
-
可以得到x’和x 与 y和y’的关系
-
-
那么可以知道,原始点乘完变换矩阵之后能够得到中间那个向量,再给他们乘个z
-
-
于是可以得到一个猜测矩阵
-
有两点已知现象
- 任何一个点在近平面运算完都不会发生变换
- 远的平面z不会发生变化
-
那么有
-
任何一个点在近平面运算完都不会发生变换
-
-
所以第三行只能是(0 0 A B)这种形式
-
-
远的平面z不会发生变化
-
-
远平面中心点不会发生变化
-
-
所以最终可以得到
-
最后透视投影矩阵就是
-
-
-