资源预览内容
第1页 / 共65页
第2页 / 共65页
第3页 / 共65页
第4页 / 共65页
第5页 / 共65页
第6页 / 共65页
第7页 / 共65页
第8页 / 共65页
第9页 / 共65页
第10页 / 共65页
亲,该文档总共65页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第三章 绘制基本图元 复杂的三维图形是由一个个简单的图元构成的,点和直线段是最简单的几何图元,此外还有多边形、圆,二次曲线、二次曲面、样条曲线、样条曲面等。 本章介绍OpenGL的输出图元及底层(设备级)实现算法,以便深层次地掌握图形绘制的原理和方法,提高计算机图形的制作水平。3.1 坐标系统 计算机只能处理数据,为了能在屏幕上显示三维图形,必须将 三维图形与数据相联系,将数据与三维图形联系在一起的唯一 纽带,就是坐标。 为了描述图形,首先必须建立一个世界坐标系(二维或三维笛 卡尔坐标系),在世界坐标系中给出图形对象的位置和方向,然后投影到显示设备的显示区域对应的二维平面上,并扫描转 换到帧缓存的整数像素位置。 如可以通过两个端点定义一条直线段,通过一组顶点定义一个 多边形。对象的坐标范围(x、y、z坐标的最大最小值)称为对象的包围盒,对于二维图形,坐标范围就是包围矩形。屏幕坐标及图形坐标显示器上的位置用整型的屏幕坐标来描述,与帧缓存中的像素位置相对应。 坐标y值给出像素的行序号,x值给出列序号。屏幕刷新硬件一般从屏幕的左上角开始对像素进行编址,从最上面的0行到最 下面的ymax行,对扫描行进行编号;每行从左到右,从0到xmax按列进行编号。图形软件可以按照任意方式设定屏幕位置的图形坐标系统,如可以设定屏幕 区域的左下角为原点(视区的默认值),用整数坐标或非整数笛卡尔坐标来描述图形。描述物体对象的坐标值最终转换为帧缓存中的整数像素位置。图元的扫描转换根据给定的坐标来确定要显示的像素位置,如给定一条直线 段的两个端点,显示函数必须计算出两端点间位于线段上的所有像素的位置 。由于一个像素位置占有屏幕上的一个有限范围,因此图形显示算法必须考虑 像素的有限大小,一般假定像素坐标对应于像素区域的中心。屏幕上的笛卡尔坐标系显示窗口上一章的绘图实例中应用gluOrtho2D(xmin, xmax, ymin, ymax)函数设定了一个二 维视见空间(二维笛卡尔坐标系),其参数指定了显示窗口的x、y坐标范围。显示窗口的左下角位于坐标(xmin,ymin)处,右上角位于坐标(xmax,ymax)处。如果一个图元的坐标范围完全在显示窗口内,该图元将完整地显示出来,否 则,仅仅位于显示窗口范围内的部分图元能显示出来,这涉及到裁剪。3.2 顶点及图元在OpenGL中所有的几何物体最终都要描述成一个顶点的有序集合,包括单个 点、线段的端点或多边形的顶点。点由其坐标来描述,线是指线段,可由两个端点来描述,多边形是指由线段 组成的封闭区域,由各线段的端点来描述。 要绘制一个三维点,只需在世界坐标系中指定该点的坐标,OpenGL按指定的 大小和颜色来显示这个点,默认的颜色为白色,默认的大小为一个屏幕像素 大小,屏幕上绘制的像素是一个正方形区域。多边形常常通过充填其内部的像素来显示,也可以显示其轮廓线。一般而言 ,多边形可能很复杂,所以OpenGL对多边形做了一些强制限定。首先,多边 形的边不能相交,其次多边形必须是凸的,如果指定一个非凸的多边形,将 绘出意想不到的结果。对多边形类型作出限制,是为了提高绘制多边形的速 度和性能。由于顶点一般是三维的,如果多边形的顶点并不处于同一平面内,经过一系 列旋转及改变视点后,这些点将不再组成一个简单的凸多边形, OpenGL无 法保证这个多边形得到正确绘制。一般可以通过一系列三角形来逼近多边形 ,因为三角形的三个顶点肯定位于同一个平面内。指定顶点坐标 OpenGL中,可以使用函数glVertex()指定顶点的坐标,但顶点既可以是一个纯粹的点,也可以是线段的端点, 还可以是多边形的角点, OpenGL中共有10种图元,必须明确指明这些顶点构成何种图元。 OpenGL中将每组顶点放在函数glBegin() 和glEnd()之 间,由glBegin() 的参数来指定相应的几何图元,然后调 用glEnd()来结束这组顶点的定义。几何图元的参数和含义参数值值意义义GL_POINTS独立的点GL_LINES一对顶对顶 点表示一条线线段GL_LINE_STRIP各顶顶点连连接成的线线段GL_LINE_LOOP各顶顶点连连接成的封闭线闭线 段GL_TRIANGLES三个顶顶点构成的三角形GL_TRIANGLE_STRIP相连连的三角形条带带GL_TRIANGLE_FAN相连连的扇形GL_QUADS四个顶顶点构成的四边边形GLQUAD_STRIP相连连的四边边形条带带GL_POLYGON简单简单 的凸多边边形绘制三维点例3-1(POINTS)绘制一系列的三维点,使它们沿Z轴形成一个螺旋圈。 glBegin(GL_POINTS);z = -50.0f; for(angle = 0.0f; angle 0 )。假 如yk处的像素比yk+1的像素更接近于线段(即dlower 0, 如果(x, y)位于圆外圆函数即为决策参数,下图给出了采样位置xk+1上两个候选像素间的中点。圆周上采样位置xk+1上候选像素间的中点假设刚在(xk, yk)绘制了一个像素,下一步需要确定是像素(xk+1, yk)还是像素 (xk+1, yk-1)更接近于圆,在两像素的中点求决策参数的值: pk=f(xk+1, yk-1/2) =(xk+1)2+(yk-1/2)2-r2假若pk 0,则该中点位于圆内,扫描线yk上的像素接近于圆周边界。否则该中 点位于圆外或圆周上,选择扫描线yk-1的像素。后续的决策参数可以使用增量运算得到,如对采样位置 xk+1= xk+2处的圆函数求值,可以得到下一个决策参数的循环表达式: pk+1=f(xk+1+1, yk+1-1/2) =(xk+1)+12+(yk+1-1/2)2-r2 = pk+2(xk+1)+(y2k+1-y2k)-(yk+1-yk)+1其中,yk+1是yk或yk-1 ,取决于pk的符号。若pk为负,则yk+1=yk ,pk+1的增量为2xk+1+1;若pk为正,则yk+1=yk-1, pk+1的增量为2xk+1+1-2yk+12xk+1和2yk+1的求值也可以通过增量的方式求得: 2xk+1 =2xk+2 2yk+1 =2yk-2在起始位置(0, r)处,这两项的初始值分别为0和2r。在起始位置(0, r)处,初始决策参数为: p0=f(1, r-1/2)=1+(r-1/2)2-r2=5/4-r若以整数屏幕坐标为参数,则中点方法使用整数加减来计算圆周的像素位置 。中点画圆算法的步骤:(1) 输入圆半径r和圆心(xc, yc),并得到圆周(圆心在原点)上的第一个点: (x0, y0)=(0, r)(2) 计算决策参数的初始值: p0=5/4-r(3) 在每个xk位置,从k=0开始,计算决策参数,若pk0,则圆周下一像素位置 为(xk+1,yk),并且 pk+1=pk+2xk+1+1否则圆的下一点为(xk+1,yk-1),并且 pk+1=pk+2xk+1+1-2yk+1其中, 2xk+1 =2xk+2且2yk+1 =2yk-2(4) 确定其它7个八分圆中的对称点。(5) 将每个计算出来的像素位置(x,y)平移到圆心在(xc, yc)的圆周上,并绘出各 点(x+xc, y+yc)。(6) 重复步骤3到步骤5 , 直至xy。例, 使用中点画圆算法画圆给定圆半径r=10,确定在第一象限从x=0到x=y沿八分圆的各像素点位置。决策参数的初始值为: p0=1-r=-9对于中心在原点的圆,初始点(x0, y0)=(0, 10),决策参数的初始增量值: 2x0=0, 2y0=20使用中点画圆法计算的后续决策参数值及像素位置如下:kpkxk+1, yk+12xk+1,2yk+10-6(1,10)2201-6(2,10)4202-1(3,10)62036(4,9)8184-3(5,9)101858(6,8)121665(7,7)1414用中点画圆法得到的像素位置(空心圆为第一象限的对称位置)使用折线来逼近曲线 常见的曲线除圆以外,还有椭圆、圆锥曲线、三角和指数函数、 样条曲线等。 生成圆和椭圆等基本曲线的函数并未作为图元包含在OpenGL的 核心库中,但核心库中包含了Bezier样条曲线,该曲线是由一组离散点定义的多项式。 显示曲线的简单方法是使用直线段来逼近曲线,仅需确定一组曲 线上的点并将它们连接成一组直线段。折线中的线段越多,曲线 越平滑。3.5 填充区图元图形学中常常需要用一种颜色或某种图案来填充一个区域,尽管有可能使用 各种形状,但图形库一般不支持任意的填充形状,多数库函数要求填充区为 多边形。多边形是由三个或更多的顶点连接而成的封闭图形,由于多边形的 边界为直线段,因而比其他形状更容易处理。可将曲线转换为由分段折线构 成的多边形,曲面也可以用一系列多边形面片来逼近。如果一个多边形的所有内角均小于180,则该多边形为凸(convex)多边形。等价定义:它的内部完全在它的任一边及其延长线的一侧。如果任意两点位于 凸多边形的内部,则其连线上的任一点也在凸多边形的内部。不是凸多边形 的多边形称为凹(concave)多边形。退化多边形是指有共线或重合顶点的多边形,共线的顶点生成一条线段,重 叠的顶点可以生成多余线段、重叠边或长度为0的边。为了软件的鲁棒性,图形软件可以拒绝退化或非平面的多边形。凹多边形也会产生一些问题,对凹多边形的填充及其它处理比较复杂,常常 将凹多边形分割成一组凸多边形以提高效率。可以为多边形的每一条边建立一个向量,用相邻边的叉积来测试凸凹性,凸 多边形的所有向量叉积均同号,如果某些叉积为正而另一些为负,则为凹多 边形。识别凹多边形的另一个方法是观察多边形顶点位置与每条边延长线的 关系。如果有些顶点在某一延长线的一侧而有些顶点在另一侧,则为凹多边 形。多边形的填充算法分为扫描线填充算法和种子填充算法。扫描线的含义来源于光栅显示器,对屏幕上的每个像素点,按从上到下,从 左到右的顺序进行显示,水平方向从左到右每扫描一行,就是一条y方向的扫 描线,同理,从上到下也能形成x方向的扫描线。扫描线填充算法的原理是:待填充区域按y方向(或x方向)扫描线的顺序,计算扫描线与多边形的相交区间,再用指定的颜色填充这些区间的像素,区间的 端点可以通过计算扫描线与多边形边界的交点求得。通用多边形的扫描线填充算法下图给出了多边形区域实心填充的扫描线过程。对每一条与多边形相交的扫 描线,与边的交点从左到右排序,且将每一对交点之间的像素位置包括这对 像素在内,设定为指定颜色,本例中与边界的四个交点定义了两段内部像素 :从x=10到14的5个像素,以及从x=18到x=24的7个像素。如果是用图案填充多边形,则沿一条扫描线的每一个像素颜色由与图案重叠 的位置确定。穿过多边形区域的扫描线上的内部像素有时情况比较复杂,当一条扫描线经过多边形的一个顶点时,扫描线在该顶 点处与多边形的两条边相交,这种情况可能导致在这条扫描线上的交点要增 加两个点。下图给出了在顶点处与多边形相交的两条扫描线。扫描线y与偶数条边相交,必须将该顶点处的交点作为2个交点,才能正确标识该扫描线上的两对交点之间为内部像素段。扫描线y与多边形的5条边相交,必须将该顶点除的交点作为1个交点,才能正确标识该扫描线上的两对交点之间为内部像素段。通过观察相交边相对于扫描线的位置,可以发现扫描线y和扫描线y间的拓扑 差异。对于扫描线y,共享一个顶点的两条相交边位于扫描线的两侧,对于扫 描线y,两条相交边位于扫描线的同一侧。扫描线与多边形顶点相交,y生成奇数个交点,y生成偶数个交点可以通过顺时针或逆时针方向来搜索多边形
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号