计算机图形学几何变换基础

Posted Terrell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机图形学几何变换基础相关的知识,希望对你有一定的参考价值。

一、空间

1.向量空间

向量空间包含两类实体:标量和向量。关于向量还定义了两种运算:数乘运算和加法运算。设\(u,v,w\)是向量空间中的三个向量, \(k\)是该空间的一个标量。则向量间的加法运算是封闭的,即
\[ u+v \in V ,\quad \forall u,v \in V \]
加法满足交换律,即
\[ u+v=v+u \]
存在一个0向量,满足
\[ u+\textbf{0}=u, \quad \forall u \in V \]
数乘运算满足分配律
\[ k(u+v)=ku+kv \(u+v)k=ku+kv \]
\(n\)维向量空间\(V\)中,设\(v_1,v_2,…,v_n\)是向量空间\(V\)的一组基,那么该空间中任意一个向量\(v\)可以唯一的表示为
\[ v=\beta_1v_1+\beta_2v_2+...\beta_nv_n \]

2.仿射空间

在向量空间中没有位置和距离这样的概念,这就像物理学中的矢量一样,只有大小和方向,没有位置。仿射空间比向量空间多了一类实体:点。设\(P,Q,R\)是仿射空间的点,在仿射空间中定义了一种新的运算:点与点的减法。
\[ v=P-Q \]
\(P,Q\)的减法得到一个向量\(v\)。反之,对任意一个\(P,v\)可以找到一个\(Q\)与之对应
\[ Q=P+v \]
仿射空间的许多性质来自仿射几何,如果使用标架而不是坐标系,那么就可以在仿射空间中既表示向量又表示点。一个标架包含一个点\(P_0\)和一组基向量\(v_1,v_2,…,v_n\),给定一个标架,任意一个向量可以唯一的表示为
\[ v=\alpha_1v_1+\alpha_2v_2+...\alpha_nv_n \]
任意一个点可以表示为
\[ P=P_0+\beta_1v_1+\beta_2v_2+...\beta_nv_n \]
这里两组标量\((\alpha_1,\alpha_2,…,\alpha_n)\)\((\beta_1,\beta_2,…,\beta_n)\)分别给出了向量和点的表示。可以把点\(P_0\)看做标架的原点,所有点都是相对这个参考点定义的。

3.Euclid空间

虽然仿射空间包含了构建几何模型的基本要素,但是在仿射空间中不能度量向量长度。而Euclid空间又这样的概念。Euclid空间只包含向量和标量。设\(E\)是一个Euclid空间,对于\(E\)中任意2个向量\(u=(x_1,x_2,...,x_n)\)\(v=(y_1,y_2,…,y_n)\),定义内积运算
\[ u \cdot v = x_1y_1+x_2y_2+...x_ny_n \]
并且\(u \cdot v= v \cdot u\);若\(v \not = 0\),则\(v \cdot v >0\),且$ \textbf{0} \cdot \textbf{0} = \textbf{0}\(;若\)u \cdot v = 0\(,则称向量\)u,v$正交。一个向量的大小定义为
\[ |v|=\sqrt{v \cdot v} \]
任意两个点之间的距离为
\[ |P-Q|=\sqrt{(P-Q) \cdot (P-Q)} \]
利用内积定义两个向量的夹角
\[ cos\theta=\frac{u \cdot v}{|u||v|} \]
易知\(cos\theta \in [-1,1]\)

二、 齐次坐标

