交互式绘图技术.ppt

上传人:小飞机 文档编号:5684875 上传时间:2023-08-09 格式:PPT 页数:65 大小:465.50KB
返回 下载 相关 举报
交互式绘图技术.ppt_第1页
第1页 / 共65页
交互式绘图技术.ppt_第2页
第2页 / 共65页
交互式绘图技术.ppt_第3页
第3页 / 共65页
交互式绘图技术.ppt_第4页
第4页 / 共65页
交互式绘图技术.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

《交互式绘图技术.ppt》由会员分享,可在线阅读,更多相关《交互式绘图技术.ppt(65页珍藏版)》请在三一办公上搜索。

1、,第七章 交互式绘图技术,7.1 交互式绘图概述7.2 交互式输入的基本模式7.3 基本交互绘图技术7.4 交互式绘图系统的构造7.5 OpenGL对交互绘图的支持,目录,7.1交互式绘图概述7.1.1 交互式绘图的概念7.1.2交互式绘图系统的交互任务7.1.3交互式绘图系统的设计原则,7.1交互式绘图概述,7.1.1 交互式绘图的概念,被动式绘图:依靠程序的运行自动产生图形的绘图方法。主要应用于:那些具有成熟计算模型的设计和生产过程中的图形生成。交互式绘图:是广泛应用的灵活的绘图方式,它允许用户通过鼠标、键盘等交互输入设备在实时操作下进行绘图,即动态的输入坐标、制定选择功能、设置交换参数、

2、以及图形显示期间对图形进行修改、删除、添加、存储等在线操作,允许用户全部徒手绘制图形。交互式绘图方式因能实现所见即所得的绘图效果、充分发挥人的创造性和利用人的积累经验,在CAD、办公室自动化及许多其他领域得到广泛应用。,计算机绘图方式可分为被动式绘图和交互式绘图两种。,7.1.2交互式绘图系统的交互任务,定位、选择、文本输入、数值输入,1、定位交互任务用来给应用程序指定一个点的坐标位置(x,y)或(x,y,z)。完成此任务的典型方法是定位屏幕坐标。定位设备有鼠标器、操纵杆、跟踪球、空间球、数字化仪的触针或手动光标块等,它们可分为绝对坐标的和相对坐标的、直接的和间接的、离散的和连续的设备类型。,

3、选择交互任务是从一个选择集中选择一个元素项目。具有代表性的选择集是命令集、属性值集、目标分类集和目标实体集。选择集分为固定选择集(如命令集、属性值集、目标分类集)和可变选择集(如目标实体集)两种。常用的选择设备有功能键、热键和定位设备等。,2、选择交互任务,文本输入交互任务是输入字符串,如输入一个图形的数据或标注。文本输入的典型设备是键盘,当然还有一些其他的设备通过软件帮助也可以进行字符串的输入,如在屏幕上产生一个软键盘并用定位设备模拟字符键盘输入、用笔划设备输入字符图形并由识别软件进行识别输入、用语音设备借助“语音字典”进行字符串输入等。,3、文本输入交互任务,定值输入交互任务是在最大值和最

4、小值之间确定一个数值(整数或实数)。用作定值设备:带数字键的键盘可以用作定值设备,拨号盘、滑动电位器、跟踪球等的控制旋钮也可用作定值设备,操纵杆、跟踪球等设备可将压力或运动对照一个标量范围转换为一个标量值,屏幕上显示的标尺、刻度盘、拉杆或按键等利用定位设备也可以进行数值的输入。,4、定值输入交互任务,7.1.3交互式绘图系统的设计原则,1、实用性:功能性和易使用性功能性就是必须广泛搜集各类用户对图形处理方面的需求,研究、总结、提炼其中共性的需求,提供方便的图形定义、描述、输入、修改、操作、输出、管理等方面的功能。如,AutoCAD 2000就是按照客户“期望表”(wish list)的前五项功

5、能来设计的。易使用性是指界面应该友好,以适应各类用户、满足初学者甚至专家各层次用户的要求。另外,还要求界面必须和人的理解、记忆、通讯及解决问题的方式相容,使系统易于学习、便于理解。,实用性、可靠性、一致性、简单性、开放性,可靠性要求系统尽可能减少错误并具有容错性。在系统正常时应对用户输入做出适当的响应,既当用户输入不合法或不正确时,系统应能继续执行下去并与用户进行通讯;一旦系统某部分出现错误,系统应能尽可能地支持连续和一致的用户响应。,2、可靠性,一致性原则是指在设计系统的各个环节时,应遵从统一的规则,保证不出现例外情况。实现一致性的方法是对整个系统进行自顶向下的总整体设计,定义出统一的风格。

6、系统内部各个部分应具有相同的风格和用户通讯,用户界面体现出与用户交互的一个统一的观点。在输出部分,一个特定的图符应该始终只有一个固定的含义而不能依靠上下文而有所改变;使用一种颜色编码从而使相同的颜色在不同的情况下不会有不同的含义;状态信息显示位置和菜单位置相对固定使用户不必总要寻找等。对输入部分,键盘上的功能键、控制键以及鼠标器上的按钮的定义应前后一致;保持交互命令功能的统一;对于全程命令如帮助、状态取消等命令可随时发出等。一个复杂的、不一致的模型不仅难以被用户理解,而且工作效率很低。,3、一致性,用户通过界面以最简单的方式提出自己的应用要求,便能使用图形系统的全部功能。人们通常仅能同时记住5

7、-7个事件,因而界面应对大量的细节进行抽象处理,对用户隐藏尽可能多的信息,减少用户记忆量。提供提示和菜单是帮助用户学习和使用的有效方式,它可告诉初学者用户一步步该怎么做,对有经验的用户随时提醒下一步该做什么。帮助命令可以提供系统的进一步说明,并让用户操作时随时调用。,4、简单性,使系统易于被用户理解和接受、易于操作和使用,开放性能够允许对模块的部分属性和功能进行方便地修改和扩充,从而使得模块是可维护的,这种可维护性是延长模块生命周期的重要手段。由于用户类型众多,行业性质、设计标准、使用习惯及个人背景的不同,对图形处理的要求也不尽相同。在这众口难调的情况下,很难设计一个通用的能满足所有用户要求的

8、交互式绘图系统。为使系统拥有较长的生命期,系统应能随着人们知识和技术的发展进行修改和扩展,所以要求系统具有开放性。,5、开放性,7.2 交互式输入的基本模式,请求模式、采样模式、事件模式,7.2.1 请求模式7.2.2 采样模式7.2.3 事件模式7.2.4 输入模式的组合使用,7.2.1 请求模式,在请求模式下,应用程序发出从指定输入设备输入数据的请求,接着便等待用户的输入,在得到“允许从该设备输入”的应答后便将数据读入。在这种模式中,应用程序和输入设备交替工作,当系统要求输入而用户没有及时输入时,则整个程序被挂起以等待输入。所以,在设计系统时,若要求用户输入则应该安排相应的显示信息以提示用

9、户输入。字符和数据的输入适合采用这种方式。,7.2.2 采样模式,在采样模式下,应用程序和输入设备同时工作。当输入设备工作时存储输入数据且不断地更新当前数据,当程序要求输入时,程序则对当前数据值进行采样。一种设备一旦被设置成采样输入方式,则不用等待程序的输入语句就可以开始输入数据。例如,若鼠标被置为采样模式下的定位设备,则系统会立即存储鼠标的当前位置坐标,并且随着鼠标的移动实时更新当前位置坐标。在采样模式下,由于应用程序不停的测试输入设备,随时读入用户输入的数据,所以应用程序可以对用户的输入给出实时响应,这便是采样输入模式的优点。,7.2.3 事件模式,在进行交互但又不能预测何时进行输入的情况

