计算机图形学 部分笔记
用户域: 用户用来定义设计对象的平面或空间区域称为用户域,也称为用户空间.所采用的坐标系称为用户坐标系。
窗口区: 用户坐标系中需要进行观察和处理的一个坐标区域称为窗口区。(窗口区是用户区域的一部分)。
用户可以在用户域中指定任意的区域w,把他感兴趣的这部分区域内的图形输出到屏幕上。通常称(用户区域中的)这个区域为窗口区。
屏幕域:图形设备上用来输出图形的最大区域称之为屏幕域。它是有限的整数域,大小随具体设备而异。
视图区:用于显示某个窗口中图形的屏幕区域称为视图区(视区)。
说明:窗口是在用户坐标系中定义的,而视区是在设备坐标系(屏幕坐标系)中定义的。窗口定义了要显示什么,而视区定义在何处显示。
通常,窗口和视区都取为边与坐标轴平行的矩形。其它形状的窗口和视区有时也会采用,但其处理更为复杂。
Cohen-Sutherland裁剪算法(编码裁剪算法)
(1)输入直线段的两端点坐标:p1(x1,y1)、p2(x2,y2),以及窗口的四条边界坐标: xl 、xr 、 yt和yb。
(2)对p1、p2进行编码:点p1的编码为code1,点p2的编码为code2。
(3)若code1|code2=0,对直线段应简取之,转(6);否则,若code1&code2≠0,对直线段可简弃之,转(7);当上述两条均不满足时,进行步骤(4)。
(4)确保p1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和编码。
(5)按左、右、上、下的顺序求出直线段与窗口边界的交点,并用该交点的坐标值替换p1的坐标值。也即在交点s处把线段一分为二,并去掉p1s这一段。考虑到p1是窗口外的一点,因此可以去掉p1s。转(2)。
(6)用直线扫描转换算法画出当前的直线段p1p2。
(7)算法结束。
本算法的优点在于简单,易于实现。算法可以简单的描述为将直线在窗口左边的部分删去,按左,右,下,上的顺序依次进行,处理之后,剩余部分就是可见的了。
特点:用编码方法可快速判断线段的完全可见和显然不可见。
缺点:在求交过程中仍采用了乘除运算,裁剪速度受到影响。可用中点裁减算法加以改进。
中点分割算法
核心思想是通过二分逼近来确定直线段与窗口的交点
基本思想: 设裁剪区域为正矩形,要裁剪的直线段为P1P2, 算法分为两个过程平行地进行:
(1) 从P1出发,找出直线上离P1最近的可见点A。
(2) 从P2出发,找出直线上离P2最近的可见点B。
此两点的连线AB,即为原线段P1P2落在窗口中的可见部分。
与Cohen-Sutherland算法一样首先对线段端点进行编码,并把线段与窗口的关系分为三种情况,对前两种情况,进行一样的处理;对于第三种情况,用中点分割的方法求出线段与窗口的交点。
Liang-Barsky算法
算法步骤:
(1)输入直线段的两端点坐标:(x1,y1)和(x2,y2),以及窗口的四条边界坐标:wyt、wyb、wxl和wxr。
(2)若Δx=0,则p1=p2=0。此时判断是否满足q1<0或q2<0,若满足,则该直线段不在窗口内,算法转(7)。否则,满足q1>0且q2>0,则进一步计算u1和u2。算法转(5)。
(3)若Δy=0,则p3=p4=0。此时判断是否满足q3<0或q4<0,若满足,则该直线段不在窗口内,算法转(7)。否则,满足q1>0且q2>0,则进一步计算u1和u2。算法转(5)。
(4)若上述两条均不满足,则有pk≠0(k=1,2,3,4)。此时计算u1和u2。
(5)求得u1和u2后,进行判断:若u1>u2,则直线段在窗口外,算法转(7)。若u1<u2,利用直线的参数方程求得直线段在窗口内的两端点坐标。
(6)利用直线的扫描转换算法绘制在窗口内的直线段。
(7)算法结束。
. Weiler-Atherton多边形裁剪
假定按顺时针方向处理顶点,且将用户多边形定义为Ps,窗口矩形为Pw。算法从Ps的任一点出发,跟踪检测Ps的每一条边,当Ps与Pw相交时(实交点),按如下规则处理:
(1)若是由不可见侧进入可见侧,则输出可见直线段,转(3);
(2)若是由可见侧进入不可见侧,则从当前交点开始,沿窗口边界顺时针检测Pw的边,即用窗口的有效边界去裁剪Ps的边,找到Ps与Pw最靠近当前交点的另一交点,输出可见直线段和由当前交点到另一交点之间窗口边界上的线段,然后返回处理的当前交点;
(3)沿着Ps处理各条边,直到处理完Ps的每一条边,回到起点为止。
三维
模型变换(Modeling Transform)
模型坐标系==〉世界坐标系
平面几何投影
观察变换(Viewing Transform)
世界坐标系==〉观察坐标系
裁剪(二维裁剪或三维裁剪)
窗口视区变换
模型坐标系
Modeling Coordinate
物体的局部坐标系
在模型坐标系中物体的表示简单
投影变换 :
将维数为n的点变换成维数小于n的点。
首先要在三维空间中选择一个点,称为投影中心(center of projection);
再定义一个不经过投影中心的平面,称为投影平面(projection plane);
从投影中心向物体的每一点引射线,这些射线称为投影线(projector,projection ray),投影线与投影平面的交点集合就称为三维物体在二维投影平面上的投影。
投影面是平面而不是曲面,投影线是射线而不是曲线的投影称为平面几何投影(planar geometric projection)。
平面投影分类:
透视投影:投影中心到投影面之间的距离是有限的
平行投影:投影中心到投影面之间的距离是无限的
坐标轴方向的平行线在投影面上形成的灭点称为主灭点;
按主灭点的个数,透视投影分为一点透视、两点透视、和三点透视
平行投影
正投影
根据投影面与坐标轴的夹角,正投影分为:三视图、正轴测
当投影面与某一坐标轴垂直时,得到的投影为三视图;否则,得到的投影为正轴测图
在计算机图形设备上生成真实逼真图形的4个步骤:
(1)构造各个物体的数学描述(造型)。
(2)构成场景,选择观察场景的视点、视方向、视域(变换)
(3)给出各个物体的颜色信息。(光照条件、粘贴纹理)
(4)光栅化:将各个物体的数学描述和它们相关的颜色信息转化为屏幕上的像素信息。(消隐、光照模型、纹理映射、阴影)
按消隐空间分类
物体空间的消隐算法 (光线投射、Roberts)
图像空间的消隐算法 (Z-buffer、扫描线、Warnock)
物体空间和图像空间的消隐算法 (画家算法)
物空间算法是在定义、描述物体的世界坐标系中实现的,以场景中的物体为处理单元:
for(场景中的每一个物体)
{
将其与场景中的其它物体比较,确定其表面的可见部分;
显示该物体表面的可见部分;
}
理论上讲,物空像空间算法是在观看物体的屏幕坐标系下实现的,它以窗口内的每个像素为处理单元:
for(窗口内的每一个像素)
{
确定与此像素对应的距离视点最近的物体,
以该物体表面该处的颜色来显示像素;
}
间算法的计算量少于像空间算法的计算量,但实际上物体到视点距离的排序与遮挡判别比较复杂,算法效率很大程度上取决于排序的效率。而以扫描线的方式实现像空间算法时容易利用连贯性质从而使得像空间算法更具效率。
判断多边形对直线段遮挡的算法:
(1)若线段的两端点及视点在多边形所在平面的同侧,则线段不被给定平面遮挡,转7.
(2)若线段的投影与多边形投影的包围盒无交,则线段不被给定平面遮挡,转7.
(3)求直线与多边形所在平面的交。若无交点,转4。否则,交点在线段内部或外部。若交点在线段内部,交点将线段分成两段,与视点同侧的一段不被遮挡,另一段在视点异侧,转4再判;若交点在线段外部,转4。
(4)求所剩线段的投影与投影多边形边界的所有交点,并根据交点在原直线参数方程中的参数值求出Z值(即深度)。若无交点,转5。
(5)以上所求得的各交点将线段的投影分成若干段,求出第一段中点。
(6)若第一段中点在平面的投影内,则相应的段被遮挡,否则不被遮挡;其他段的遮挡关系可依次交替取值进行判断。
(7)结束。
线段和一个多边形进行隐藏性判断时,涉及到的运算包括:
平面上线段和多边形的求交
投影变换
判断点是否在多边形内
空间中射线和平面求交。
计算量大
采取如下措施可以减少计算量:
消除自隐藏线、隐藏面
利用多面体表面多边形的法矢判别“朝后的面”,即不可见面。
深度测试
在观察坐标系下判断线段与多边形的前后关系。如多边形完全在线段之后,则线段完全可见,无需就线段和多边形的遮挡关系进行进一步判断。
包围盒测试
包围盒不相交,线段和多边形也不相交,线段完全可见,无需就线段和多边形的遮挡关系进行进一步判断。
区间扫描线算法
大致步骤:
求出扫描线与所有投影多边形各边的交点,将扫描线分为若干子区间。
在区间任一点处找出在该处z值最大的一个面,这个区间上的每一个象素就用这个面的颜色来显示
小区间上存在两个或两个以上的多边形,必须通过深度测试判断哪个多边形可见。
如果允许物体表面相互贯穿,那么还必须求出它们在xoz扫描平面上的交点,再进一步细分这些小区间。更进一步作深度判断
画家算法(列表优先算法)
算法原理:若场景中任何多边形在深度上均不贯穿或循环遮挡,则各多边形的优先级顺序可完全确定。
深度排序算法:
1.将多边形按深度进行排序:距视点近的优先级高,距视点远的优先级低。
2.由优先级低的多边形开始逐个对多边形进行扫描转换。
其中的关键是将多边形按深度进行排序
区域子分割算法 (Warnock算法)
算法步骤
该算法把初始窗口取作屏幕坐标系的矩形,将场景中的多边形投影到窗口内。
如果窗口内没有物体则按背景色显示;
若窗口内只有一个面,
或者(在窗口内)有一个面把其它面都遮挡了,即在窗口内只有一个面可见,则把该面显示出来。
否则,则把窗口等分成四个子窗口。对每个小窗口再做上述同样的处理。这样反复地进行下去。
如果到某个时刻,窗口仅有象素那么大,而窗口内仍有两个以上的面,这时不必再分割,只要取窗口内最近的可见面的颜色或所有可见面的平均颜色作为该象素的颜色。
光线投射算法
for屏幕上的每一象素
{ 形成通过该屏幕象素(u,v)的射线;
for 场景中的每个物体
{ 将射线与该物体求交;
if 存在交点
以最近的交点所属的颜色显示象素(u,v)
else
以背景色显示象素(u,v)
}
}
明暗处理
首先多边形的顶点法矢量不再简单的取为其所在多边形的面法矢,而是取为共该顶点的所有多边形的面法矢的平均值;其次多边形内部点的法矢量也不再简单地取为多边形的面法矢,而是利用多边形顶点的法矢量通过双线性插值计算出。
Phong明暗处理(插值法矢)
P1、P2、P3是多边形顶点,其法矢量视为共该点的所有多边形法矢量的平均值。由P1、P2的法矢量可以线性插值计算出A点的法矢量,由P1、P3的法矢量可以线性插值计算出B点的法矢量,于是P点的法矢量可以由A、B点处的法矢量线性插值计算出,计算出P的法矢量后应用简单光照模型可以计算出P点的光亮度。
Gouraud明暗处理(插值颜色)
由于每个像素点都需要法向量插值和光照计算,Phong明暗处理计算量较大,一种简化的处理方法是先利用光照模型计算出多边形顶点处亮度,然后对亮度进行双线性插值,直接获得像素的颜色
物体表面的细节(纹理)可以分为两类:
一类是由物体表面颜色、色彩、明暗变化体现出来的细节,如木材表面的木纹,建筑物墙壁上的装饰图案,光滑瓷砖表面上装饰图案,称为颜色纹理。它主要取决于物体表面的材质属性.
另一类是由物体表面不规则的细小凹凸造成的细节,如桔子表面的皱纹,称为几何纹理。它主要取决于物体本身的几何形状。
纹理类型
颜色纹理,
二维纹理,物体表面花纹、图案
三维纹理,木材纹理
几何纹理,基于物体表面的微观几何形状
法向扰动
颜色纹理映射的三个主要步骤:
(1)纹理函数定义;
(2)映射函数定义;
(3)纹理映射的实施;
纹理函数的定义方法:
最常用的纹理:图象纹理(二维纹理)
纹理的一般定义方法:可以用纹理函数来定义
一维纹理、二维纹理、三维纹理
定义域:称为纹理空间。对于二维纹理,可以归一化为单位正方形(0<=u<=1, 0<=v<=1)。
纹理空间中的每一点对应一个纹理值(值:灰度/颜色/或其它)。
图象纹理可以看成是二维连续纹理函数的离散采样。纹理空间中的点和纹理图案中的点对应。
映射方法
建立物体空间坐标(x,y,z)和纹理空间坐标(u,v)之间的对应关系
对物体表面进行参数化,反求出物体表面的参数后,根据(u,v)得到该处的纹理值,并用此值取代光照明模型中的相应项,实现纹理映射。
几何纹理方法:对物体表面几何性质作微小扰动,产生凹凸不平的细节效果,给物体表面图象加上一个粗糙的外观
物体表面上的每一个点P(u,v),都沿该点处的法向量方向位移F(u,v)个单位长度,