专利名称:一种单视图多OpenGL视口的显示方法
技术领域:
本发明涉及OpenGL显示的技术领域,特别涉及一种单视图多OpenGL视口的显示 方法。
背景技术:
目前大多数CAD或是其他建模及绘图工具所采用的显示方式皆为单视图显示,这 种显示方式在技术上较容易实现,但这种显示方式在同一时间内只能查看当前正在显示的 模型。 其他部分的建模及绘图软件采用的是多视图的显示方式。多视图是在显示程序框 架中构建多个视图区域,从而可以将不同模型或是模型的不同部分同时在不同的视图区域 中进行显示,实现多个模型同时观察的目的。多视图的实现方法有多种,如视图替换、拆分 窗口、浮动窗口等等。
但是,上述的显示方式存在如下不足之处 1.单视图显示在同一时间只能查看当前正在显示的模型,不能将不同模型或 是模型的不同部分如整体形状及局部形状很好的结合在一起进行显示,以方便操作人员 进行观察。以常用建模工具软件Pro/Engineer为例,如附图2所示,右侧的视图中显 示的是名为FAN-JN-CON-ASSY. ASM的装配体,它包含有三个零件FAN-JN1-STAY. PRT、 FAN-JN1KS10PL1. PRT、 FAN-JN1DS10SL1. PRT,如果想查看这三个零件需要将它们单独打开 进行显示,如附图3所示。 2.多视图的显示方式顾名思义,采用了多个视图,下面以浮动窗口为例介绍多视 图。浮动窗口的实现方法是首先创建一个主窗口 ,通过在该窗口上增加若干个可浮动、可改 变大小的窗口即构成了浮动窗口,如附图4所示,框架的整体为主窗口,右侧的"视图A"部 分为浮动窗口 ,主窗口和"视图A"的黑色显示部分即为各自窗口的视图,因此在该例子中含 有两个视图。"视图A"的窗口可以漂浮在主窗口之上,也可改变大小,如附图5所示。多视 图的显示方式解决了多个模型同时显示的问题,但是这种显示方法仍然不够简洁美观,而 且对某个视图进行鼠标的交互式操作时,需要首先将鼠标的焦点设置到该视图上。
综上,现有技术的显示方法都不能完成在单视图上显示多个部件的功能。
发明内容
为了解决现有的显示工具多个视图并存时操作不够方便或界面不够美观的问题, 通过在一个视图中无缝的同时显示多个OpenGL视口,且各视口之间操作互不影B向,实现单 视图中多视口的并存显示,本发明提供了一种单视图多OpenGL视口显示的方法。所述技术 方案如下 —种单视图多OpenGL视口显示的方法,其特征在于,所述显示方法包括以下步 骤 步骤A :设置多个OpenGL视口,并确定各自在视图中所处位置及大小;
步骤B :对每个OpenGL视口使用独立的正投影矩阵,将模型坐标经过变换后分别 显示在对应的视口中; 步骤C:当发生鼠标操作时,检测鼠标当前位置,判断发生操作响应的视口和操作 类型,并作出响应。 优选的,所述显示方法将视图区域的左上角坐标定义为坐标原点,区域的高度、宽 度均定义为l,首先指定每个OpenGL视口的左上角在视图区域中的比例位置,然后分别设 定该视口的高、宽与视图高、宽的比值,从而确定该OpenGL视口位于视图区域中的位置及 大小。 优选的,所有OpenGL视口之间均是无缝连接的。 优选的,所述多个OpenGL视口,采用正投影的方式,分别为每个视口设置独立的 正投影矩阵,将模型的三维坐标经变换后成为屏幕坐标,然后将三维模型显示在对应的 OpenGL视口中。 优选的,所述步骤C中,当鼠标位于不同视口中时,进行放大、縮小、旋转、平移等 操作时只影响该视口中所绘制的模型,而对本视图其他视口中的模型不会产生影响。
优选的,所述步骤C中,包括三维拾取以及不同视口之间的相互关联操作,利用 OpenGL中的选择功能,对模型的每个对象进行编号,当鼠标在某个视口中点击时,判断所选 中的对象,将该对象的详细信息显示在视图的其他OpenGL视口中。 本发明通过将不同模型或是同一模型的整体与局部分别显示在同一个视图的不 同位置处,即不同的OpenGL视口中,且各视口中的交互式操作互不影B向,实现了单视图多 OpenGL视口的显示。本发明具有以下几个优点一、实现简单,是单视图多OpenGL视口实 现的有效途径之一 ;二、界面简洁美观,且多个视口之间互不干扰,操作方便。
图1是本发明所述单视图多OpenGL视口显示方法的原理流程示意2是单视图显示示意图1 ;图3是单视图显示示意图2;图4是浮动窗口方式的多视图显示示意图1 ;图5是浮动窗口方式的多视图显示示意图2 ;图6是本发明所述单视图多OpenGL视口显示示意图1 ;图7是本发明所述单视图多OpenGL视口显示示意图2 ;图8是本发明所述单视图多OpenGL视口显示示意图3 ;图9是本发明所述单视图多OpenGL视口显示示意图4 ;图10是本发明所述单视图多OpenGL视口显示示意图5 ;图ll是透视投影示意图;图12是正投影示意图。
具体实施例方式
下面结合附图和具体实施例对本发明作进一步说明,但不作为对本发明的限定。
首先需要对本发明提到的几个概念进行必要的解释和说明
4
1.视图 在计算机领域,应用程序窗口包括许多元素,如标题条、菜单条、最小化按钮、最大 化按钮和客户区、水平和垂直滚动条等,绘图操作只能在客户区进行,除客户区以外的部分 都叫非客户区,而视图即是指该客户区。如附图2所示,该应用程序窗口中用于图形显示的 部分即为视图。
2.视口 从概念上来讲,一个视口就是一个二维的矩形,是实际的屏幕显示区。三维场景
投影在这个矩形中,现有的显示方法基本都是一个视图对应一个视口,因此它们的显示区
域大小是相同的,如附图2所示,它的视口与视图大小相等,而对于附图6,它包含有两个视
口,一个位于屏幕左上用于整体显示,一个位于屏幕的右半部分用于显示选中的对象。为了
更形象地表示,在附图10中使用矩形框标出了所包含的两个0penGL视口。 本发明的具体实施如下 (1)搭建显示平台 本发明的实现平台使用VC++及0penGL共同构建完成,VC++用于搭建单文档的应 用程序框架,0penGL图形工具库则用来构建三维显示平台
(2)视口位置及大小的设置 窗口坐标系X轴正方向水平向右,Y轴正方向垂直向下,定义视图的左上角坐标为 (O,O),高度与宽度为1,相当于定义了视图窗口的X、Y方向的坐标范围为[O,l]。
视口被设定为视图窗口的整个像素矩形,为了实现多视口的显示,需要对视图窗 口进行划分,首先指定待显示的0penGL视口左上角位于视图区域中的位置,接下来设定该 视口的高度、宽度与整个视图区域高度、宽度的比值,这四个值就能最终确定指定的视口在 视图中的位置及大小信息。在这里,之所以将视图高度、宽度定义为1,而0penGL视口的位 置与大小都使用与视图实际大小无关的相对值,而不是使用绝对值,是为了当视图大小发 生变化时,根据这些相对值能够很快的确定各OpenGL视口在新视图区域中的位置与大小, 保证各视口之间的相对比例不会发生变化,避免在视图大小改变时发生变形。各0penGL视 口位置及大小设置完毕后,为了保证视图界面的简洁美观,这些信息只是记录在系统内部, 在视图区域中不会显示出明显的分界线,如附图6所示,它含有两个0penGL视口 , 一个位于 左上,一个位于右半部份。两个视口无缝的显示在同一个视图窗口中,从而实现分割屏幕的 显示效果。 (3)三维模型的显示 在不同的OpenGL视口中,可以显示不同的模型,也可以显示同一模型的不同部 分,如整体装配模型与零部件的放大模型。对于单视图中互不影响的多个OpenGL视口来 说,不能与现有的单视图显示方式一样采用单一的投影矩阵,因此为了将不同的模型大小 适中的显示在各自对应的视口中,对于不同的OpenGL视口,需要定义各自独立的投影矩 阵。本发明中采用的是正投影的方式,为每个OpenGL视口设置一个独立的正投影矩阵,将 模型的三维坐标经过变换后转换成为屏幕坐标,使用0penGL对应的显示功能将它们在各 自对应的视口中显示出来,如附图6所示,左上角为"中"字的整体结构显示,右半部份为 "中"字的外框部分,两个OpenGL视口无缝的并存显示在同一个视图中。
模型的所有顶点坐标均可以表示成(x, y, z)的形式,为了将其转换为屏幕坐标,
5需要将顶点坐标当作齐次坐标进行处理,即表示成(x,y,z,l.O)的形式。 —个物体最终在屏幕上进行显示,中间需要经过多步变换,包括视图、模型和投影
操作,这些操作包括旋转、移动、縮放、反射、正投影和透视投影等。变换是用矩阵乘法来表
示的,每种变换都会创建一个矩阵。 一般情况下,在绘制时需要组合使用几种变换。 视图变换用于指定观察点的位置和方向,模型变换的目的则是设置模型的位置和
方向,这两者从本质来说具有一定的相同之处,如既可以通过移动观察点位置来从各个方
向观察模型,也可以通过旋转、移动这个模型来进行全方位观察,两者的效果在某种意义上
来说是相同的,因此通常将这两种变换的矩阵相乘,其结果作为新的模型视图矩阵,该矩阵
为一个4X4的矩阵。 下面以旋转为例来说明矩阵的运算,假设当前的模型视图矩阵为B,下面给出的 4X4矩阵表示模型绕X轴旋转a角度(逆时针为正,顺时针为负)的变换,将该矩阵与矩阵 B相乘就得到一个新的模型视图矩阵A,使用新的矩阵A,就可以驱动模型产生相应的动作。 在本例中,模型会在当前显示状态的基础上,绕X轴旋转a角度。
JO cos(a》 ,sln(a) 0 J 0 sfe(a)cos(a》 0 A = B X lo 0 0 0. 投影变换的目的则是定义一个可视空间,可视空间有两种用途,它决定了一个物 体如何映射到屏幕上(即使用透视投影或正投影),并且定义了哪些物体或物体的部分被 最终裁减于最终的图像之外。如附图11、附图12所示,分别为透视投影和正投影的方式,在 透视投影中,物体离相机(观察点)越远,它在最终图像上看上去就越小;在正投影中,可视 空间是个长方体,物体和相机的远近不影响它看上去的大小。位于可视空间外面的物体或 物体一部分将被裁减,不出现在显示的图像中。通过指定顶、底、左、右、近、远六个平面即可 确定投影矩阵,正投影矩阵表示如下
『 , 垂0
》*> ,.,
00
f—&
0
0
/ — If
-00,0.复 其中,t、p、 1、r、n、f分别表示顶、底、左、右、近、远六个平面。
模型坐标向屏幕坐标的转换需要经历以下几个步骤 1、定义投影矩阵,即指定六个平面,根据指定的这六个平面,创建投影矩阵;
2、定义模型视图矩阵,初始时模型没有发生任何动作,因此初始的模型视图矩阵 为一4X4的单位矩阵; 3、模型所有顶点的齐次坐标分别与模型视图矩阵、投影矩阵相乘,得到模型顶点 的屏幕 坐标
6
对于普通的单视图或多视图显示来说,一个视图窗口对应着单一的视口,因此也 就对应一个模型视图矩阵及投影矩阵,而对于单视图多OpenGL视口来说,为了将不同的模 型大小适中的显示在各自对应的视口中,且各视口之间互不影响,需要为每个0penGL视口 定义各自独立的投影矩阵及模型视图矩阵。 本发明中采用的是正投影的方式,为每个OpenGL视口设置一个独立的模型视图 矩阵及投影矩阵。 由于当模型视图矩阵为单位矩阵时,模型顶点经过变换后所得到的屏幕坐标可能 不在视口范围内,因此可能无法在屏幕上进行显示,为了保证模型初始时能够在视口中大 小适中的进行显示,需要进行一定的变换,如平移、縮放等。首先计算模型的尺寸范围及中 心点坐标,将模型的尺寸范围与视口的大小进行比较获取模型的放大倍数(小于1表示縮 小倍数),根据计算结果将模型放大或縮小到正好能够在视口中完全显示,然后将模型的中 心位置平移到视口中心位置处。这些模型变换将会产生一系列的变换矩阵,将它们依次与 对应视口的初始模型视图矩阵相乘,得到最终的模型视图矩阵,使用该模型视图矩阵计算 模型的屏幕坐标,根据OpenGL提供的绘制函数将这些点在指定的屏幕坐标处绘制出来,即 可将模型显示在对应的0penGL视口中。 如附图6所示,左上角为"中"字的整体结构显示,右半部份为"中"字的外框部分, 两个模型均以最佳比例分别显示在各自的0penGL视口中。
(4)交互式操作 虽然多个0penGL视口位于同一个视图中,但不同视口的模型之间无直接关联,因 此与现有的视图操作不同,对某视口中的模型进行操作时不能影响到视图中其他视口所显 示的模型。 添加鼠标的交互式操作功能,从技术上实现来说是创建模型变换矩阵,对于现有
的单视图显示方式来说,当鼠标进行交互式操作时,视图中当前显示的全部模型都会产生
动作,而本发明中要实现不同视口之间操作互不影响,因此需要对每一个OpenGL视口设置
独立的模型变换矩阵。另外本发明中还考虑到了绝大多数操作人员的习惯当希望对某个
模型进行操作时,会将鼠标移动到该模型位置的附近再进行下一步的操作。 根据上面的描述,本发明中交互式操作功能的具体实现为当发生鼠标操作消息
时,判断当前鼠标位置,获取对应的视口信息,同时根据鼠标的动作判断操作类型,如鼠标
中建按下并移动表示平移物体或是鼠标滚轮滚动表示放大或縮小物体等,创建相应的模型
变换矩阵,将它与发生操作的视口所拥有的模型视图矩阵相乘,其结果成为新的当前矩阵,
表示组合后的变换。重新执行模型坐标到屏幕坐标的计算过程即可得到模型最新的屏幕坐
标,使用该坐标重新绘制模型,即可得到模型的最新状态,实现了模型的各种动作,如平移、
旋转、放大等,从而实现全方位的模型观察,同时由于未改变其他视口的模型变换矩阵,因
而对其他视口的模型不产生影响。 附图6为各OpenGL视口中模型的最初显示状态,附图8仅对左上角视口中的模型 进行了旋转,附图9则仅对右半视口的模型进行了旋转、平移、縮放操作,可以看出在一个 视口中进行操作时对其他视口没有影响。
(5)三维拾取操作 考虑到模型的选择需求,特别是当多个OpenGL视口分别用于显示整体装配模型
7与零部件模型时,需要能够选择整体模型中的各个部分。因此本发明中提供了三维拾取功
能,并与其他功能相同,在不同的OpenGL视口之间能互不影响的各自独立选择。在各自视
口中通过对模型的对象进行编号,当鼠标在视图中某处发生左键点击操作时,首先当前根
据鼠标位置判断所属的OpenGL视口,然后根据消息响应时返回的信息调用OpenGL提供的
选择函数判断被选中的对象,并对选中对象进行相关操作,如改变颜色显示、或是将它的局
部详细信息放入其他OpenGL视口中进行显示等。如附图6、附图7所示,附图6中,在左上
角视口中,选择了外框(轮廓线变为白色),右半视口中则放大显示了外框的形状,而图7
中,选择了内部的一个"口"字,右半视口中则放大显示了该部分的形状。 本发明实现了在单视图上多个OpenGL视口无缝的并存显示,且各视口之间的操
作互不影响,不仅界面美观,而且对操作人员来说,操作也更为简单方便。 以上所述的实施例,只是本发明较优选的具体实施方式
,本领域的技术人员在本
发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。
权利要求
一种单视图多OpenGL视口显示的方法,其特征在于,所述显示方法包括以下步骤步骤A设置多个OpenGL视口,并确定各自在视图中所处位置及大小;步骤B对每个OpenGL视口使用独立的正投影矩阵,将模型坐标经过变换后分别显示在对应的视口中;步骤C当发生鼠标操作时,检测鼠标当前位置,判断发生操作响应的视口和操作类型,并作出响应。
2. 如权利要求1所述的单视图多OpenGL视口显示的方法,其特征在于,所述显示方 法将视图区域的左上角坐标定义为坐标原点,区域的高度、宽度均定义为l,首先指定每个 OpenGL视口的左上角在视图区域中的比例位置,然后分别设定该视口的高、宽与视图高、宽 的比值,从而确定该OpenGL视口位于视图区域中的位置及大小。
3. 如权利要求1所述的单视图多OpenGL视口显示的方法,其特征在于,所有OpenGL视 口之间均是无缝连接的。
4. 如权利要求2所述的单视图多OpenGL视口显示的方法,其特征在于,所述多个 OpenGL视口 ,采用正投影的方式,分别为每个视口设置独立的正投影矩阵,将模型的三维坐 标经变换后成为屏幕坐标,然后将三维模型显示在对应的OpenGL视口中。
5. 如权利要求1所述的单视图多OpenGL视口显示的方法,其特征在于,所述步骤C中, 当鼠标位于不同视口中时,进行放大、縮小、旋转、平移等操作时只影响该视口中所绘制的 模型,而对本视图其他视口中的模型不会产生影响。
6. 如权利要求1所述的单视图多OpenGL视口显示的方法,其特征在于,所述步骤C中, 包括三维拾取以及不同视口之间的相互关联操作,利用OpenGL中的选择功能,对模型的每 个对象进行编号,当鼠标在某个视口中点击时,判断所选中的对象,将该对象的详细信息显 示在视图的其他OpenGL视口中。
全文摘要
本发明提供了一种单视图多OpenGL视口显示的方法,其特征在于,所述显示方法包括以下步骤步骤A设置多个OpenGL视口,并确定各自在视图中所处位置及大小;步骤B对每个OpenGL视口使用独立的正投影矩阵,将模型坐标经过变换后分别显示在对应的视口中;步骤C当发生鼠标操作时,检测鼠标当前位置,判断发生操作响应的视口和操作类型,并作出响应。
文档编号G06T17/40GK101789132SQ20101001828
公开日2010年7月28日 申请日期2010年1月22日 优先权日2010年1月22日
发明者刘栋材, 尚文, 李相鹏, 钟俊, 颜钦 申请人:苏州领航自动化科技有限公司