10、下,可采用事件输入模式。一个事件(Event)是用户对输入设备的一次操作以及所形成的数据。例如用光笔进行拾取操作,它要求在光标检测到光点的瞬间记录下拾取的数据,然后再进行较费时的处理,这种情况就适合采用事件模式。事件输入模式就是将每次发生的事件通过中断正在执行的程序及时地记录下来,然后由应用程序决定何时进行进一步处理。一般一个事件发生时,CPU往往来不及进行处理,于是,需要系统建立一个事件队列保存未处理的事件,并按事件发生时间的先后次序排列。应用程序需要数据时便从该队列以先进先出的策略选择一个事件进行处理。当某设备被置成事件输入模式后,程序和设备便同时工作,用户可以采取超前输入方式,即用户可以

11、在应用程序需要数据之前开始输入,这样可以节约交互时间。,7.2.4 输入模式的组合使用,以上三种输入模式各有其特点和适用的情况,而在一个实际的应用程序中往往可应用几个不同的输入设备分别在几种不同的输入模式下工作,以便方便地完成交互输入。例如,使用鼠标拖动一个图形对象在屏幕上移动,当到达目标位置时,按下鼠标的按钮来终止这种拖动。在这个应用中,鼠标的位置可以采用采样输入模式,而按钮输入则采用事件输入模式。,7.3 基本交互绘图技术,7.3.1 定位7.3.2 回显7.3.3 约束7.3.4 网格7.3.5 引力域7.3.6 橡皮筋7.3.7 拖动7.3.8 草拟7.3.9 拾取7.3.10 UND

12、O和REDO,7.3.1 定位,基本定位就是在屏幕上指定显示位置。可使用鼠标、键盘等交互输入设备在屏幕上移动,至所需位置时按下按钮,定位输入点。无论是输入字符还是绘图,都要确定其显示位置。例如,对于字符串,定位点可作为字符串的起始点;对于直线段,需要定位出两个端点。定位技术的高级应用是强制定位,或称捕捉(snap)技术,即在按下交互设备按钮时,将光标的当前点强制定位在最接近的网格点上,或图元的特殊点(直线/圆弧的端点、中点,圆/圆弧的中心等)作为输入点,方便设计过程。,7.3.2 回显,回显可作为定位对象的一种辅助方法。用户希望对定位的位置数值及其数据参数回显在屏幕上,以便在回显坐标值的指引下

13、获得精确定位。另外,回显也用于选择或拾取对象的确认。,图7.1 选择一条线段时的回显 图7.2 选择铅笔工具时的回显,7.3.3 约束,约束就是在图形绘制过程中对图形的方向、对齐方式等进行规定和校准。约束可以减轻定位难度。交互绘图系统可以指定多种约束功能,最常用的约束是直线的水平或垂直方向的约束。水平或垂直方向约束的实现方法:通过输入的两个端点判断该线段接近水平线还是接近垂直线,以确定是实现水平约束还是垂直约束。如果|x2-x1|y2-y1|则显示垂直线段(x1,y1)-(x1,y2),否则显示水平线段(x1,y1)-(x2,y1)。另外,还可将直线约束成固定角度,例如Autocad2000就

14、允许约束成任意指定角度的倍数。若指定角度为45度,则鼠标可以向45度、90度、135度、170度、225度、270度、315度等角度移动。输入坐标还可以约束到预定义的路径,如一个圆弧上等。,7.3.4网格,网格是叠加在屏幕绘图区的正交直线。在使用网格时,任意输入坐标位置被移到最近的网格线的交点上。网格属于一类约束,用于精确定位和对准。网格间距可允许用户设定。网格可以在显示和不显示之间转换,也可使用局部网格,甚至在不同屏幕区域使用不同大小的网格,以满足各种需要。,7.3.5 引力域,所谓点的引力域是指点周围的一个区域,凡落在该区域的任意输入位置都能被“吸引”到该点上来,就好像在该区域中存在一种指

