当前位置: 首页 > news >正文

输出图元(四)8-1 图元、屏幕坐标、指定二维世界坐标系统

 
        用于图形应用的通用软件包称为计算机图形应用编程接口(CCAPI)它提供可以在C++等程序设计语言中用来创建图形的函数库。如第3 章所指出的,函数库可以分成几种类型。创建图形时最先要做的一件事就是要描述显示场景的组成部分。图形的组成部分可以是树木和地形家具和墙壁、商店铺面和街景、汽车和广告牌、原子和分子或者星星和银河。对于每一类场景要描述每一对象的结构及其在场景中的坐标位置。图形软件包中用来描述各种图形元素的函数称为图形输出原语(graphicsoutput primitive),或简称为图元(primitive)。描述对象几何要素的输出图元一般称为几何图元(geometric primitive)。点的位置和直线段是最简单的几何图元。图形软件包中另外的几何图元有圆和其他二次曲线、二次曲面、样条曲线和曲面及多边形填色区域。多数图形系统还提供某些显示字符串的函数。在选定的坐标系中指定一个图形的几何要素后,输出图元投影到与该输出设备显示区域对应的二维平面上,并扫描转换到帧缓存的整数像素位置。本章将介绍OpenGL中的输出图元并讨论它们的应用。第6章再讨论实现输出图元的设备级算法。


4.1 坐标系统

        为了描述图形,必须首先确定一个称为世界坐标系的合适的二维或三维笛卡儿坐标系。接着通过给出世界坐标系中的位置等几何描述来定义图形中的对象。例如,通过两个端点定义一条直线段,通过一组顶点位置定义一个多边形。这些坐标位置与该对象的颜色、坐标范围(coordinate extent)即对象标y的最小值和最大值等其他信息一起存储在场景描述中。坐标范围也称为对象的包围盒(bounding box)。对于二维图形来说坐标范围也称为对象的包围矩形(bounding rectangle)。通过将场景信息传送给观察函数由观察函数识别可见面将对象映射到视频监视器上来实现对象的显示。扫描转换过程将颜色值等场景信息保存到帧缓存的相应位置,从而在输出设备上显示场景中的对象。
