同样引入齐次坐标:
用一个 4x4 的矩阵来表示 3D 的仿射变换
(x′y′z′1)\begin{pmatrix}x'\\y'\\z'\\1\end{pmatrix}⎝⎜⎜⎛x′y′z′1⎠⎟⎟⎞ = (abctxdeftyghitz0001)\begin{pmatrix}a&b&c&t_x\\d&e&f&t_y\\g&h&i&t_z\\0&0&0&1\end{pmatrix}⎝⎜⎜⎛adg0beh0cfi0txtytz1⎠⎟⎟⎞.(xyz1)\begin{pmatrix}x\\y\\z\\1\end{pmatrix}⎝⎜⎜⎛xyz1⎠⎟⎟⎞
2D/3D 变换中,是先做旋转(线性变换)再做平移
S(sx,sy,sz)S(s_x, s_y, s_z)S(sx,sy,sz) = (sx0000sy0000sz00001)\begin{pmatrix}s_x&0&0&0\\0&s_y&0&0\\0&0&s_z&0\\0&0&0&1\end{pmatrix}⎝⎜⎜⎛sx0000sy0000sz00001⎠⎟⎟⎞
T(tx,ty,tz)T(t_x, t_y, t_z)T(tx,ty,tz) = (100tx010ty001tz0001)\begin{pmatrix}1&0&0&t_x\\0&1&0&t_y\\0&0&1&t_z\\0&0&0&1\end{pmatrix}⎝⎜⎜⎛100001000010txtytz1⎠⎟⎟⎞
绕 x, y, z 三个轴分别做旋转的情况:

提示: R_y 中 −sinα-sin\alpha−sinα 而 R_x 和 R_z 中是 sinαsin\alphasinα 的原因是, Y 轴是由 Z 叉乘 X 得到的,而不是 X 叉乘 Z(右手定则).
任意的 3D 旋转都可以表示为绕 X Y Z 轴旋转的组合,公式如下
Rxyz(α,β,γ)R_{xyz}(\alpha,\beta,\gamma)Rxyz(α,β,γ) = Rx(α)Ry(β)Rz(γ)R_x(\alpha)R_y(\beta)R_z(\gamma)Rx(α)Ry(β)Rz(γ)
其中,α,β,γ\alpha, \beta, \gammaα,β,γ 分别代表绕 X Y Z 三个轴旋转的角度,叫做欧拉角 (pitch, yaw, roll)
pitch 是围绕 X 轴旋转,也叫做俯仰角
yaw 是围绕 Y 轴旋转,也叫偏航角
roll 是围绕 Z 轴旋转,也叫翻滚角

这里的 Viewing transformation 包括 View(视图)/Camera 变换和 Projection(投影) 变换
投影变换包括: 正交(Orthographic)投影和透视(Perspective)投影
思考怎么拍一张照片?
怎么进行视图变换(View/Camera Transformation)?
首先定义相机的姿态(位置e⃗\vec{e}e,看的方向g^\hat{g}g^,向上方向(up direction, t^\hat{t}t^))

相机的位置为原点(0, 0, 0), Y 轴向上,看向 -Z,物体随着相机变换

View Transformation 操作的是相机,其他物体跟着进行同样的变换


第一步,先做 e⃗\vec{e}e 到原点的平移,TviewT_{view}Tview 如图
第二部,因为计算从 g 到 -Z, t 到 Y, (g x t) 到 X 的旋转矩阵 RviewR_{view}Rview 比较困难,则先考虑 X 到 (g x t), Y 到 t, Z 到 -g,然后在求逆, 因为旋转矩阵就是一个正交矩阵,对求得旋转矩阵做一个转置,则可得到 g 到 -Z, t 到 Y, (g x t) 到 X 的旋转矩阵 RviewR_{view}Rview
相机按照此变换矩阵进行变换之后,相机内的物体都需按照此矩阵进行同样的变换。
View/Camera Transformation 是为了 Projection Transformation 做准备
前面说到投影变换分为正交投影(Orthographic Projection) 和透视投影(Perspective Projection)

正交投影, 不会给人带来近大远小的视觉(错觉),通常用在工程制图方面。
透视投影, 会给人带来近大远小的视觉(错觉)

正交投影简单的理解/做法:


此种情况下,对于 X 和 Y 都是 l, b 在 X, Y 轴的负半轴,r 和 t 在 X, Y 轴的正半轴, 则都是 r > l, t > b。而 f 在 Z 的负半轴(Camera 看向 -Z),n 在 Z 的正半轴,所以当立方体距离相机近的 n 的值是大于距离相机远的 f(正常应该是距离越远,值越大)。这也是 OpenGL 为什么使用左手系的原因.

2r−l\frac{2}{r-l}r−l2 是将立方体的长度缩放到 [-1, 1] 的范围内,对于它的 Y 和 X 是同样的操作。
−r+l2-\frac{r+l}{2}−2r+l 是 X 轴的平移,对于它的 Y 和 X 是同样的操作
回顾一下齐次坐标的概念:
(x,y,z),(kx,ky,kz,k!=0),(xz,yz,z2,z!=0)(x, y, z), (kx, ky, kz, k != 0), (xz, yz, z^2, z != 0)(x,y,z),(kx,ky,kz,k!=0),(xz,yz,z2,z!=0) 都表示在 3D 空间中的同一个点 (x,y,z)(x, y, z)(x,y,z) 。
例如,(1,0,0,1)(1, 0, 0, 1)(1,0,0,1) 和 (2,0,0,2)(2, 0, 0, 2)(2,0,0,2) 都表示 (1,0,0)(1, 0, 0)(1,0,0)


与 y′y'y′ 类似的 x′=nzxx' = \frac{n}{z}xx′=znx
那么在齐次坐标系中就有:






下一篇:找春天写一句话