15、向该点的吸引力一样,故称该区域为“引力域”。线的引力域能将域内任意点吸引到线段上最靠近该点的位置上。实现引力域时应注意引力域大小的选择要适当,太大会造成与其他图元重叠,太小会无助于用户方便、精确地定位。,图7.5 线的引力域,7.3.6 橡皮筋,橡皮筋技术是指在以基本定位方法确定起始点后,当前点的位置随当前鼠标的位置动态、连续地移动,并实时地在起始点和当前点之间形成动态线的技术。橡皮筋技术除了能用在线段的绘制外,也可用于矩形、圆及圆弧的绘制上。橡皮筋技术适用于需要对图形元素的长度、方向、大小、位置等作即时要求的情况。,7.3.7 拖动,拖动是将图形对象在空间移动的过程动态地、连续地表示出来,直

16、到满足用户的位置要求为止。实现拖动是把图形(符号)依附于光标上,使图形跟着光标移动,直到移至所需位置,再把符号与插入的目标图形的其余部分对准。在许多应用场合,拖动技术的使用可以使设计人员不必进行多次定位尝试就能满意。在三维场景中,用户控制下的物体的平移、旋转、缩放的动态显示也可由此功能实现。,7.3.8草拟,草拟技术用以实现用户任意画图的要求,如Windows下画图软件中的铅笔工具就实现了草拟功能。草拟技术的实现方法有两种:一是当光标移动时,沿光标移动的路径保留单个点的坐标,并以点阵方式保存草图;二是直线或曲线拟合法,即采样取点后用折线或曲线将采样点连接起来逼近草图。采样时的采样取点方法有基于

17、时间和基于距离两种。,7.3.9 拾取,1、点的拾取:若对图中的一点P1(x1,y1)进行拾取,则以P1为圆心、r为半径定义一个圆形区域,作为P1的拾取范围,并称为P1的领域(其中,r为设定的拾取精度)。若拾取点P(x,y)满足(x-x1)2+(y-y1)2r2,,则对P1(x1,y1)拾取成功。2、符号集的拾取:依次对每个符号的参考点进行点的拾取判断,若有满足拾取条件的符号则该符号集拾取成功。3、直线段的拾取:若拾取点到直线段的距离小于等于设定的领域精度则该直线段拾取成功。4、折线段的拾取:依次判断折线段中每条直线段的领域是否包含拾取点,只要有一条线段包含则该折线段拾取成功。5、曲线的拾取:

18、曲线在显示时已离散成折线集,故曲线的拾取则是重复使用折线段的拾取方法。6、字符串的拾取:构造一个包含该字符的凸四边形,以对角线的交点为中心,以中心到四边中点距离平均值为半径,作圆,当拾取点在该圆内时,则该字符串拾取成功。7、多边形的拾取:依次对多边形上每条边进行拾取判断,只要有一条边满足拾取条件则该多边形拾取成功。8、多义性拾取的处理:多义性拾取是指拾取点落在多个图形显示领域中。此时可采用确定拾取的优先级或用户确认的方法确定拾取对象。9、二维图形的拾取:如果要选择一系列图元,可先用光标定义一个矩形,称为测试盒。如果图形中某一(些)图元位于该测试盒中,则表示这一(些)图元是被选择的对象。10、三

19、维图形的拾取:拾取领域为球或立方体,进行点/面、点/体等包含性测试。,7.3.10 UNDO和REDO,UNDO(撤消操作)是指恢复最近执行的操作.REDO(重做操作)是指重新执行最近被撤消的操作。交互式绘图系统存在频繁的人机交互性操作,而绘图工作又是一种复杂的过程,如果系统没有UNDO和REDO功能,则用户的一次操作失误就可能造成已经花费很长时间所设计的图形全盘作废,这会令用户在使用软件时精神十分紧张。目前,在大型应用软件中均提供了一些UNDO和REDO功能,如WinWord、NotePad等文本软件,画笔、AutoCAD等图形软件和一些游戏软件等。根据执行次数可将UNDO和REDO的实现分

