变换简介
总的来说变换分为三种:
- model transformation (假如你在照相的时候找到好的位置, 安排好人, 这个步骤类似叫做模型变换)
- view transformation (照相的找到一个好的角度, 比如相机朝向哪, 这个是视图变换)
- projection transformation (把3D的人冲洗到2D的图, 就是投影变换)
- 哈哈哈就是MVP变换
这次重点介绍视图变换
view transformation
- 指定相机位置:
- 相机看向哪:
- 相机的上方向, 很好理解, 比如说相机头可以朝向你, 但是镜头可以旋转, 你成像就歪了
key observation
初始条件
这里规定几个重要的初始条件:
- 相机位置一直在原点
- 相机初始朝向是 − z -z −z 方向
- 相机的上方向是y
相机从不同条件变换到初始条件
- 现在这个相机有个自己的e, g, t, 需要变换e到 (0, 0, 0), g 为 -z, t为y
这个怎么做呢? 把它分为3步:
- 把e平移到原点(先考虑平移再旋转比较简单)
- 把 g 旋转到 -z 方向, 把 t 旋转到 Y 方向, 把 (gxt) (叉乘)旋转到 X 方向
- 但是这样有些困难, 反过来就好写了, 比如把X(1, 0, 0, 0) 变换到 (gxt), 把Y(0, 1, 0, 0) 变换到 t
注意这里是向量, 最后一个维度的数是0, 比如X是(1, 0, 0, 0)
- 这里有个矩阵怎么求逆的问题, 其实这个问题很好解决, 因为这里是 旋转矩阵 所以它的逆就是它的 转置
- 所以通过这两步就求解了如何把任意的位置变换到相机初始位置
- 注意这里还要对物体做同样的变换, 因为要保持和相机的相对位置不变
投影简介
- 一般投影分为两类, 一种是 orthographic projiction (正交投影), 一种是perspective projection (透视投影)
左边的原来的平行关系不变, 右边的原来物体的平行关系发生了改变, 正交投影没有近大远小, 透视投影有
正交投影
把相机放在原点上, 向 -z 看, y是向上的方向
-
会发现只要把对应z的坐标扔掉其实就是图上的坐标, 现在有个问题是如何区分前和后呢? z被扔掉了
-
不管x和y范围多大, 都将其变换到[-1 , 1], 这是约定俗成的方法
-
总结图如下:
图形学中的一般做法
- 对于一个长方体将它中心平移到原点, 然后都缩放到 [-1, 1] 范围内
这里是如何判断前后呢? 是根据z的值来判断的, 因为相机指向的是-z, 所以离相机越近z的值就越大, 越远z就越小
矩阵表示
- 把先平移中心再变换的方式用矩阵表示
- 这里的变换scale可以这样理解, 原来的尺度是r-l, 现在的尺度是-1到1也就是2, 所以是r-l对应2
透视投影
- 在开始之前先考虑齐次坐标, 对于最后的一个维度的数只要不是0都可以进行简化, 所以x, y, z, 1都乘z还是不变, 还是一样的点
- 对于正交投影, 我们可以规定近和远两个平面 ,同样对于透视投影也可以定义这样两个平面, 注意是从右边投影到左边
- 定义近和远两个平面, 近平面不变, 中心点不变
下面左边的红点是相机的位置, 然后其向 -z 方向看, (x, y, z) 变到 (x’, y’, z’), 边有个比例关系
- 这里注意为啥z这里是unknown呢? 不应该是n吗, 其实这里把投影先看成挤压操作, 这个操作是平面内的, 不是投影, 所以中心点的z不变
现在把从(x, y, z, 1) 到 (nx/z, ny/z, unknown, 1) 的变换过程视作左乘一个矩阵, 既然表示一个点, 也就是说可以都乘z, 最后的矩阵变换就可以这样写:
这里有两个条件可以利用:
- 近平面的点经过映射后还是它自己
可以知道变换矩阵前面两个数是0, 也就是和x, y没有关系
- z平面的中心点挤压后 z值不变
- 求解A, B
- 最后再进行正交投影
- 总结来说就是先挤压, 后投影