目录
view/camera transformation
1 相机初始化
2 相对变换
相对变换:只要保证相机和物体的相对位置不变,那整体就不发生改变。
默认相机放在(0, 0, 0), 看向 -z 方向
3 如何做到步骤2?
相机位置从 e 到原点,观测方向从 g 到 -z,相机向上方向(向上方向:比如方向盘上放一个棍,棍的指向随方向盘转动而变化)从 t 到 Y,(g 叉乘 x)方向旋转到 X。
4 计算
可以看到, R v i e w − 1 R_{view}^{-1} Rview−1 如果右乘一个向量 X: [ 1 0 0 0 ] T [1\ 0\ 0\ 0]^{T} [1 0 0 0]T,得到(g叉乘t)向量,同时可以验证得到从向量 Y: [ 0 1 0 0 ] T [0\ 1\ 0\ 0]^{T} [0 1 0 0]T 旋转到 t 方向,从向量 Z 旋转到 -g 方向。因为旋转矩阵的逆等于旋转矩阵的转置(偶旋转矩阵是正交矩阵),得到旋转矩阵 R v i e w R_{view} Rview。
5 总结
Projection Transformation 投影变换
正交投影和透视投影
右边透视投影,近大远小。
右边正交投影即假设把透视投影的相机拿的无限远。
正交投影
1 简单做法
简单做法:直接去掉 z,保留x y坐标,再把 x y 坐标变到-1~1之间。
2 正规做法
(1) 长方体中心平移到原点;
(2) X Y Z 变成 -1~1。
(注:看的是 -z 方向,所以物体越远,z 越小)
3 计算
注:opengl左手坐标系
透视投影
透视变换过程
(1) 把左边的frustnum挤压成右边的cuboid的形状
(2) 从远平面到近平面左正交变换
规定:1. 近平面永远不变
2. 远平面的 z 不变
3. 远平面的中心点挤压完还是中心点
挤压过程计算
利用:
(1) 近平面所有点不变, (x y n 1)挤压完还是(x y n 1),这里 n 是指近平面的 z 坐标
(2) 远平面的 z 不变,远平面中心点 (0 0 f) 挤压完还是 (0 0 f)
利用(1)