20、为有限次(1次或几次)和无限次两种。UNDO和REDO功能的实现涉及数据结构设计、命令执行时的操作和交互应用系统中的命令接口设计三方面内容。,7.4 交互式绘图系统的构造,7.4.1 交互式用户接口的内容7.4.2 交互式用户接口的工作方式7.4.3交互式用户接口的实现,7.4.1 交互式用户接口的内容,1、屏幕的划分:显示屏有不同的大小、格式和分辨率,要充分合理地利用屏幕,就应该对屏幕作适当的划分,来安排个元素。2、字型的选用:字型选的好可给屏幕带来生机。标题、子标题常用黑体字已达到清晰、简单、醒目,大面积应用黑体反而会降低可读性。3、颜色、灰度的选择:用不同颜色和灰度标示不同信息、分离不同

21、形体,对减少错误是非常有效的。选择时以增加视觉效果并减少视觉疲劳为原则。另外,接口还应为用户提供方便的颜色选择工具,供用户输入时选择颜色使用。图7.8、9给出了几种典型的颜色选择方式。4、菜单:是一组功能、对象、数据或其他用户选择实体的列表,在用户接口中普遍使用。菜单设计以占位置小且选用方便为原则。一般将程序的各种操作命令或选项通过文字形式分层进行组织。5、图符和光标:图符和光标是用户接口中出现频率最高、停留时间最长的元素,它们是一种形象的图形语言,深受用户欢迎。图形符号在设计时应以能直观体现功能为原则。,几种典型的颜色选择方式:,7.4.2 交互式用户接口的工作方式,1、固定域输入输出方式:

22、指设计者在程序中使用有格式的输入输出语句实现人机交互处理。特点:使用起来繁琐、易出错、且要求用户了解接口程序。2、问答方式:交互过程中的每一步都是通过问答形式实现人机对话。特点:对新用户来说是方便的,但对于熟练用户就显得罗嗦。3、表处理方式:要求设备具有制表功能,所以只适用于数据驱动的用户接口。4、命令语言:用户通过输入各种命令与系统交互。特点:要求用户记忆较多的交互命令。5、菜单方式:让用户通过选择菜单进行交互。特点:它方便易学,适用于各类用户,目前在用户接口中普遍采用。缺点是限制了用户使用系统的思路,不能从不同层次进入,也略显繁琐。6、图标方式:比较接近现实生活中人的活动,它把各种交互操作

23、用形象直观的图形符号表达。特点:用户操作计算机就如同在现实生活中处理事物一样自然。但由于图标与操作的不完全一致也会造成用户的费解。,7.4.3 交互式用户接口的实现,1、界面设计 2、菜单设计 3、工具条设计 4、窗口设计 5、命令窗设计 6、状态条设计 7、视觉效果设计 8、方便用户,交互式用户接口的设计原则交互式用户接口的设计方法,界面设计应全面考虑显示内容、布局、格式等;反馈信息和屏幕输出应面向用户、指导用户,以满足用户需求为目标;反馈信息内容应准确、简洁,并能给出强调的信息显示;屏幕显示和布局应美观、清楚、合理;合理安排信息的显示顺序;显示模式应前后一致;合理选择文本和图形的显示;使用

24、图形和多窗口显示,改善界面输出显示的能力。,1、交互式用户接口的设计原则,2、界面设计,首先关注:布局合理、屏幕有效利用。其次关注:如何最好地设计输出形式以获得最大的可见效果。图形界面通常将屏幕分成三部分:用户工作区、菜单区、显示提示及反馈信息区。工作区尽可能大,当菜单和信息区不需要时可以去掉,使工作区扩展至全屏。因屏幕容量有限,因此可采用多窗口显示、弹出式菜单、滚行与移屏、缩放等技术组织显示信息。另外,充分而又准确地使用图符和恰当的使用各种方法进行选择性的信息显示也是界面设计时应重点考虑的。,举例:AutoCAD2000的主界面,主要有标题条、菜单条、命令窗、状态条、工具条几部分组成。,3、