点和向量很容易搞混淆。下面考虑\(P_0\)和向量\(v_1,v_2,v_3\)所定义的标架,通常将位于点\((x,y,z)\)的点\(P\)用列向量表示为
\[ P=\left [ \begin{matrix} x \y \z \end{matrix} \right ] \]
其中
\[ P=P_0+xv_1+yv_2+zv_3 \]
如果这样去表示,则点的表示和向量表示形式就完全相同了。齐次坐标克服了这个问题,它将三维空间坐标表示为四维。定义点与标量乘法\(0 \cdot P = 0,1 \cdot P =P\),则可以通过矩阵乘法把点表示为
\[ P = \left [ \begin{matrix} \alpha_1,\alpha_2,\alpha_3,1 \end{matrix} \right] \left [ \begin{matrix} v_1 \v_2 \v_3 \P_0 \end{matrix} \right] \]
于是可以说\(P\)在该架构下的坐标表示是\([\alpha_1,\alpha_2,\alpha3,1]^T\),同样的向量\(v\)可以表示为
\[ v = \left [ \begin{matrix} \beta_1,\beta_2,\beta_3,0 \end{matrix} \right] \left [ \begin{matrix} v_1 \v_2 \v_3 \P_0 \end{matrix} \right] \]
同样的,说\(v\)在标架下的坐标表示是\([\beta_1,\beta_2,\beta_3,0]^T\).通过这样的定义,我们很容易得到普通坐标和齐次坐标之间的转换关系

  • 齐次坐标转换为普通坐标

? 点\([\alpha_1,\alpha_2,\alpha_3,1]^T\)转换为\([\alpha_1,\alpha_2,\alpha_3]^T\),向量\([\beta_1,\beta_2,\beta_3,0]^T\)也转换为\([\beta_1,\beta_2,\beta_3]^T\)

  • 普通坐标转换为齐次坐标

? 点\([\alpha_1,\alpha_2,\alpha_3]^T\)转换为\([\alpha_1,\alpha_2,\alpha_3,1]^T\),向量\([\beta_1,\beta_2,\beta_3]^T\)转换为\([\beta_1,\beta_2,\beta_3,0]^T\)

说白了,齐次坐标就是增加一个维度来区分点和向量,使得它们的表示统一起来。此外对于普通坐标\([x_1,x_2,x_3]^T\)对应的一簇齐次坐标为\([wx_1,wx_2,wx_3,w]^T\),其中\(w \not = 0\),把齐次坐标换成普通坐标只需要将前三个分量都除以第四个分量即可。试想一下,如果不引入齐次坐标,我们是无法用\(3 \times 3\)的矩阵来表示平移变换的,由于齐次坐标使用了4个分量来表达3D概念,使得平移变换可以使用矩阵进行,从而如F.S. Hill, JR所说,仿射(线性)变换的进行更加方便。

三、仿射变换

变换是一个函数,它是把一个点(或向量)映射成另一个点(或向量)。这里将考虑一类有限制的变换,假定我们使用的是四维齐次坐标,那么点和向量都可以表示成为一个四元组。我们将变换约束为线性的,一个变换\(f\)是线性变换,则\(f\)重要性在于:线性组合的变换等于变换的线性组合。设\(u,v\)为两个向量,\(k_1,k_2\)为标量,则该性质可以表示为
\[ f(k_1u+k_2v)=k_1f(u)+k_2f(v) \]
如果用齐次坐标表示点和向量,则线性变换总可以用矩阵来表示
\[ u=Cv \]
其中\(u,v\)分别是变换后和变换前的表示,\(C\)是一个方阵。如果\(C\)是非奇异的,那么这个线性变换对应一个标架变换,可以用两种等效的观点来看待线性变换:

  • 由标架的改变而引起顶点表示的改变。
  • 标架不变,对顶点进行变换。

在齐次坐标下,\(C\)是一个\(4 \times 4\)的矩阵,它具有12个自由度
\[ C=\left [ \begin{matrix} \alpha_{11} & \alpha_{12} & \alpha_{13} & \alpha_{14} \\alpha_{21} & \alpha_{22} & \alpha_{23} & \alpha_{24} \\alpha_{31} & \alpha_{32} & \alpha_{33} & \alpha_{34} \0 & 0 & 0 & 1 \\end{matrix} \right ] \]
由于点和向量的表示不同,向量的仿射变换只有9个自由度,点的仿射变换拥有全部的12个自由度。