4.1.1 屏幕坐标
        视频监视器上的位置使用与缓存中的像素位置相对应的整数屏幕坐标(screen coordinate)进行描述。像素的坐标值给出扫描行号(y 值)和列号(扫描行的 值)。屏幕刷新等硬件处理一般从屏幕的左上角开始对像素进行编址。从屏幕最上面的0行到屏幕最下面的某整数值行对扫描行进行编号,每一行中像素位置从左到右、从0到xm进行编号。但是使用软件命令可以按照任何方式设定屏幕位置的参考系统。例如,我们可以设定屏幕区域左下角为原点,用整数坐标(参见图4.1)或非整数笛卡儿坐标来描述图形。描述场景几何要素的坐标值由观察函数转换为顿缓存中的整数像素位置。

        图元的扫描转换算法使用定义的坐标描述来确定要显示像素的位置。例如,给定一直线段的两个端点,其显示函数必须计算出两端点间位于线段上所有像素的位置。由于一个像素位置占有屏幕上的一个有限范围,因此实现算法必须考虑像素的有限大小。目前,我们假设每一整数屏幕位置代表像素区域的中心。(我们将在6.8节考虑其他的像素编址方法。一旦确定了一个对象的像素位置,必须将合适的颜色值存人帧缓存。为此,我们要使用一个底层函数
setPixel (x,y);
该函数将当前颜色设定值存入帧缓存的整数坐标位置(x,y)处该位置相对于屏幕坐标原点而选定。有时我们也希望获得一个像素位置的当前帧缓存设置。使用下列底层函数可以获得帧缓存的
颜色值:getPixel (x,y,color);在这一函数中参数color 得到一个与存储在位置(xy)的像素中的红色、绿色和蓝色(RGB)组合对应的整数值。

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

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

        然而,有些图形软件包还允许使用相对坐标(relative cordinate)来描述位置。该方法在许多图形应用中很有用,比如用笔式绘图仪、艺术家绘画系统进行绘图及出版和印刷应用的图形软件包。使用这一方法,我们可以使用从离开最后一次引用的位置(称为当前位置,current position)的位移量来指定坐标位置。例如,如果位置(3,8)是应用程序刚刚引用的位置,则相对坐标描述(2,-1)与绝对位置(57)相对应。有一个函数专门用来在指定任何图元坐标前设定当前位置。在描述一串首尾相连的直线段场景时,我们可以在建立开始位置后仅给出一串相对坐标(位移)。图形系统中会给出指定位置时使用相对坐标还是绝对坐标的选项。在此后的讨论中,除非特别声明,我们假定都使用绝对坐标。

4.2OpenGL中指定二维世界坐标系统
        第一个示例程序(在3.5 节讨论过了)介绍了 gluortho2D 命令,我们可以利用该命令设定一个二维笛卡儿坐标系。该函数的变量是指定显示图形的和y坐标范围的四个值。由于gluortho2D函数指定正交投影,因此我们也要确定坐标值放进了OpenCL投影矩阵中。此外,我们可以将世界坐标范围设定前的投影矩阵定义为一个单位矩阵。这样可保证坐标值不会受以前设置的投影矩阵的影响。因此,对于最初的二维例子,我们可以通过下列语句定义屏幕显示窗口的坐标系统:
        g1MatrixMode (GL PROJECTION):
        glLoadIdentity():
        gluOrtho2D (xmin,xmax, ymin, ymax);
  如图4.2所示,显示窗口被指定为其左下角位于坐标(xmin,ymin)处右上角位于坐标(xmax,ymax)处。
        我们随后可使用gluortho2D语句描述的坐标系统来指定一个或多个要显示的图元。如果个图元的坐标范围完全在显示窗口的坐标范围内,则该图元将完整地显示出来。否则,仅仅在显示窗口坐标范围内的图元部分被显示。同样,在建立图形的几何描述时,所有 OpenGL图元的位置必须用gluortho2D函数定义的坐标系统中的绝对坐标给出。

http://www.lryc.cn/news/152234.html

相关文章:

  • 机器学习---决策树的划分依据(熵、信息增益、信息增益率、基尼值和基尼指数)
  • java解析json
  • PAT 1163 Dijkstra Sequence
  • 嵌入式学习之进程
  • C#-单例模式
  • WSNs 安全技术
  • H5如何做页面下拉刷新和上拉加载
  • Camunda 7.x 系列【42】事件子流程
  • JVM类的加载过程
  • Jmeter如何设置中文版
  • flutter自定义按钮-文本按钮
  • 无涯教程-Android - CheckBox函数
  • [Go版]算法通关村第十五关青铜——用4KB内存寻找重复元素
  • OJ练习第159题——消灭怪物的最大数量
  • Prometheus-Rules(规则)
  • 打卡智能中国(六):村里出了“飞行员”
  • 自动化运维工具Ansible之playbooks剧本
  • K8S访问控制------认证(authentication )、授权(authorization )、准入控制(admission control )体系
  • 开开心心带你学习MySQL数据库之第三篇上
  • Mysql批量插入大量数据的方法
  • centos安装nginx实操记录(加安全配置)
  • 【中等】49. 字母异位词分组
  • Python3 条件控制
  • IDEA自定义模板
  • 【Unity3D】UI Toolkit简介
  • QT 界面相关操作
  • nestjs:docker build时执行npm install sharp提示downloading libvips socket hang up
  • 图像分类学习笔记(七)——MobileNet
  • ssm+vue宠物领养系统源码和论文
  • 阜时科技联合客户发布全固态激光雷达面阵SPAD芯片及雷达整机