25、菜单设计,菜单设计原则:菜单占用面积尽量小,且只暂时占用,点完后应自动绘图屏幕上的图形;合理命名各菜单项,并合理安排菜单位置以利于提高菜单选取速度;菜单应按种类合理分组;菜单用汉字或图标表示以助于理解和操作。菜单种类有:全屏幕文本菜单、下拉式菜单、弹出式菜单、移动亮条菜单、滚动菜单和图形菜单。软件根据用户选择不同的菜单项而转向相应的程序入口驱动相应的模块。AutoCAD的菜单安排:AutoCAD的大多数命令均可在下拉菜单条中找到,它们按不同功能分别放在不同的子菜单中。,AutoCAD2000的菜单,4、工具条设计,AutoCAD 2000的工具条是为提高作图效率而设定的命令快捷按钮,它具有更加

26、直观、简便的特点。工具条中的命令在下拉菜单中基本都能找到。工具条也是按命令的功能不同分成一条条。当需要其它功能的工具条时,可以用鼠标选择下拉菜单 视区/工具条 来增加其它工具条。如果想关闭工具条可以很方便地点击按钮。同时工具条还具有动态提示功能,当鼠标移动到按钮等待一段时,在按钮下方就会出现偏移,说明该按钮的作用。,5、窗口设计,窗口就是屏幕上的一个矩形区域,对用户来说,一个窗口就是一个单独的可操作单元。窗口类型有滚动式窗口、开关式窗口、分裂式窗口、瓦片式窗口、重叠式窗口和弹出式窗口几种类型。对窗口本身的操作通常有窗口的建立、改变大小、最大化、最小化、还原、拖动、切换、关闭等。窗口的组成部件有

27、标题栏、菜单栏、工具栏、地址栏、状态栏、工作区、边框、滚动条等。软件选用哪种窗口类型、哪些组成部件、如何布局应综合权衡软件的功能、开销和使用方便等因素。AutoCAD2000允许同时打开多个图形文件,通过窗口的菜单项可选择各窗口的排列形式,以及选择某窗口作为当前的使用窗口等。,6、命令窗设计,AutoCAD对用户输入信息的回答就显示在命令窗口中,它显示三行文字,最下一行是当前信息,上面二行用于重现过去的信息。有时当前信息过长,上面二行也用于显示当前信息。,7、状态条设计,AutoCAD的状态条通常用来显示光标的坐标位置,还有八个按钮,显示AutoCAD的捕捉、栅格、正交模式以及AutoCAD的

28、图纸空间和模型空间等状态。用户可用鼠标移到这八个小框上双击鼠标,来打开或关闭这六个按钮。,8、视觉效果设计,视觉效果涉及到用户接口的各个方面,如屏幕的布局、色彩的使用、信息的安排等。这里强调色彩。正确使用颜色可以改善视觉信息的获取能力和减少视觉疲劳感;人眼视觉对亮度和饱和度的分辨率不敏感。所以,选择色彩对比时应以色调对比为主。就色调而言,最容易引起视觉疲劳的是蓝色和紫色,其次是红色和橙色,而黄色、绿色、蓝绿色和淡青色等不容易引起视觉疲劳。眼睛对明暗的调节太频繁会增加疲劳感,所以应保持均匀的色彩明亮度。饱和度高的色彩较刺激眼睛也会增加疲劳感。,9、方便用户,AutoCAD 2000采用了“集中注

29、意力于设计”(heads up design)的技术,即集中用户的注意力在设计工作上而不是在操作软件上。所谓集中注意力,就是让用户在操作AutoCAD时,把所有的焦点都集中于目前的工作区域,尽量不要移动鼠标到非工作区。,7.5 OpenGL对交互绘图的支持,7.5.1 OpenGL的选择机制实现拾取功能7.5.2 OpenGL的反馈机制实现反馈功能7.5.3 用OpenGL缓冲技术实现橡皮筋功能,7.5.1 OpenGL的选择机制实现拾取功能,设置选择缓冲区进入选择模式创建名字栈设置拾取矩阵绘制图元切换回渲染模式确定拾取对象,使用OpenGL选择模式的操作步骤为:,1、设置选择缓冲区,先调用g