总结为,仿射变换是一个线性变换,保持了图像的“平行性”和“平直性”,即图像中原来的直线和平行线,变换后仍然保持原来的直线和平行线,仿射变换比较常用的特殊变换有平移(Translation)、缩放(Scale)、旋转(Rotation)、剪切(shear)。

1.平移

平移(translation)变换把点沿着给定方向移动固定的距离,只需要给定一个位移向量\(d\)就可以确定一个平移变换
\[ p‘ = p + d \]
平移变换有3个自由度。因为它的位移有3个可以指定的方向。将\(p‘,p,d\)写成分量的形式
\[ p‘=\left [ \begin{matrix} x‘ \y‘ \z‘ \\end{matrix} \right ] \quad p=\left [ \begin{matrix} x \y \z \\end{matrix} \right ] \quad d=\left [ \begin{matrix} \alpha_x \\alpha_y \\alpha_z \\end{matrix} \right ] \]
可以用矩阵乘法表示为
\[ \left [ \begin{matrix} x‘ \y‘ \z‘ \1 \\end{matrix} \right ] = \left [ \begin{matrix} 1 & 0 & 0 & \alpha_{x} \0 & 1 & 0 & \alpha_{y} \0 & 0 & 1 & \alpha_{z} \0 & 0 & 0 & 1 \\end{matrix} \right ] \left [ \begin{matrix} x \y \z \1 \\end{matrix} \right ] \]
于是\(p‘=Tp\),称\(T\)为平移矩阵。这里点的第4个维度坐标总是1,然而如果不要这个1,则是找不到一个\(3 \times 3\)的矩阵\(D\)来表示平移变换的,这就是齐次坐标的技巧。

2.旋转

旋转通常是更复杂的。先来考虑下在二维坐标系下绕原点旋转。设点\(p\)的极坐标表示为\((\rho,\phi)\),现在将点\(p\)围绕原点旋转\(\theta\)度,可以描述为
\[ x = \rho \; cos \phi \quad \quad \;\; \y = \rho \; sin \phi \quad \quad \; \;\x‘ = \rho \;cos(\phi+\theta) \y‘=\rho \; sin(\phi+\theta) \]
于是得到
\[ x‘=x \; cos \theta - y \; sin \theta \y‘ = x\;sin \theta + y \; cos \theta \]
写成矩阵形式为
\[ \left [ \begin{matrix} x‘ \y‘ \\end{matrix} \right ] = \left [ \begin{matrix} cos \theta & -sin \theta \sin \theta & cos \theta \end{matrix} \right ] \left [ \begin{matrix} x \y \\end{matrix} \right ] \]
下面将旋转推广到三维的形式。三维上的旋转实际上可以分解为分别绕相互独立的三个坐标轴的旋转,这样旋转将会有三个自由度,对应三个旋转方向,需要注意的是,矩阵的乘法不满足交换律,所以先绕\(x\)轴旋转角度\(\phi\)再绕\(y\)轴旋转角度\(\theta\)与先绕\(y\)轴旋转角度\(\theta\)再绕\(x\)轴旋转角度\(\phi\)是两种不同的变换。现在看来,上述二维旋转实际上可以看作是在三维中绕\(z\)轴的旋转。在三维空间中,绕\(z\)轴旋转\(\theta\)可以表示为
\[ x‘=x \; cos \theta - y \; sin \theta \y‘ = x\;sin \theta + y \; cos \theta \z‘=z \quad \quad \quad \quad \quad \quad \\]
对应变换矩阵为
\[ R_z(\theta) = \left [ \begin{matrix} cos \theta & -sin \theta & 0 & 0\sin \theta & cos \theta & 0 & 0 \0 & 0 & 1 & 0 \0 & 0 & 0 & 1 \\end{matrix} \right ] \]
同样可以推出绕\(x\)\(y\)轴的旋转矩阵分别为
\[ R_x(\theta) = \left [ \begin{matrix} 1 & 0 & 0 & 0 \0 & cos \theta & -sin \theta & 0 \0 & sin \theta & cos \theta & 0 \0 & 0 & 0 & 1 \\end{matrix} \right ] \quad R_y(\theta) = \left [ \begin{matrix} cos \theta & 0 & sin \theta & 0 \0 & 1 & 0 & 0 \-sin \theta & 0 & cos \theta & 0 \0 & 0 & 0 & 1\\end{matrix} \right ] \]
\(x\)轴旋转时,\(x\)坐标不变,绕\(y\)轴旋转时,\(y\)坐标不变。两个正弦项在右手系下对旋转正方向一致。考虑旋转的逆变换,先转\(\theta\)角,再转\(-\theta\)角等于没有进行旋转,即\(R^{-1}(\theta)=R(-\theta)\),代入可知\(R^{-1}(\theta) = R^T(\theta)\),故旋转矩阵\(R\)是一个正交矩阵。任何不动点在原点的旋转都可以表示为绕三个坐标轴旋转矩阵的乘积
\[ R=R_zR_yR_x \]
旋转和平移都是刚体变换,它们不改变几何体的大小和形状,只改变它们的位置和方向。

