文章目录
-
-
- [2D transformation](#2D transformation)
-
- Scale
- Reflection
- Shear(切变)
- [Rotation around origin](#Rotation around origin)
- Translation
- Reverse
- 变换顺序
- 复杂变换的分解
- [齐次坐标(Homogenous Coordinates)](#齐次坐标(Homogenous Coordinates))
- [3D transformation](#3D transformation)
- [Viewing / Camera transformation](#Viewing / Camera transformation)
- [Projection transformation](#Projection transformation)
- 视口变换
- 相机内参和相机外参
- 参考链接
-
2D transformation
Scale
- Uniform

- Non-Uniform

Reflection

Shear(切变)

Rotation around origin
假设旋转矩阵的4个未知数,取特殊点列方程可推导

如果旋转 − θ -\theta −θ角度,那么经过推导很容易得出旋转矩阵为原来旋转 θ \theta θ角度的矩阵的转置:

又考虑到实际上如果一个图形旋转 θ \theta θ角度再旋转 − θ -\theta −θ角度会变回原来的形状 ,也就是 R − θ R θ X = E X R_{-\theta}R_\theta X=EX R−θRθX=EX,即 R − θ R θ = E R_{-\theta}R_\theta=E R−θRθ=E两个矩阵是互逆的。

补充:如果一个矩阵的逆等于它的转置,那么这个矩阵是正交矩阵。
以上变换都属于线性变换,都可以写成矩阵相乘的形式:

Translation
需要注意平移(Translation)变换不属于Linear Transformation:

但以上变换可以统称为仿射变换(Affine Transformations)

Reverse
做逆变换相当于把变换后的图形又变回去,假如对 X X X做了变换 M M M,变为 X ′ = M X X'=MX X′=MX,再对 X ′ X' X′做逆变换 M − 1 M^{-1} M−1, M − 1 M X = X M^{-1}MX=X M−1MX=X,即变回 X X X

变换顺序
由于矩阵乘法是不可交换的,所以变换的顺序是很重要的,不同的变换顺序得到的结果也不一样,顺序是先线性变换后平移:

复杂变换的分解

齐次坐标(Homogenous Coordinates)
将一个 n n n维空间中的点或向量,表示为 n + 1 n+1 n+1维空间中的向量,能够达到合并 矩阵运算中乘法和加法操作的目的,简化计算

这样可以定义至少3种有效操作:

Point+Point由于没有什么实质性意义,所以给出一个定义, ( x y w ) \begin{pmatrix}x \\ y \\ w\end{pmatrix} xyw 这个点实际上定义为 ( x / w y / w 1 ) \begin{pmatrix}x/w \\ y/w \\ 1\end{pmatrix} x/wy/w1 这个点,那么这时,两个点相加就被赋予了两个点中点这一意义
那么通过使用齐次坐标,可以将仿射变换改写为:

缩放、旋转、平移可以表示成:

3D transformation
和2D变换中的相似,齐次坐标在3维空间中变成了4维,仿射变换矩阵如下:

注意是先应用线性变换,再应用平移变换!
Scale&Translation

Rotation
三维空间中的旋转和2维相似,绕某个轴旋转就固定哪个轴的坐标不变 ,其他两个轴应用2维旋转矩阵即可,但我们发现绕y轴旋转的矩阵中 sin α \sin α sinα的符号有点不同,这是因为图中y的方向是 z × x z×x z×x得到的,如果y轴是向下的,即由 x × z x×z x×z得到,那么 sin α \sin α sinα会刚好相反

留下几个知识点:欧拉角 、四元数 、罗德里格兹旋转公式
旋转矩阵不适合做插值,而四元数是可以的

Viewing / Camera transformation
考虑我们现实场景重拍摄一张图片的步骤:
- 找一个好地方并摆出姿势(model transformation)
- 找一个好的拍摄角度并放置相机(view transformation)
- 在相机上投影出相片(projection transformation)
这三部就是图形学中的MVP变换。
我们首先考虑视角变换,也即相机变换。通常,相机可以通过三个方向向量 来确定一个唯一的视图/相机位置(可以注意到 g ^ \hat g g^和 t ^ \hat t t^总是垂直的):
- Position e ⃗ \vec e e (决定相机的物理位置)
- Gaze direction g ^ \hat g g^ (决定俯视仰视平视方向)
- Up direction t ^ \hat t t^ (相机的角度,决定拍出的图像是什么角度,相机旋转,则拍出的照片也会旋转)
由于如果我们保持相机和物体的相对位置不变,同时移动二者,可能会得到相同的拍摄图像,因此不妨将相机固定到一个位置,即:
- 原点
- up at Y Y Y
- gaze at − Z -Z −Z
对于这样的位置,可以采取如下仿射变换:
- 将 e e e平移到原点
- 将 g g g旋转到 − Z -Z −Z
- 将 t t t旋转到 Y Y Y
- 将 ( g × t ) (g×t) (g×t)旋转到 X X X
这个变换实际上也就是世界坐标系转换到相机坐标系的过程。
但实际上,上面这些变换是不好表示的,由于前面提到旋转矩阵是正交 的,所以我们可以考虑上述旋转变换的逆变换:

这样我们对所有的物体都事先运用这种变换就相当于我们的相机在一个固定位置 去拍摄,并且相机位置是原点。这种变换也被称为ModelView Transformation 。这实际上是世界坐标系 到相机坐标系的一个变换。
Projection transformation
投影变换就是从3D物体投影到2D图像的变换,可以分为:
- 正交投影(Orthographic Projection)
- 透视投影(Perspective Projection)
二者本质的区别是是否具有近大远小的性质,透视投影具有近大远小的性质而正交投影没有。透视投影中,原本平行的线投影后可能不再平行。如下图所示,正交投影相当于把相机拉到无限远的位置。下图中,Near clip plane是近平面,也相当于相机的成像平面。

正交投影
当按照前面的方式进行视图变换后,正交投影其实就相当于丢弃掉Z轴坐标,然后将物体的中心平移到相机位置,并且将物体缩放到一个小的矩型中(归一化)。如下图,但这里还有一个问题是物体的正反我们无法分辨。

在实际操作中,我们通常是将一个长方体通过平移和缩放映射一个中心位于原点,边长为1的一个立方体中:

变换矩阵就是(先平移后缩放):

在这个过程中,实际上物体是被拉伸了,后面会提到在做完MVP变换 后还要进行视口变换。
透视投影
首先需要明确齐次坐标中的一个知识点:就是 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1)和 ( k x , k y , k z , k ) (kx,ky,kz,k) (kx,ky,kz,k)表示的是同一个点。
透视投影实际上可以拆分为两步:
- 将远平面到近平面内的frustum(截锥体)挤压变换成一个长方体。变换需要满足:近平面的所有点坐标不变。远平面只有xy变换而z不变。该变换表示为 M p e r s o − > o r t h o M_{perso->ortho} Mperso−>ortho。注意近平面和远平面的中心连线是和z轴平行的。相机位置在中心连线上。
- 对长方体进行正交投影。

实际上,远平面(右)要挤压成与近平面(左)一样的大小,实际上是一个相似变换。

利用相似变换的性质,可以求出 ( x , y , z ) (x,y,z) (x,y,z)到 ( x ′ , y ′ , z ′ ) (x',y',z') (x′,y′,z′)的变换。
y ′ = n z y x ′ = n z x y^{\prime}=\frac{n}{z} y \quad x^{\prime}=\frac{n}{z} x y′=znyx′=znx
对于截锥体内的所有平面,xy变换都满足上述关系,但z的关系目前还不知道,只知道远平面和近平面的z不变。表示成齐次坐标为:

M p e r s o − > o r t h o M_{perso->ortho} Mperso−>ortho的目标就是:

至此我们可以推导出 M p e r s o − > o r t h o M_{perso->ortho} Mperso−>ortho矩阵的一部分:

至于第三行,我们利用近平面的任意一点和远平面的任意一点z都不会改变可以推导出第三行,最终的 M p e r s o − > o r t h o M_{perso->ortho} Mperso−>ortho矩阵就是:
M p e r s o − > o r t h o = ( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) M_{perso->ortho}=\begin{pmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0 \\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0 \end{pmatrix} Mperso−>ortho= n0000n0000n+f100−nf0
n n n是近平面的z值, f f f是远平面的z值。
然后就是用正交变换矩阵再去做一次变换即得到最终的投影变换矩阵。
M persp = M ortho M persp → ortho M_{\text {persp }}=M_{\text {ortho }} M_{\text {persp } \rightarrow \text { ortho }} Mpersp =Mortho Mpersp → ortho
这也是相机坐标系 到图像坐标系的过程。
透视投影中还涉及到两个概念,视锥的长宽比(aspect ratio)和垂直可视角度(vertical field-of-view,fovY)。实际含义可以从下图看出:

我们假设前面经过矩型块是对称的,即 l = − r ( x 方向 ) , b = − t ( y 方向 ) l=-r(x 方向),b=-t(y方向) l=−r(x方向),b=−t(y方向)。那么可以从 t , r t,r t,r推出两个概念的表达式:
tan f o v Y 2 = t ∣ n ∣ aspect = r t \begin{aligned} \tan \frac{f o v Y}{2} & =\frac{t}{|n|} \\ \text { aspect } & =\frac{r}{t} \end{aligned} tan2fovY aspect =∣n∣t=tr
视口变换
在MVP变换过后,我们的目标就是将前述的小立方块投影到一个图片上,这实际上也是图像坐标系到像素坐标系的变换。
首先我们假设像素坐标系是如下形式:坐标原点在左下角,每个像素是有单位宽度和高度的小颜色块,像素内部每一点颜色都一样,像素坐标系放的是像素的索引。如下图。

设定y轴方向的长度为高度(height),x轴方向的长度是宽度(width),整个屏幕的范围就是上图灰色区域。
视口变换的目标是:
- 保持相机坐标系的z不变
- xy平面要从原来小立方体 [ − 1 , 1 ] 2 [-1,1]^2 [−1,1]2的范围变换到 [ 0 , w i d t h ] × [ 0 , h e i g h t ] [0,width]\times[0,height] [0,width]×[0,height]的范围
变换矩阵很容易写出,就是缩放+平移操作。视口变换矩阵 M v i e w p o r t M_{viewport} Mviewport为
M viewport = ( width 2 0 0 width 2 0 height 2 0 height 2 0 0 1 0 0 0 0 1 ) M_{\text {viewport }}=\left(\begin{array}{cccc} \frac{\text { width }}{2} & 0 & 0 & \frac{\text { width }}{2} \\ 0 & \frac{\text { height }}{2} & 0 & \frac{\text { height }}{2} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right) Mviewport = 2 width 00002 height 0000102 width 2 height 01
经过视口变换后,下一步就是光栅化(Rasterization)的过程。
相机内参和相机外参
外参就是上面从世界坐标系到相机坐标系的变换矩阵,可以简单理解为相机的位置、角度。
内参是上面另外两个变换矩阵的叠加,简单理解就是相机的内部特性,如焦距,畸变系数等。
参考链接
[3] https://zhuanlan.zhihu.com/p/692565077
还有一些不太理解的地方以及一些概念以后再更新。