模型变换

错切变换

缩放变换

旋转变换

平移变换

绕任意向量的旋转矩阵公式

R(n,α)=cos(α)I+(1cos(α))nnT+sin(α)[0nznynz0nxnynx0]R(\mathbf n, \alpha)=cos(\alpha) I + (1-cos(\alpha)) \mathbf n \cdot \mathbf n ^ T + sin(\alpha) \begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x\\ -n_y & n_x & 0 \end{bmatrix}

推导过程

相机变换

相机变换矩阵的推导

一个相机由以下几部分所构成

  • 相机位置 e\vec e
  • 相机视线方向g\vec g
  • 相机的正上方向t\vec t
    在相机的参考系中,定义相机视线方向g\vec g为相机坐标系的z轴方向
    定义相机的正上方向t\vec t为相机坐标系的y轴方向
    定义g×t\vec g \times \vec t为相机坐标系的x轴方向
    通常相机的视线方向为世界坐标系的z-z轴方向

首先将相机平移到原点,可得到矩阵

Tview=[100xe010ye001ze0001]T_{view}=\begin{bmatrix} 1 & 0 & 0 & -x_e\\ 0 & 1 & 0 & -y_e\\ 0 & 0 & 1 & -z_e\\ 0 & 0 & 0 & 1 \end{bmatrix}

g\vec g旋转到z-z方向,将t\vec t旋转到y轴方向,将g×t\vec g \times \vec t旋转到x轴方向,可得到矩阵RviewR_{view},但是这个矩阵并不好求,但我们可以反过来求。
我们可以按照变换后的基底直接求出逆变换的变换矩阵,由于是正交基底构成的矩阵,所以是正交矩阵,所以RviewT=Rview1R_{view}^T=R^{-1}_{view}

Rview1=[xg×txtxg0yg×tytyg0zg×tztzg00001]R^{-1}_{view}=\begin{bmatrix} x_{\vec g \times \vec t} & x_{\vec t} & x_{\vec {-g}} & 0\\ y_{\vec g \times \vec t} & y_{\vec t} & y_{\vec {-g}} & 0\\ z_{\vec g \times \vec t} & z_{\vec t} & z_{\vec {-g}} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}

故最终相机变换矩阵得到

Mview=RviewTviewM_{view}=R_{view}T_{view}

投影变换

平行投影变换矩阵推导

假设平行投影摄像机的视线范围由长方体[l,r]×[b,t]×[f,n][l, r] \times [b,t] \times [f,n] 所确定,其中l,r为x轴方向的两平面位置,b,t为y轴方向的两平面位置,f,n为z轴方向的两平面位置。我们希望将其标准化到[1,1]3[-1,1]^3
首先将其平移到原点,然后再缩放它。

Mortho=[2rl00002tb00002nf00001][100r+l2010t+b2001n+f20001]M_{ortho}= \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0 & 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{bmatrix}

透视投影变换矩阵推导

透视投影摄像机的视线范围由一个平头四棱台体所确定,使得内部的物体可以呈现近大远小的效果。
我们可以想象以下直接通过“挤压”将平头四棱台挤压为一个长方体,变换前后n平面上的点不变,n~f平面上的点将被压缩,越接近f平面,点被压缩的越厉害,所以当变换到长方体后相同的三维几何体离f平面越近投影后的图像就越小,故能够呈现出近大远小的效果。这也是一种空间变换,但它在三维空间中属于一种非线性变换,如果我们希望使用矩阵描述,则需要借助齐次坐标将其放置在四维空间中完成这个变换。
假设这种“挤压”变换可以使用矩阵A描述,则最终的透视投影变换矩阵可表述如下:

Mpersp=MorthoMpersporthoM_{persp}=M_{ortho} \cdot M_{persp \to ortho}

矩阵MpersporthoM_{persp \to ortho}的推导如下:
x=nzxx'=\frac{n}{z}x
y=nzyy'=\frac{n}{z}y

