补充
对于旋转矩阵
如果一个矩阵的逆等于其转置,我们这个矩阵为正交矩阵。
3D 变换
3 维旋转矩阵有 3 个矩阵,分别绕 x 轴,y 轴,z 轴旋转。由于我们采用的是右手系,因此旋转是有定向的,正如在二维中,是 x 轴向 y 轴旋转,对应到 3 维中便是绕 z 轴旋转( x 轴转向 y 轴),绕 x 轴旋转( y 转向 z ),绕 y 轴旋转( z 转向 x )。
绕 x 轴旋转,故 x 不变,且 y 转向 z
绕 y 轴旋转,故 y 不变,因为是 z 转向 x,所以此处需要求逆
绕 z 轴旋转,故 z 不变,x 转向 y
绕任意轴旋转
绕任意轴旋转,首先将该轴旋转到任意的 x, y, z 轴上,然后可以应用基本的旋转矩阵,最后再逆旋转回来即可
这里R_x的求法,从上面的解释可以得到,问题是如何求R_1,设想我们围绕旋转的轴为 u,R_1便是将 u 转到 x 的矩阵。具体来说,这里需要以 u 为一轴,构造一个 3 维正交坐标系,然后将 u-x 对齐,其他两轴和 y,z 对齐。
构造如下,任取一 t 方向不与 u 重合。
此时,u, w, v 便是我们构造出来的新坐标。注,这里是用叉乘。
如何将新坐标和原始坐标系重合呢?取R_1 = (u, w, v),该旋转矩阵的含义便是将 x, y, z 旋转到 u, w, v 的旋转矩阵。因此
罗德里格旋转公式
绕旋转轴\vec{n}旋转角度\alpha
视图变换(Viewing/Camera transformation)
什么是视图变换
用拍照来比喻一下:
找一个好位置,安排模特(model transformation)
找一个好的角度,摆放相机(view transformation)
拍照! (projection transformation)
如何视图变换
首先定义相机:
Position\vec{e}
Look-at / gaze direction\hat{g}
Up direction\hat{t}
如果相机和物体一起变换,那么相对不变。
所以,我们规定将相机放在原点,up 在 Y 轴,看向 -z 方向
这样做的原因是,以后有很多操作会非常方便。
那么如何求变换矩阵M_{view}?
将 e 平移到原点
旋转 g 到 -Z
旋转 t 到 Y
旋转(g \times t)到 X
首先
旋转 g 到 -Z,t 到 Y,g \times t到 X。
反向考虑一下,X 到(g \times t),Y 到 t,Z 到 -g。
投影变换(Projection transformation)
投影的目的是将 3D 映射为 2D
正交投影(orthographic projection)
透视投影(perspective projection)
对于正交投影,3D 中平行的线,投影之后还是平行。而透视投影则不是。
正交投影
相机位于原点,朝向 -Z,up 位于 Y
丢弃 Z 轴
平移并且缩放结果在一个矩形中[-1, 1]^2
更常规得看,我们是将一个立方体[l, r] \times [b, t] \times [f, n]映射到一个(正则,规范、标准)的立方体[-1, 1]^3
变换矩阵
先平移,再缩放
这里可能会有人有疑问,为什么要压缩到一个小立方体呢?其实是为了之后计算方便,在转换到屏幕坐标的时候就会重新拉伸回来,不必太纠结。
透视投影(Perspective Projection)
在图形学中应用最广泛
近大远小
在齐次坐标系中
(x, y, z, 1), (kx, ky, kz, k!=0), (xz, yz,z^2, z!=0),在 3D 中都表示相同的点 (x, y, z)
(1, 0, 0, 1) 和 (2, 0, 0, 2) 都表示 (1, 0, 0)
如何完成投影变换
首先,把截锥压成一个长方体(n->n, f->f)(M_{persp->ortho})
做正交投影(M_{ortho})
第一步的关键因素是,发现变换点 (x^{'},y^{'},z^{'}) 和原始点 (x, y, z) 之间的关系
很明显,根据相似三角形公式,可以得到如下的结论:
而由这个公式,我们可以推出以下矩阵:
目前,我们还无法得知第三行是什么,不过,通过观察可以发现:
1. 近平面中任何点是不会改变的
第三行必须是(0 0 A B),其中A和B是未知的
2. 远平面中任何点的z值是不会改变的
从上面,可以推出两个方程:
解得:
最后