30、lSelectBuffer()为返回的选择信息设置缓冲区,以便最后能通过分析选择缓冲中的数据来确定被选中图元。glSelectBuffer()的原型为void glSelectBuffer(GLsizei size,GLuint*buffer);参数:*buffer是指向无符号整数数组的指针,该数组就是所设置的用于存储返回选择数据的缓冲区;size参数说明数组中最多能够保存的值的个数。,2、进入选择模式,OpenGL的绘图模式有渲染模式、选择模式和反馈模式,其中渲染模式为默认工作模式。若想使用选择机制,则必须设置当前绘图模式为选择模式。模式设置函数GLint glRenderMode(GLen

31、um mode);能控制应用程序进入的模式。mode的取值可以是GL_RENDER(渲染模式)、GL_SELECT(选择模式)或GL_FEEDBACK(反馈模式)。一旦设置为某种模式,应用程序将保持处于给定模式,直到再次以不同的参数调用glRenderMode()为止。,3、创建名字栈,名字栈是返回选择信息的基础,其中存放一系列图元的标识(整数),每当发布绘制命令时便将此图元的标识压入名字栈使用前要建立名字栈。用glInitNames()创建并初始化(简单地清空)名字栈。名字栈的控制命令有三个,glPushName()将图元名字压入栈,glPopName()从栈中弹出名字,glLoadName

32、()替换栈顶的名字。glPushName()的原型为void glPushName(GLuint name);它 将name压入名字栈。压入名字超过栈容量时将生成一个GL_STACK_OVERFLOW错误。名字栈深度因OpenGL实现(implementations)不同而不同,但最少也能容纳64个名字。可以用参数GL_NAME_STACK_DEPTH调用glGetIntegerv()以获取名字栈的深度。glPopName()的原型为void glPopName(void);它弹出名字栈的栈顶名字。从空栈中弹出名字会引发GL_STACK_UNDERFLOW错误。glLoadName()的原型为

33、void glLoadName(GLuint name);实现用name取代名字栈栈顶的那个名字。如果栈是空的,比如刚调用过glInitName()后就是这样,glLoadName()生成一个GL_INVALID_OPRATION错。为避免这些出错情况,如果栈初始时是空的,那么在调用glPopName()和glLoadName()之前至少要调用一次glPushName()以在名字栈中放进一个名字。,4、设置拾取矩阵,要想让OpenGL判断哪个图元被选中,则必须提供一个拾取位置信息,通常是鼠标的位置。所以,此处还要设置拾取矩阵,用于保存拾取位置信息。设置拾取矩阵的函数原型为:void gluPi

34、ckMatrix(GLdouble x,GLdouble y,GLdouble width,GLdouble height,GLint viewport4);参数:x和y是光标的位置坐标,也是拾取区域的中心;width、height为拾取区域的宽度和高度,用屏幕坐标表示;viewport4是存储窗口信息(左上角坐标、宽度、高度)的数组。视口信息可用变量保存,当窗口大小发生变化时更新,也可以通过调用glGetIntegerv(GL_VIEWPORT,GLint*viewport);来临时获取。,5、绘制图元,将集合中每个图元依次进行绘制。在绘制每个图元之前,首先将图元标识压入名字堆栈,然后开始绘

35、制;若几个图元使用了相同的标识,则OpenGL将这几个图元作为一个整体进行计算;当某个图元绘制完成后应将其标识从名字堆栈中弹出以节省堆栈空间。,6、切换回渲染模式,当所有待选择图元绘制完后,便让OpenGL进行计算,并将相关信息写入选择缓冲区。这需要再次调用glRenderMode()函数将绘图模式切换回渲染模式,函数的返回值是选中的记录数。,7、确定拾取对象,若函数glRenderMode()的返回值大于0,则选择缓冲区中包含了被选中的记录。记录格式为:名字栈中标识的数目、最小深度、最大深度、标识序列 若每个图元的标识均不相同,则标识数为1,标识序列中只包含1个标识,它就是被选中的图元标识。

