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

一、空间

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)\).

时间: 2024-11-13 08:03:07

计算机图形学几何变换基础的相关文章

计算机图形学学习方法和相关书籍,做游戏,GIS,虚拟现实,三维引擎的都可以看看.

本书参照<<图形学扫盲>> 整理的,原文内容引子: http://www.cppblog.com/lai3d/archive/2008/12/30/70796.html 前言: 以我现在的水平观之,3D图形学分3大块的学习内容: a.空间几何数学:空间几何变换,加速算法,多边形技术,曲线和曲面,相交测试,碰撞测试. b.光照着色系统:光照,纹理贴图,高级象素着色光照,艺术性渲染. c.程序技术性应用:公告板,精灵,天空盒,体绘制,材质系统,场景图,渲染队列. 在实际学习过程中,3个

3D计算机图形学零起点全攻略(转)

3D计算机图形学零起点全攻略 这篇文章不包含任何技术知识,但我的希望它能指明一条从零开始通往3D领域的成功之路.我将罗列我看过的相关经典书籍作为学习文献,阅读规则是每进入下个内容,我都会假设已经完成前面全部的文献研习内容.相信若能按照这条路走到最后,会有所进益. 完成整部分内容需要具备基础: 英语:CET4以上 数学:精通数字加减乘除法. 物理:基本力学. 计算机:了解电脑的基本知识,熟练使用Windows. 电脑配置: CPU:双核1.5以上 显卡:NVIDIA GeForce8400G MS

【转载】计算机图形学框架

原文: 计算机图形学框架 应用 基本图形生成算法 图元光栅化标准 直线要直 图元终点要准 图元生成的亮度.色泽粗细要均匀 快速计算 直线光栅化算法 逐点比较法 数值微分法 中点Bresenham算法 圆的光栅化算法 简单方程产生圆弧 Bresenham算法产生圆弧 多边形填充 扫描线填充 宽图元 复制像素画宽图元 移动画笔画宽图元 3D数学基础 坐标系 向量 矩阵 空间集合运算 集合形体的表达 几何体之间的关系 图形变换 二维及三维图形几何变换 二维图形几何变换 平移变换 比例变换 旋转变换 错

计算机图形学的学习资源

计算机图形学(Computer Graphics,简称CG)是一个令人着迷的领域,本文整理了一些图形学相关的学习资源. Wikipedia的介绍,及其后面附的"参考文献"和"外部链接"总是值得一看的: Computer graphics:主要介绍图形学的历史: Computer graphics (computer science):介绍图形学学科,后面附了知名研究者,以及著名大学的图形学小组: 3D computer graphics:这是图形学中最重要的部分:

计算机图形学名词解释

转自 http://blog.csdn.net/lwfcgz/article/details/39254743 3D三维(three dimension).客观世界中静止的物体都是三维的,在计算机图形学中常在一定的坐标系中用(x,y,z)坐标系列表示物体. 3D modeling3D建模.用三维坐标来描述物体的形状.在各种计算机图形应用领域中有不同的三维建模方法,用不同的算法来描述这些领域中的物体和对象. 3D transformation3D变换.在三维空间中把物体的三维坐标从一个位置变换至另

计算机图形学 复习笔记

计算机图形学 复习笔记 (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42779341) 第一章 计算机图形学综述 研究内容 图形的概念:计算机图形学的研究对象 能在人的视觉系统中产生视觉印象的客观对象 包括自然景物.拍摄到的图片.用数学方法描述的图形等等 图形的要素 几何要素:刻画对象的轮廓.形状等 非几何要素:刻画对象的颜色.材质等 图形表示法 点阵表示 枚举出图形中所有的点,简称为图像. 参数表示 由图形的

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------

计算机图形学 绘制任意斜率的直线(1)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40025917 本文演示,通过自己编写绘制直线函数(像素点填充),绘制任意斜率的直线. 1)创建CP2类 头文件:p2.h // P2.h: interface for the CP2 class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX

计算机图形学 有效边表填充算法(6)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40154077 本文通过一个完整的实例,展示多边形有效边表填充算法. 1)创建CAET类 头文件:AET.h // AET.h: interface for the CAET class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_AET_