Transformation
Why
主要有两种变换
- 模型变换
- 视图变换
从三维世界到二维平面的投影
基础变换
- 缩放
- 旋转
- 切变
缩放
(x, y) –> (sx, sy)
切变
(x, y) –> (x+ay, y)
(x, y) –> (x, y+bx)
旋转
旋转默认逆时针旋转
旋转的逆矩阵就是旋转的转置
旋转矩阵是正交矩阵
(x, y)–> (ax+by, cx+dy)
齐次坐标
线性变换矩阵无法表示平移变换
(x, y) –> (x+tx, y+ty)
- 平移
引入齐次坐标就是为了能将平移变换也纳入线性变换的形式
2D 点 = (x, y, 1)
2D 向量 = (x, y, 0)
为什么为0,因为向量表示一种方向性,具有平移不变性,做任何平移还是等于原来的向量
可进行的操作:
- 向量 + 向量 = 向量
- 点 - 点 = 向量
- 点 + 向量 = 点
- 点 + 点 = 表示这两个点的中点
仿射变换
通过齐次坐标的形式
(x, y, 1) –> (x’, y’, 1)
复合变换
变换顺序是非常重要的,矩阵不满足交换律
变换是从右到左的顺序进行的
先应用线性变换,再平移
分解复杂的变换
举例
MVP
缩放
平移
两个同2d空间类似旋转
绕y轴比较特殊
3D旋转
可以将任意旋转分解成Rxyz = Rx Ry Rz
罗德里格斯旋转公式
View Transformation
- 找一个好的物体 model transformation
- 找一个好的角度 view transformation
- 拍照 projection transformation
- 得到照片
因为相机和物体一起进行变换,相对位置没变,之后改变相机位置就好
如何进行view transformation
拍照的过程
- 确定位置
- 确定look at(往哪儿看)
- 确定up direction(向上方向)
相机放在一个固定的位置,其他东西移动
相机永远在原点,看向-z轴,向上为y轴
可以让操作简化
transformation过程
- 将摄像机摆放好
- 移到原点
- look at转到-z
- 向上转到y
先平移再旋转
Mview = Rview Tview
这里思想很重要
但是直接写旋转不好写,将其他轴转到规范轴
所以求逆变换,因为旋转是正交的,求转置就好,不用直接求逆
Projection Transformation
- Orthographic projection
- Perspective projection
Orthographic projection
- 相机固定位置
- 扔掉z轴
- 将结果展到[-1,1]^2上
在xyz上定义一个标准立方体(canonical) cube
Perspective projection
- 先将透视的锥体压缩到标准立方体
- 近平面永远不变
- 远平面z不发生改变,远平面中心点不变
- 相似三角形算出y‘=(n/z)y,x’=(n/z)x
- z由特性得知,在近平面点不变
- 再由远平面上中心点也是不变的
- 得到一个二次方程
- A=n+f,B=-nf
- 再进行正交投影