[xyz1][nzxnzy?1]=[nxny?z]\begin{bmatrix} x \\ y \\ z \\ 1 \\ \end{bmatrix} \Rightarrow \begin{bmatrix} \frac{n}{z}x \\ \frac{n}{z}y \\ ? \\ 1 \\ \end{bmatrix} = \begin{bmatrix} nx \\ ny \\ ? \\ z \\ \end{bmatrix}

由于n平面上的任何点在变换前后位置都仍然不变,设未知量?为k可得出以下关系:

[xyn1]=[nxnykn]\begin{bmatrix} x \\ y \\ n \\ 1 \\ \end{bmatrix} = \begin{bmatrix} nx \\ ny \\ k \\ n \\ \end{bmatrix}

解得k=n2k=n^2
故矩阵MpersporthoM_{persp \to ortho}可初步写为如下形式

Mpersportho=[n0000n0000AB0010]M_{persp \to ortho}= \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & A & B\\ 0 & 0 & 1 & 0 \end{bmatrix}

由于f平面和z轴的交点在变换前后都不变,故得出以下关系:

[00f1]=[00f2f]\begin{bmatrix} 0 \\ 0 \\ f \\ 1 \\ \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ f^2 \\ f \\ \end{bmatrix}

由这两个特殊点可列出关于A,B未知数的二元一次方程组

{An+B=n2Af+B=f2\left\{\begin{matrix} An+B=n^2 \\ Af+B=f^2 \end{matrix}\right.

解得

{A=n+fB=nf\left\{\begin{matrix} A=n+f \\ B=-nf \end{matrix}\right.

故得到矩阵

Mpersportho=[n0000n0000n+fnf0010]M_{persp \to ortho}= \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0 \end{bmatrix}

深入思考

当我们从透视投影的平头四棱台空间压缩变换到平行投影的长方体后,对于内部的任意一点(x,y,z)(x,y,z)坐标,变换后对应的坐标为(x,y,z)(x',y',z'),显然是可以得到zz越远的点,(x,y)(x',y')坐标被压缩的越厉害,关系式可在上述推导中体现。但是内部任意一个点的z坐标在变换前后就没有那么直观,我们可以进一步做一系列推导。

[xyz1]=[n0000n0000n+fnf0010][xyz1]=[nxny(n+f)znfz]=[nxznyz(n+f)nfz1]\begin{bmatrix} x' \\ y' \\ z' \\ 1 \end{bmatrix} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} nx \\ ny \\ (n+f)z-nf \\ z \end{bmatrix} = \begin{bmatrix} n\frac{x}{z} \\ n\frac{y}{z} \\ (n+f)-\frac{nf}{z} \\ 1 \end{bmatrix}

可得到函数z=(n+f)nfzz'=(n+f)-\frac{nf}{z}关于自变量zz的函数关系,zz的定义域为[n,f][n,f]
为了得知变换前后的z坐标是变远了还是变近了,可以做差得到函数f(z)f(z)

f(z)=zz=(n+f)(nfz+z),z[n,f]>0f(z)=z'-z=(n+f)-(\frac{nf}{z}+z), z \in [n,f] > 0

f(z)=0f(z)=0,则得到方程z2(n+f)+nf=0z^2-(n+f)+nf=0,即(zn)(zf)=0(z-n)(z-f)=0,得到方程有两个零点

x1=n,x2=fx_1=n, x_2=f

函数f(z)f(z)求导得f(z)=nfz21f'(z)=\frac{nf}{z^2}-1
f(z)>0f'(z)>0得,n<z<nfn<z<\sqrt{nf},令f(z)<0f'(z)<0得,nf<z<f\sqrt{nf}<z<f
得出以下函数及导函数分布表

z nn (n,nf)(n,\sqrt{nf}) nf\sqrt{nf} (nf,f)(\sqrt{nf},f) ff
f’(z) - >0 0 <0 -
f(z) 0 增函数 - 减函数 0

f(z)>=0f(z)>=0恒成立(当z=n or z=fz=n \space or \space z=f时,等号成立)
故对于透视投影空间内的某一点被压缩后,z>zz'>z,z坐标变远。