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

  1. 找一个好的物体 model transformation
  2. 找一个好的角度 view transformation
  3. 拍照 projection transformation
  4. 得到照片

因为相机和物体一起进行变换,相对位置没变,之后改变相机位置就好

如何进行view transformation

拍照的过程

  1. 确定位置
  2. 确定look at(往哪儿看)
  3. 确定up direction(向上方向)

相机放在一个固定的位置,其他东西移动
相机永远在原点,看向-z轴,向上为y轴
可以让操作简化

transformation过程

  1. 将摄像机摆放好
    1. 移到原点
    2. look at转到-z
    3. 向上转到y

先平移再旋转
Mview = Rview Tview

这里思想很重要

但是直接写旋转不好写,将其他轴转到规范轴
所以求逆变换,因为旋转是正交的,求转置就好,不用直接求逆

Projection Transformation

  • Orthographic projection
  • Perspective projection

Orthographic projection

  1. 相机固定位置
  2. 扔掉z轴
  3. 将结果展到[-1,1]^2上

在xyz上定义一个标准立方体(canonical) cube

Perspective projection

  1. 先将透视的锥体压缩到标准立方体
    1. 近平面永远不变
    2. 远平面z不发生改变,远平面中心点不变
    3. 相似三角形算出y‘=(n/z)y,x’=(n/z)x
    4. z由特性得知,在近平面点不变
      1. 再由远平面上中心点也是不变的
      2. 得到一个二次方程
      3. A=n+f,B=-nf
  2. 再进行正交投影