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

news2024/11/28 22:40:16

 
        用于图形应用的通用软件包称为计算机图形应用编程接口(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.coloradmin.cn/o/967959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - CUBEKPIMEMBER函数

描述 该函数返回关键绩效指标(KPI)属性,并在单元格中显示KPI名称。 语法 CUBEKPIMEMBER (connection, kpi_name, kpi_property, [caption])争论 Argument描述Required/OptionalconnectionName of the connection to the cube - A text stringRequiredkpi_nameName of the K…

13. 性能测试

目录 1. 什么是性能测试 1.1 常见的性能问题 1.2 性能测试的概念 1.3 性能测试和功能测试的区别 1.4 性能的好坏如何定义 1.5 影响性能的因素 2. 为什么进行性能测试 3. 性能测试常见专业术语以及衡量指标 4. 性能测试分类 4.1 基准测试 4.2 负载测试 4.3 压力测…

FC-CLIP-卷积永存:开放词汇分割与单一冻结卷积CLIP

论文链接:https://arxiv.org/abs/2308.02487 Github:GitHub - bytedance/fc-clip: This repo contains the code for our paper Convolutions Die Hard: Open-Vocabulary Segmentation with Single Frozen Convolutional CLIP 机构:约翰霍普…

PLL原语例化使用时常见问题

目录 一、前言 二、常见问题 问题一、综合阶段报错[Synth 8-439] 问题二、综合阶段报错[Synth 8-448] 问题三、在实现阶段DRC报错DRC PDRC-38 问题四、在实现阶段DRC报错DRC PDRC-43 一、前言 在设计中经常会使用PLL的原语进行例化使用,PLL如果直接例化使用将…

十二、MySQL(DQL)分组/排序/分页查询如何实现?

总括 select 字段列表 from 表名 [where 条件] (group by)/(order by)/(limit) 分组字段名 分组查询 1、分组查询 (1)基础语法: select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组之后的过滤条件] (…

【C++初阶】queue的常见操作和模拟实现以及deque的介绍

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

相交链表:k神题解的一点小感慨

题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 朴素解法 用…

linux中busybox与文件系统的关系

busybox与文件系统 在 Linux 中,BusyBox 是一个精简的、多功能的工具集合,它包含了一系列常用的命令和实用程序,如 ls、cp、mkdir 等。BusyBox 的目标是提供一个功能完整而又占用空间较小的工具集合,适用于嵌入式系统或资源受限的…

Linux系统中驱动面试分享

​ 1、驱动程序分为几类? 字符设备驱动 块设备驱动 网络设备驱动 2、字符设备驱动需要实现的接口通常有哪些 open、close、read、write、ioctl等接口。 3、主设备号与次设备号的作用 主设备号和次设备号是用来标识系统中的设备的,主设备号用来标识…

信息熵 条件熵 交叉熵 联合熵 相对熵(KL散度) 互信息(信息增益)

粗略版快速总结 条件熵 H ( Q ∣ P ) 联合熵 H ( P , Q ) − H ( P ) 条件熵H(Q∣P)联合熵H(P,Q)−H(P) 条件熵H(Q∣P)联合熵H(P,Q)−H(P) 信息增益 I ( P , Q ) H ( P ) − H ( P ∣ Q ) H ( P ) H ( Q ) − H ( P , Q ) 信息增益 I(P,Q)H(P)−H(P∣Q)H(P)H(Q)-H(P,Q) 信息…

vulhub-tomcat弱口令

1.启动靶场 进入文件 进入目录 进入到靶场 启动靶场 docker-compose up -d 2.查看 ip地址 3.使用nmap对ip进行 扫描 发现存在8080的端口,并且端口是开放的状态,apache,tomcat搭建的 4.访问ip地址的端口 点击Manager app 6.开启BP进行抓包 随…

【力扣每日一题】2023.9.3 消灭怪物的最大数量

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目比较长,我概括一下就是有一群怪物,每只怪物离城市的距离都不一样,并且靠近的速度也不一样&#x…

每日一题 1921. 消灭怪物的最大数量

难度:中等 思路: 已知速度和距离,可求时间必定先消灭时间最短的怪物求得时间数组排序,只要在第 i 秒时,time[i] > i ,那么就可以消灭第 i 个怪物 代码: class Solution:def eliminateMax…

CVPR2022 Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels

Semi-Supervised Semantic Segmentation Using Unreliable Pseudo-Labels 使用不可靠的伪标签的半监督语义分割 Paper:https://openaccess.thecvf.com/content/CVPR2022/html/Wang_Semi-Supervised_Semantic_Segmentation_Using_Unreliable_Pseudo-Labels_CVPR_202…

vue+element-ui el-table组件二次封装实现虚拟滚动,解决数据量大渲染DOM过多而卡顿问题

一、此功能已集成到TTable组件中 二、最终效果 三、需求 某些页面不做分页时,当数据过多,会导致页面卡顿,甚至卡死 四、虚拟滚动 一、固定一个可视区域的大小并且其大小是不变的,那么要做到性能最大化就需要尽量少地渲染 DOM 元素…

一键导出文件名和位置,让你轻松管理文件!

想要轻松管理你的文件吗?试试我们的文件名和位置导出工具,一键导出文件名和位置,让你轻松管理你的文件!我们的工具可以在不修改文件名的前提下,快速导出文件名和位置,让你随时随地查找和管理你的文件。 第…

C++算法 —— 动态规划(1)斐波那契数列模型

文章目录 1、动规思路简介2、第N个泰波那契数列3、三步问题4、使用最小花费爬楼梯5、解码方法6、动规分析总结 1、动规思路简介 动规的思路有五个步骤,且最好画图来理解细节,不要怕麻烦。当你开始画图,仔细阅读题时,学习中的沉浸…

绩效被打了 C 就要走人吗?

文章目录 前言一、什么是绩效?二、上级的评价是客观的吗?三、工作必须要和上级搞好关系吗?四、自我评价要写多少字?五、绩效低的话会被开除吗?六、低绩效钱会少吗?七、有关星球提问统一回复 前言 今天是英雄算法联盟九…

横向对比 npm、pnpm、tnpm、yarn 优缺点

前端工程化是现代Web开发中不可或缺的一环,它的出现极大地提升了前端开发的效率和质量。 在过去,前端开发依赖于手动管理文件和依赖,这导致了许多问题,如版本冲突、依赖混乱和构建繁琐等。而今,随着众多前端工程化工具…

荣耀10 关闭自动更新

1.电脑端下载安装手机助手 2.下载adb工具https://adbdownload.com/ 3.解压后,打开工具所在目录,在地址栏输入cmd然后回车 4.进入这黑麻麻的工具,输入adb devices然后回车,确认连接到手机 输入命令 adb shell pm disable-user com…