3.缩放

缩放是一种仿射变换,但它不是刚体变换,通过缩放变换可以放大或缩小对象。缩放变换有一个不动点,因此为了确定一个缩放变换,应当指明不动点、缩放方向、缩放因子(\(\alpha\)),当\(\alpha>1\)时,对象沿着指定方向伸长,当\(0 \leq \alpha < 1\),时对象沿着指定方向缩短,当\(\alpha < 0\)时,就得到了以不动点为中心沿缩放方向反射的变换。现在设不动点为原点,以后可以通过交换的复合得到不动点在任意位置的交换。三个方向的缩放可以表示为
\[ x‘=\beta_xx \y‘ = \beta_yy \z‘ = \beta_zz \\]
即为
\[ S(\beta_x,\beta_y,\beta_z) = \left [ \begin{matrix} \beta_x & 0 & 0 & 0 \0 & \beta_y& 0 & 0 \0 & 0 & \beta_z & 0 \0 & 0 & 0 & 1 \\end{matrix} \right ] \]
缩放的逆矩阵很容易求\(S^{-1}(\beta_x,\beta_y,\beta_z)=S(\frac{1}{\beta_x},\frac{1}{\beta_y},\frac{1}{\beta_z})\).

4.剪切

剪切(shear)变换也是一类基础的仿射变换。它指的是类似于四边形不稳定性那种性质,任意一边都可以被拉长的过程。考虑一个处于原点的立方体,该立方体的各表面对齐于各坐标轴,如果把顶面向右拉而底面向左拉,会得到一个沿\(x\)轴方向剪切的对象。由于\(y\)轴和\(z\)轴方向都不受剪切影响,因此称该剪切变换为\(x\)轴剪切。以区别于其他方向的剪切变换。可以用角度 \(\theta\) 来表示剪切变换的特性
\[ x‘=x+y\;cot\theta \y‘ = y \quad \quad \quad \;\;\;\z‘ = z \quad \quad \quad \;\;\;\\]
得到剪切矩阵为
\[ H_x(\theta)= \left [ \begin{matrix} 1 & cot\theta & 0 & 0 \0 & 1& 0 & 0 \0 & 0 & 1 & 0 \0 & 0 & 0 & 1 \\end{matrix} \right ] \]
剪切矩阵逆矩阵很好推导,\(H_x^{-1}(\theta)=H_x(-\theta)\).

以上是关于计算机图形学几何变换基础的主要内容,如果未能解决你的问题,请参考以下文章

计算机图形学-图形几何变换

3D计算机图形学的目录

计算机图形学 开源的库都有哪些,主要用于二维

opengl算法学习---图形几何变换

利用C语言实现二维图形的变换

图形学计算机图形学知识点提纲8