36、其中的最小深度、最大深度用于帮助判断被选中的图元中哪个在最上面,最后需要的便是选择缓冲区中深度最小的那个图元(认为鼠标单击的是最上面的图元)。至此,就确定了所拾取的对象了。,7.5.2 OpenGL的反馈机制实现反馈功能,OpenGL的反馈模式操作流程为:设置反馈缓冲区进入反馈模式重画图形退出反馈模式,处理反馈数据,1、设置反馈缓冲区,在进入反馈模式之前要调用glFeedbackBuffer()设置反馈缓冲区。反馈缓冲区是一个存储浮点值的数组,其中的每组数据均有一个标识说明图元的类型、描述图元的顶点坐标值、颜色和纹理等相关数据。指定反馈数组函数的原型为:void glFeedbackBuffe

37、r(GLsizei size,Glenum type,Glfloat*buffer);buffer是定义的反馈缓冲区,size表示能够写进反馈数组的数据的最大个数,type是一个标识常数,表明OpenGL应该返回顶点的哪些数据。,type的取值及反馈数据,2、进入反馈模式,参数为GL_FEEDBACK 的glRenderMode()函数将OpenGL设置成反馈模式。调用此函数就会退出当前模式。获取当前模式:用GL_RENDER_MODE调用glGetIntegerv()。,3、重画图形,重新绘制图形时,将绘图信息写入反馈缓冲区。在反馈缓冲区中,每组数据均有一个标记,这个标记说明了这组反馈信息描

38、述的是基本几何对象还是像素对象。,反馈缓冲区中标记的取值,4、退出反馈模式,处理反馈数据,在完成上述工作以后,应该退出反馈模式,处理反馈数据。,7.5.3 用OpenGL缓冲技术实现橡皮筋功能,一种思路是采用动画原理,即一个擦除(上个采样位置下图形)重画(以当前鼠标位置画出图形)的循环。但这种方法对无背景的图形绘制有效,若有背景,擦除时会吃掉所覆盖的背景,所以要做背景恢复的工作,而这实现起来比较麻烦。,另一种方法是利用OpenGL提供的双颜色缓存机制来实现橡皮筋技术。颜色缓存通常是指要画入的缓存。OpenGL提供的双缓存分别称为前缓存和后缓存,前缓存直接与计算机屏幕相对应,即画进前缓存相当于直

39、接对屏幕作图,而若画进后缓存则绘图结果并不显示到显示屏幕上。基于这种特征,在橡皮筋实现技术中,就可以利用后缓存存储一幅纯背景图,擦除功能采用后缓存拷贝到前缓存的办法实现。,基本实现步骤是:,1、准备背景图:在进行交互式绘图之前,首先需用glDrawBuffer(GL_BACK);告诉OpenGL后续绘图操作将对后缓存进行;然后绘制场景,这时,后缓存中存放了不包括交互式图形在内的整个场景,可以将之作为“背景”来抹除不再需要显示的交互式图形。2、绘制交互式图形:首先调用SwapBuffers(原型为BOOL SwapBuffers(HDC hdc);)将后缓存中的背景“倾倒”到计算机屏幕(起到图形擦除作用),然后指定后续绘图操作指针对当前缓存进行,紧接着绘制交互式图形。用移动鼠标实现橡皮筋图形的绘制过程就是上一步的重复执行过程,直到放开鼠标左键为止。该方法将擦除图形并恢复背景的复杂工作利用一个简单的SwapBuffers()圆满解决,且速度很快,所以这是一种理想的橡皮筋功能的实现方法。具有橡皮筋效果的交互式绘图的目的是便于用户观察判断,所以所绘图形应是可见的即不被遮挡的,因此,在绘图之前还应该调用glDepthMask(FALSE)函数禁止进行深度测试,以便使交互图形总处在背景之前。,本章小结,Thanks,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号