旋转θ和旋转-θ的矩阵区别
- 可以看到 旋转 -θ 矩阵是旋转 θ 的转置(行列互换)
- 从定义上来看,旋转 θ 和旋转 -θ 是一个互逆操作
- 因此在旋转中,旋转是正交矩阵,旋转的逆=旋转的转置
三维变换3D Transformations
使用4x4的矩阵表示三维的仿射变换,跟二维一样,三维变换先用线性变换后再进行平移变换
缩放矩阵
平移矩阵
旋转矩阵
绕X轴旋转
绕Y轴旋转
绕Z轴旋转
问题
为啥绕Y旋转和绕X/Z旋转规律不一致?
- 需要考虑轴的相互顺序
- x/y/z 都可以通过其他两个向量叉乘得到
- xy=z,yz=x
- 但是 y=zx,而不是 y=xz
3D旋转
观测变换 Viewing transformation
如何拍摄一张照片?
- 找到一个好的位置,集合所有人员(模型变换 model transformation)
- 找一个好的位置,摆好一个好的角度(视图变换 view transformation)
- 拍照(投影变换 projection transformation)
视图变换 View / Camera Transformation
先定义相机基本属性
- 相机位置
- 相机朝哪看
- 相机向上方向
预先约定相机
- 位置在原点(0,0,0)
- 永远向-z方向看
- 永远以Y轴为向上方向
- 永远是模型在进行移动(相对运动)
相机进行平移旋转
- 将相机平移到远点
- 旋转视角方向到-z
- 旋转向上方向到Y
- 旋转上述两方先后自然X方向能对上
如何求矩阵
- 根据前文所说旋转是正交矩阵,旋转的逆=旋转的转置
- 因此将旋转到x,y,z轴上的点,代入到旋转逆矩阵
- 下图左下角那逆矩阵可以代入x,y,z的点可以求得
- 再转置就可以得到所求对应矩阵
投影变换 Projection transformation
正交投影,不会带来近大远小的效果:
透视投影:
正交投影 Orthographic Projection
- 相机位于原点,看向-Z,向上方向为Y
- 丢弃掉所有Z坐标,所有内容都在xy上
- 所有的内容都在xy都为-1~1的矩形上
- 在X轴上定义了左l和右r,[l,r]
- Y轴定义了 [ b,t],下和上
- Z轴定义了 [f,n],远和近,因为相机看向的是-z方向,远的物体z轴会越小
- 然后通过平移缩放变成标准立方体
矩阵
- 先将中心点平移得到最右侧平移矩阵
- 再将x,y,z进行缩放[-1,1]范围
透视投影 Perspective Projection
回顾齐次坐标
- (x, y, z, 1), (kx, ky, kz, k != 0), (xz, yz, z2, z != 0) 在3维空间中都表示的是同样的点 (x, y, z)
- 例如 (1, 0, 0, 1) 和(2, 0, 0, 2)都表示点 (1, 0, 0)
怎么去做透视投影
将透视投影拆成2个过程
- 首先将Frustum的形状进行挤压(近平面永远不变,Z值不会发生变化,远平面的中心点也不会发生变化),挤成一个长方体
- 然后进行正交投影
怎样从透视投影到正交投影
如果只关注Y值,那么(x,y,z)挤压后就是相似三角形算出来
类推x也可以得到响应的值
在齐次坐标中,z值目前不知道,然后矩阵乘一个z值,得到下图
因此透视到正交的矩阵*(x,y,z,1)得到上图中得一个点,那计算后可得到矩阵:
怎样去求第三列?
- 在近平面,所有的点都会保持不变
- 所有的远平面中的点,Z值会保持不变
1、根据上述近平面的说法,将z值为n
在齐次坐标中可以映射成
那么透视到正交的矩阵,第三行可以表示成下图
那么我们根据上图得到
An+B = n²
2、再根据上面远平面中心点(0,0,f)的挤压后保持不变的特性
得到下图
3、根据上述两个算式,可以求出A和B,从而得出对应矩阵