前言
本篇主要总结了视图转换的原理、投影变换的正交和透视的矩阵推导过程。推导过程真是难的头皮发麻,还好是坚持学完了,很有收获。完结撒花✿✿ヽ(°▽°)ノ✿。同时,感谢令琪大佬的醍醐灌顶的授课。
图形学系列文章:
视图变换
模型(model)、视图(view)、投影(projection)三步走。
如何进行视图变换?
-
首先要定义相机
- 设定位置(原点)
- 定义相机看的方向(观测的方向)
- 定义向上方向
-
重点观察
如果相机和所有对象一起移动,“照片”将是相同的。
那么我们认为,永远让相机放在一个固定的位置,所有的东西都是其他物体在移动,相机永远不动,并且相机永远放在原点,永远向 -z 方向看。并且相机永远以 y轴 为向上方向。
通过转换相机:
我们总是将相机变换为 原点,在 Y 处,看 -Z。
转换过程如图:
变成
步骤:
- 将 e 转换为原点
- 将 g 旋转到 -Z
- 将 t 旋转到 Y
- 旋转 (g x t) 到 X
视图/相机转换
步骤:
-
公式如下,先平移后旋转。
-
将 e 转换为原点
-
旋转 g 到 -Z,t 到 Y, (g x t)到 X。(任意的一个轴,旋转到到规定的轴,不好写,这里考虑逆变换,求逆变换,再转置回来)
-
考虑它的逆旋转:X 到 (g x t),Y 到 t,Z 到 -g
投影变换
计算机图形学中的投影
- 3D 到 2D
- 正交投影
- 透视投影
透视投影 vs 正交投影:
正交投影
不管远处还是近处,一股脑全挤到一个平面上。
如何理解正交投影
简单的理解:
- 相机位于原点,看着 -Z, y轴为向上方向。
- 去除z
- 将生成的矩形平移并缩放到 [-1, 1]2
通常上:
-
我们想将一个长方体 [l, r] x [b, t] x [f, n]映射到规范(正则、规范、标准)”立方体 [-1, 1]3
顺序会有所不同(到简单方式):
- 通过平移居中长方体
- 缩放到“规范”立方体
矩阵表示
首先,把中心移到原点,然后缩放(长宽高 都除以 2)
警告:
- 我们所讲的,都是看向 -Z的,所以近大于远。
- 这也是为什么 OpenGL 用左手系的原因。
透视投影
透视投影, 最常见于计算机图形学、艺术、视觉系统,支持近大远小满足这个性质,平行线不平行;收敛到单点。
这里复习下齐次坐标的性质下面的章节会用到。
-
(x, y, z, 1), ( kx, ky, kz, k != 0), (xz, yz, z2, z != 0) 都表示 3D 中的同一个点 (x, y, z)
-
例如 (1, 0, 0, 1)和 (2, 0, 0, 2) 都代表 (1, 0, 0)
如何理解透视投影
远平面的点挤到近平面,边做长方体,再做一次正交投影。(从透视 到 正交)
矩阵推导
-
找到一个变换
- 回忆一下关键思想:找到变换点 (x’, y’, z’) 和原点 (x, y, z)
-
基于相似三角形原则,得到 y’ 与 y 的对应关系
所以得到变换点 (x’, y’, z’) 和原始点 (x, y, z) 之间的关系
-
在齐次坐标中:
所以“挤压”(透视到正射)投影就是这样做的
-
已经足以找出 Mpersp->ortho 的一部分
-
观察:第三行 z’
- 近平面上的任何一点都不会改变
- 远平面上任何一点的z都不会改变
利用近平面上的任何一点都不会改变,这个条件推导:
- 所以第三行必须是 (0 0 A B)
- 现在我们已知的条件是
- 同理,利用远平面上任何一点的z都不会改变,这个条件推导:
- 两个式子求A、B
- 最后,Mpersp->ortho 中的每个条目都是已知的
- 最后的步骤是做正交投影(Mortho)来结束