`

计算机图形学 笔记 第三章 输出图元

 
阅读更多

用于图形应用的通用软件包称为计算机图形应用编程接口(CG API)。它提供可以在C++等高级编程语言中用来创建图形的函数库。

创建图形时最先要做的是描述场景的组成部分。图形的组成部分可以是树木、家具、墙壁等等。对于每一类场景,要描述每一个对象的结构及其在场景中的坐标位置

 

图形软件包中用来描述各种图形元素的函数称为图形输出原语(graphic output primitive),或简称为图元(primitive)。描述对象几何要素的输出图元一般称为几何图元。点的定位和直线段是最简单的几何图元。

图形软件包中包含的其他几何图元有圆和其他二次曲线、二次去面、样条曲线和曲面及多边形填色区域。

多数图形系统还提供显示字符串的某些函数。

 

在选定的坐标系中制定一个图形的几何要素后,输出图元投影到与该输出设备显示区域队形的二维平面上,并扫描转换到帧缓存的整数像素位置。

 

 

3.1 坐标系统

 为了描述系统,必须首先确定一个称为世界坐标系的合适的二维或三维笛卡尔坐标系。接着通过给出世界坐标系中的位置等几何描述来定义图形中的对象。这些坐标位置与该对象的颜色、坐标范围即对象坐标的x\y\z最小/最大值等其他信息一起存储在场景描述中。坐标范围也称为对象的包围盒。对于二维图形来说,坐标范围也称为对象的包围举行(bounding rectangle)。

通过将场景信息传送给观察函数、由观察函数识别可见面、将对象映射到视频显示器上来实现对象的显示。

扫描转换过程将颜色值等场景信息保存到帧缓存的相应位置,从而在输出设备上显示场景中的对象。

3.1.1 屏幕坐标

 视频监视器上的位置使用与帧缓存中的像素位置相对应的整数屏幕坐标(screen coordinate)进行描述。像素的坐标值给出扫描行号(y值)和列号(扫描行的x值)。屏幕刷新等硬件处理一般从屏幕的左上角开始对像素进行编址。从屏幕最上面的0行到屏幕最下面的某整数值ymax行对扫描行进行编号,每一行中像素位置从左到右、从何0到xmax进行编号。但是使用软件命令可以按照任何设定屏幕位置的参考系统。

 

图元的扫描转换算法使用定义的坐标描述来确定要显示像素的位置。。例如给定一直线段的两个端点,其先是函数必须计算出两断电间位于线段上所有像素的位置。由于一个像素位置占有屏幕上的一个有限范围,因此实现算法必须考虑像素的有限大小。目前,我们假设每一整数屏幕位置代表像素区域的中心。

一旦确定了一个对象的像素位置,必须将合适的颜色存入帧缓存。为此我们使用一个底层函数:setPixel(x,y);

该函数将当前颜色设定值存入帧缓存的证书坐标位置(x,y)处,该位置相对于屏幕坐标远点而选定。有事我们也希望获得一个像素位置的当前帧缓存值。可以使用下列底层函数来获得。

getpixel(x,y,color);

在这一函数中,参数color得到一个存储在位置(x,y)的像素中的RGB组合对应的整数值。

对于二维图像来说,仅需在(x,y)位置指定颜色值;但是对于三维图形来说,还需要其他的屏幕坐标信息。这时,屏幕坐标按三维值来存储,第三维表示对象位置相对于观察位置的深度。在二维场景中,深度值为0。

3.1.2 绝对和相对坐标描述

 目前为止,我们讨论的坐标均为绝对坐标(absolute coordinate)值。这表示指定的值是所在坐标系统中的实际位置。

有些图形软件允许使用相对坐标来描述位置。

3.2 OpenGL中制定二维世界坐标系统

我们可以利用 gluOrtho2D命令设定一个二维笛卡尔坐标系。该函数的变量指定显示图形x和y坐标范围的四个值。由于gluortho2D函数指定正交投影,因此我们也要确定坐标值放进了OpenGL投影矩阵中。此外,我们可以将世界坐标范围设定钱的投影矩阵定义为一个单位矩阵。这样可保证坐标值不会受以前的投影矩阵的影响。我们可以通过下列语句定义屏幕显示窗口的坐标系统。

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(xmin,xmax,ymin,ymax);

显示窗口将被指定为其左下角位于(xmin,ymin),右上角位于坐标(xmax,ymax)处。

 3.3 OpenGL画点函数

要描述一个点的几何要素,我们只需要在世界坐标系中制定一个位置。然后该坐标位置和场景中已有的其它几何描述一起传递给观察函数。除非指定其它属性值,OpenGL图元按照默认的大小和颜色来显示。默认的颜色是白色,而默认的点的大小等于一个屏幕响度大小。

使用下面的OpenGL函数可以指定一个点位置的坐标值:

glVertex*();

这里的星花表示该函数要有后缀吗。这些后缀码用来指明空间尺寸、用作坐标值得数据类型和可能的向量形式坐标描述。glBegin函数的变量用来指定要显示的输出图元的类型,而glEnd函数没有变量。对于点的绘制,glBegin函数的变量时符号常量GL_POINTS。因此,一个点的位置的OpenGL描述形式是:

glbegin(GL_POINTS);

   glvertex*();

glEnd();

尽管术语顶点(vertex)严格地代表一个多边形的“角”点、一个角两边的交点、椭圆和其株洲的交点或几何结构中其他类似的坐标位置,OpenGL中glVertex函数可用于描述任意一点的位置。这样,使用一个简单的函数来描述点、线段和多边形,而更多地使用多边形片来描述场景对象

OpenGL中的坐标位置可以有二维、三维或四维。glvertex的后缀为2、3或4表示其坐标位置的维数。

四维描述意味着齐次坐标表示,其中齐次参数h(第四维坐标)是笛卡尔坐标值的比例因子。齐次坐标系表示对利用矩阵形式表达变换操作很有用。由于OpenGL将二维看做三维的特殊情况来处理,任意(x,y)坐标描述等同于h=1时的(x,y,0)。

我们需要支出在坐标的数值描述中使用什么样的数据结构。这由glVertex的第二个后缀来完成。用于制定数值数据类型的后缀是:i(整数)、s(短整数)、f(浮点数)、和d(双精度浮点数)。最后,

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics