3.当物体间的z值范围重叠时:
判断多边形P是否遮挡场景中多边形Q,需作如下5个判别步骤
1.多边形P和Q的x坐标范围是否不重叠
2.多边形P和Q的y坐标范围是否不重叠
3.从视点看去,多边形P是否完全位于Q的背面
4.从视点看去,多边形Q是否完全位于P的同一侧
4.P和Q交换顺序后,仍不能判断其优先级顺序,可以按如下方法处理:
将其中一个多边形沿另一个物体剖分
特点:
●三维物体的深度排序算法适合于固定视点的消隐
●通过多边形的剖分,总是可以实现多边形物体在三维空间中的深度排序
●深度排序算法可以有效地实现透明效果
●在视点变化的场合中(如飞行模拟),深度排序算法难以满足实时性的要求
b)二叉空间剖分树算法(BSP)(见计算题)
4.OpenGL库函数的分类
1)OpenGL核心库(GL)
这部分函数用于常规的、核心的图形处理,是OpenGL的核心部分,包含300多个函数,函数名前缀一律是“gl”,核心库可以在所有的OpenGL平台上运行
2)OpenGL实用库(GLU)
这部分函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。
如:
坐标变换、纹理映射、绘制椭球、茶壶等简单多边形。
包含约50个函数,函数名前缀一律是“glu”,实用库可以在所有的OpenGL平台上运行
3)OpenGL辅助库(GLAUX)
这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。
包含约30个函数,函数名前缀一律是“aux”,OpenGL中的辅助库不能在所有的OpenGL平台上运行
4)OpenGL工具库(GLUT)
这部分函数主要提供基于窗口的工具,以及一些绘制较复杂物体的函数。
包含大约30多个函数,函数名前缀为“glut”,glut中的窗口管理函数不依赖于运行环境的,可以在所有的OpenGL平台上运行
5)OpenGL对窗口系统的扩展(例如对windows系统的扩展WGL,等等)
5.种子填充算法的原理
对区域重新着色的过程:
将指定的颜色从种子点开始扩展到整个区域
(填充算法要求区域是连通的)
连通性:
4连通区域:
区域中任意两点可通过上下左右四个方向互相到达
8连通区域:
区域中任意两点可通过上下左右和对角线八个方向互相到达
4连通与8连通区域的区别:
⏹连通性:
4连通可看作8连通区域,但对边界有要求不同
⏹依据区域内点能否访问到区域外的点,对边界的要求是
◆4连通区域,边界只要8连通即可
◆8连通区域,边界必须是4连通
●种子填充算法(泛滥填充:
flood-fill)
(1)内点表示的4连通区域:
种子P(x,y),原色oldColor,新颜色newColor
方法:
先判断P(x,y)的颜色,若其值不等于oldColor,说明该像素位于区域外,或已设置为newColor,算法结束;否则,置像素颜色为newColor,再对其相邻的上下左右四个像素分别作为种子作上述递归处理。
voidFloodFill4(intx,inty,intoldColor,
intnewColor)
{if(GetPixel(x,y)==oldColor)
{SetPixel(x,y,newColor);
FloodFill4(x,y+1,oldColor,newColor);
FloodFill4(x,y-1,oldColor,newColor);
FloodFill4(x-1,y,oldColor,newColor);
FloodFill4(x+1,y,oldColor,newColor);
}
}/*endofFloodFill4()*/
①FloodFill4(x,y+1,oldColor,newColor);
②FloodFill4(x,y-1,oldColor,newColor);
③FloodFill4(x-1,y,oldColor,newColor);
④FloodFill4(x+1,y,oldColor,newColor);
(2)边界表示的4连通区域
voidBoundaryFill4(intx,inty,intoldColor,intnewColor)
{//oldColor边界像素颜色
intcolor;
color=GetPixel(x,y);
if((color!
=oldColor)&&(color!
=newColor))
{
SetPixel(x,y,newColor);
BoundaryFill4(x,y+1,oldColor,newColor);
BoundaryFill4(x,y-1,oldColor,newColor);
BoundaryFill4(x-1,y,oldColor,newColor);
BoundaryFill4(x+1,y,oldColor,newColor);
}
}/*endofBoundaryFill4()*/
●缺点:
●有些像素需要重复判断,降低算法效率
●栈结构占空间
●递归执行,算法简单,但效率不高,区域内每一像素都引起一次递归,进/出栈,费时费内存
●改进:
●减少递归次数,提高效率
6.简单光照模型的反射公式
综合三种反射:
考虑光的衰减(光到物体表面)
考虑衰减的方程:
考虑到阴影的方程:
7.基于深度Buffer算法的特点(见上面消隐算法)
8.OpenGL着色模式函数的调用
voidglShadeModel(GLenummode);
设置着色模式。
参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。
采用恒定着色时(即GL_FLAT),使用图元中某个顶点的颜色来渲染整个图元。
在使用光滑着色时(即GL_SMOOTH),独立的处理图元中各个顶点的颜色。
对于线段图元,线段上各点的颜色将根据两个顶点的颜色通过插值得到。
对于多边形图元,多边形内部区域的颜色将根据所有顶点的颜色插值得到。
9.窗口与视区的关系
窗口定义显示什么:
在世界坐标系中需进行观察和处理的一个坐标区域称为窗口
视区定义在何处显示:
窗口映射到显示器(设备)上的区域称为视区。
改变视区的位置,可在输出设备显示区的不同位置观察物体。
改变视区的尺寸,可改变显示对象的尺寸和位置:
–如果将不同尺寸的窗口连续映射到尺寸不变的视区中,可得到缩放的效果;
•当窗口越变越小时,可以放大场景中的某一部分,从而观察在较大的窗口时未显示出的细节;
•同样,通过从一个场景部分开始连续地放大的窗口,可以得到逐步放大的场景;
•将固定尺寸的窗口移过场景中不同对象,产生扫描的效果。
窗口内的点(xw,yw)映射到对应视区的点(xv,yv):
xv=xvmin+(xw-xwmin)sx
yv=yvmin+(yw-ywmin)sy
sx=(xvmax-xvmin)/(xwmax-xwmin)
sy=(yvmax-yvmin)/(ywmax-ywmin)
10.各种裁剪算法比较
1)直线段裁剪
1.直接求交算法:
a)待裁剪线段和窗口的关系:
线段完全可见:
端点位于窗口内
显然不可见:
端点位于边界同侧
线段至少有一端点在窗口之外,但非显然不可见
b)计算交点
特点:
⏹方法直接,易懂
⏹不能快速判断显然不可见的线段
2.Cohen-Sutherland算法(编码算法)
算法步骤(思想):
⏹第一步判别线段两端点是否都落在窗口内,如果是,则线段完全可见;否则进入第二步;
⏹第二步判别线段是否为显然不可见,如果是,则裁剪结束;否则进行第三步;
⏹第三步求线段与窗口边延长线的交点,这个交点将线段分为两段,其中一段显然不可见,丢弃。
⏹对余下的另一段重新进行第一步,第二步,第三步处理,直至结束
(裁剪过程是递归的)
区域编码:
⏹由窗口四条边所在直线把二维平面分成9个区域,每个区域赋予一个四位编码,CtCbCrCl,上下右左
端点编码:
定义为它所在区域的编码
根据顶点编码判断线段与多边形的关系:
⏹当两个端点的编码全为0时,线段完全可见
⏹当线段的两个端点的编码的逻辑“与”非零时,线段为显然不可见的
⏹对于那些非完全可见、又非显然不可见的线段,需要求交
⏹求交前先测试与窗口哪条边所在直线有交?
⏹规则:
判断端点编码中各位的值CtCbCrCl
⏹分别对应:
上、下、右和左边
⏹端点码值位值不同时,说明线段与对应窗口边相交
⏹次序:
上、下、右和左边
⏹以交点为界,丢弃外侧线段,以交点为新端点判断另一线段,重复上述过程
特点:
◆对完全可见和显然不可见线段的快速判别
◆适用二种场合
⏹大裁剪窗口
⏹裁剪窗口特别小
◆裁剪窗口的拓展性
⏹可以延伸为凸多边形,但随着边数的增加,编码变复杂
3.Liang-Barsky:
设要裁剪的线段是P0P1。
P0P1和窗口边界交于A,B,C,D四点,见图。
算法的基本思想是从A,B和P0三点中找出最靠近的P1点,图中要找的点是P0。
从C,D和P1中找出最靠近P0的点。
图中要找的点是C点。
那么P0C就是P0P1线段上的可见部分。
2)多边形裁剪
1.Sutherland-Hodgman算法(亦称逐边裁剪算法):
(重点)
●S-H算法基本思想:
将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪
●步骤:
⏹多边形由一系列顶点表示:
V1V2…Vn
⏹按一定(左上右下)的次序依次裁剪;与左边所在直线裁剪的结果是上边的输入,依次类推
⏹输出为顶点序列
●裁剪线裁剪
⏹多边形与窗口每条边的裁剪
◆裁剪线:
窗口边以及其延长线
◆内侧空间与外侧空间
●包含裁剪窗口的半空间为内侧空间,否则为外侧空间
⏹多边形与窗口裁剪线的裁剪
◆依据多边形的边SP与半空间的关系
●情况1:
同在内侧,裁剪后输出P
●情况2:
S在内侧,P在外侧,裁剪后输出交点i
●情况3:
同在外侧,裁剪后不输出
●情况4:
S在外侧,P在内侧,裁剪后输出交点i和P
●算法
⏹将顶点序列P1P2…Pn作为输入
⏹依次对窗口的每条裁剪线作下列处理
◆输入顶点序列
◆依次对顶点序列中相邻顶点构成的边PiPi+1进行裁剪处理
◆输出顶点序列(下条裁剪线的输入)
例子:
左:
输入P1P2P3P4P5P6P7P8
输出I1P2P3P4P5P6P7P8I2
上:
输入I1P2P3P4P5P6P7P8I2
输出P2I3I4P4P5P6P7P8I2I1
右:
输入P2I3I4P4P5P6P7P8I2I1
输出I3I4P4I5I6P6P7P8I2I1P2
下:
输入I3I4P4I5I6P6P7P8I2I1P2
输出I4P4I5I6I7I8P8I2I1P2I3
注意:
(1)交点是边与裁剪线的交点
(2)边的顶点是有序的
●特点:
●裁剪算法采用流水线方式,算法简单
●推广到任意凸多边形裁剪窗口
原因是:
凸多边形的边能将平面空间分成2部分,其中一部分含裁剪窗口
2.Weiler-Athenton算法:
(详细介绍见CG07--二维裁剪)
(Sutherland-Hodgeman算法解决了裁剪窗口为凸多边形窗口的问题,但一些应用需要涉及任意多边形窗口(含凹多边形窗口)的裁剪。
Weiler-Atherton多边形裁剪算法正是满足这种要求的算法。
)
二、简答题
1.颜色插值(Gourand着色方法)
步骤:
1、计算多边形的单位法矢量
2、计算多边形顶点的单位法矢量(共享顶点的多边形法矢量
的平均值)
3、利用光照明方程计算顶点颜色
4、对多边形顶点颜色进行双线性插值,获得多边形内部各点
的颜色
双线性插值:
⏹已知P1(x1,y1)、P2(x2,y2)、P3(x3,y3),颜色分别为I1、I2和I3。
A(xA,yA)和B(xB,yB)为交点,P(x,y)为AB上一点,计算P点的颜色
2.齐次坐标的作用。
所谓齐次坐标表示就是用
维向量表示
维向量。
齐次坐标表示法一方面可以表示无穷远点,另一方面用齐次坐标表示,使得所有几何变换都可以用矩阵相乘来表示,获得了平移、旋转和缩放变换的一致性表示,无论哪种变换形式,变换矩阵均可以用一个统一矩阵来表示。
由于引入了齐次坐标,基本几何变换均可以表示成
的形式,因此组合变换的结果是每次的变换矩阵相乘,组合变换同样具有
的形式。
由于矩阵的乘法满足结合律,因此,通常在计算时先求出T,再与P相乘。
3.Phong反射模型(n值大小的判断)
Phong模型(非理想反射面)
计算公式:
Ks是物体表面镜面反射系数,它与入射角和波长有关;
α是视线与反射方向的夹角;
n为镜面高光系数,用来模拟镜面反射光在空间中的汇聚程度,它是一个反映物体表面光泽度的常数;近似地描述了镜面反射光的空间分布
镜面参数n的影响效果
n=15n=5n=1
4.二维观察流程图(自行车示例)
二维观察流程示意图:
局部坐标系——世界坐标系——观察坐标系——设备坐标系——窗口坐标系
三、计算题
1.中点画线算法
隐式方程:
F(x,y)=ax+by+c=0
式中a=y0-y1=-y,b=x1-x0=x,c=x0*y1-x1*y0
递推公式:
(前提条件:
斜率
)
其它几种情况:
di<0时,y增1
di>0时,x增1
di>0时,y减1
di<0时,x增1
例3-1:
直线段端点坐标
p0(20,10)和p1(30,18)
△x=30-20=10;△y=18-10=8
斜率m=0.8;
a=y0-y1=-y=-8;
b=x1-x0=x=10;
d0=2a+b=-6;
2(a+b)=4
2.二叉空间剖分树(BSP树-BinarySpacePartitioning)构建
基本原理:
●如果场景中的多边形可以被一个平面分割成两部分(如果有多边形跨越分割平面,则剖分该多边形),那么当视点位于分割平面的正侧时,位于分割平面正侧的多边形会遮挡位于分割平面另一侧的多边形
●对位于分割平面两侧的多边形继续进行递归分割,直至每一个分割平面两侧或一侧只有一个多边形
●分割过程可以用一个二叉树的数据结构来表示
●在BSP树算法中,分割平面取作场景中的多边形
给定场景的BSP树不是唯一的
“最佳”的BSP树的两个标准:
●使BSP树尽可能平衡
●尽可能减少多边形的剖分
BSP树的遍历过程就是建立多边形的优先级的过程,这是一个递归过程
●如果视点位于分割平面的正侧,那么该BSP树的遍历过程应当是:
负侧分支→根结点多边形→正侧分支
●如果视点位于分割平面的负侧,那么该BSP树的遍历过程应当是:
正侧分支→根结点多边形→负侧分支
●这个判定标准递归地应用于每个子分支
3.种子填充(见选择题)
4.逐边裁剪算法(见选择题)