專利名稱:一種單視圖多OpenGL視口的顯示方法
技術(shù)領(lǐng)域:
本發(fā)明涉及OpenGL顯示的技術(shù)領(lǐng)域,特別涉及一種單視圖多OpenGL視口的顯示 方法。
背景技術(shù):
目前大多數(shù)CAD或是其他建模及繪圖工具所采用的顯示方式皆為單視圖顯示,這 種顯示方式在技術(shù)上較容易實現(xiàn),但這種顯示方式在同一時間內(nèi)只能查看當(dāng)前正在顯示的 模型。 其他部分的建模及繪圖軟件采用的是多視圖的顯示方式。多視圖是在顯示程序框 架中構(gòu)建多個視圖區(qū)域,從而可以將不同模型或是模型的不同部分同時在不同的視圖區(qū)域 中進行顯示,實現(xiàn)多個模型同時觀察的目的。多視圖的實現(xiàn)方法有多種,如視圖替換、拆分 窗口、浮動窗口等等。
但是,上述的顯示方式存在如下不足之處 1.單視圖顯示在同一時間只能查看當(dāng)前正在顯示的模型,不能將不同模型或 是模型的不同部分如整體形狀及局部形狀很好的結(jié)合在一起進行顯示,以方便操作人員 進行觀察。以常用建模工具軟件Pro/Engineer為例,如附圖2所示,右側(cè)的視圖中顯 示的是名為FAN-JN-CON-ASSY. ASM的裝配體,它包含有三個零件FAN-JN1-STAY. PRT、 FAN-JN1KS10PL1. PRT、 FAN-JN1DS10SL1. PRT,如果想查看這三個零件需要將它們單獨打開 進行顯示,如附圖3所示。 2.多視圖的顯示方式顧名思義,采用了多個視圖,下面以浮動窗口為例介紹多視 圖。浮動窗口的實現(xiàn)方法是首先創(chuàng)建一個主窗口 ,通過在該窗口上增加若干個可浮動、可改 變大小的窗口即構(gòu)成了浮動窗口,如附圖4所示,框架的整體為主窗口,右側(cè)的"視圖A"部 分為浮動窗口 ,主窗口和"視圖A"的黑色顯示部分即為各自窗口的視圖,因此在該例子中含 有兩個視圖。"視圖A"的窗口可以漂浮在主窗口之上,也可改變大小,如附圖5所示。多視 圖的顯示方式解決了多個模型同時顯示的問題,但是這種顯示方法仍然不夠簡潔美觀,而 且對某個視圖進行鼠標的交互式操作時,需要首先將鼠標的焦點設(shè)置到該視圖上。
綜上,現(xiàn)有技術(shù)的顯示方法都不能完成在單視圖上顯示多個部件的功能。
發(fā)明內(nèi)容
為了解決現(xiàn)有的顯示工具多個視圖并存時操作不夠方便或界面不夠美觀的問題, 通過在一個視圖中無縫的同時顯示多個OpenGL視口,且各視口之間操作互不影B向,實現(xiàn)單 視圖中多視口的并存顯示,本發(fā)明提供了一種單視圖多OpenGL視口顯示的方法。所述技術(shù) 方案如下 —種單視圖多OpenGL視口顯示的方法,其特征在于,所述顯示方法包括以下步 驟 步驟A :設(shè)置多個OpenGL視口,并確定各自在視圖中所處位置及大??;
步驟B :對每個OpenGL視口使用獨立的正投影矩陣,將模型坐標經(jīng)過變換后分別 顯示在對應(yīng)的視口中; 步驟C:當(dāng)發(fā)生鼠標操作時,檢測鼠標當(dāng)前位置,判斷發(fā)生操作響應(yīng)的視口和操作 類型,并作出響應(yīng)。 優(yōu)選的,所述顯示方法將視圖區(qū)域的左上角坐標定義為坐標原點,區(qū)域的高度、寬 度均定義為l,首先指定每個OpenGL視口的左上角在視圖區(qū)域中的比例位置,然后分別設(shè) 定該視口的高、寬與視圖高、寬的比值,從而確定該OpenGL視口位于視圖區(qū)域中的位置及 大小。 優(yōu)選的,所有OpenGL視口之間均是無縫連接的。 優(yōu)選的,所述多個OpenGL視口,采用正投影的方式,分別為每個視口設(shè)置獨立的 正投影矩陣,將模型的三維坐標經(jīng)變換后成為屏幕坐標,然后將三維模型顯示在對應(yīng)的 OpenGL視口中。 優(yōu)選的,所述步驟C中,當(dāng)鼠標位于不同視口中時,進行放大、縮小、旋轉(zhuǎn)、平移等 操作時只影響該視口中所繪制的模型,而對本視圖其他視口中的模型不會產(chǎn)生影響。
優(yōu)選的,所述步驟C中,包括三維拾取以及不同視口之間的相互關(guān)聯(lián)操作,利用 OpenGL中的選擇功能,對模型的每個對象進行編號,當(dāng)鼠標在某個視口中點擊時,判斷所選 中的對象,將該對象的詳細信息顯示在視圖的其他OpenGL視口中。 本發(fā)明通過將不同模型或是同一模型的整體與局部分別顯示在同一個視圖的不 同位置處,即不同的OpenGL視口中,且各視口中的交互式操作互不影B向,實現(xiàn)了單視圖多 OpenGL視口的顯示。本發(fā)明具有以下幾個優(yōu)點一、實現(xiàn)簡單,是單視圖多OpenGL視口實 現(xiàn)的有效途徑之一 ;二、界面簡潔美觀,且多個視口之間互不干擾,操作方便。
圖1是本發(fā)明所述單視圖多OpenGL視口顯示方法的原理流程示意2是單視圖顯示示意圖1 ;圖3是單視圖顯示示意圖2;圖4是浮動窗口方式的多視圖顯示示意圖1 ;圖5是浮動窗口方式的多視圖顯示示意圖2 ;圖6是本發(fā)明所述單視圖多OpenGL視口顯示示意圖1 ;圖7是本發(fā)明所述單視圖多OpenGL視口顯示示意圖2 ;圖8是本發(fā)明所述單視圖多OpenGL視口顯示示意圖3 ;圖9是本發(fā)明所述單視圖多OpenGL視口顯示示意圖4 ;圖10是本發(fā)明所述單視圖多OpenGL視口顯示示意圖5 ;圖ll是透視投影示意圖;圖12是正投影示意圖。
具體實施例方式
下面結(jié)合附圖和具體實施例對本發(fā)明作進一步說明,但不作為對本發(fā)明的限定。
首先需要對本發(fā)明提到的幾個概念進行必要的解釋和說明
4
1.視圖 在計算機領(lǐng)域,應(yīng)用程序窗口包括許多元素,如標題條、菜單條、最小化按鈕、最大 化按鈕和客戶區(qū)、水平和垂直滾動條等,繪圖操作只能在客戶區(qū)進行,除客戶區(qū)以外的部分 都叫非客戶區(qū),而視圖即是指該客戶區(qū)。如附圖2所示,該應(yīng)用程序窗口中用于圖形顯示的 部分即為視圖。
2.視口 從概念上來講,一個視口就是一個二維的矩形,是實際的屏幕顯示區(qū)。三維場景
投影在這個矩形中,現(xiàn)有的顯示方法基本都是一個視圖對應(yīng)一個視口,因此它們的顯示區(qū)
域大小是相同的,如附圖2所示,它的視口與視圖大小相等,而對于附圖6,它包含有兩個視
口,一個位于屏幕左上用于整體顯示,一個位于屏幕的右半部分用于顯示選中的對象。為了
更形象地表示,在附圖10中使用矩形框標出了所包含的兩個0penGL視口。 本發(fā)明的具體實施如下 (1)搭建顯示平臺 本發(fā)明的實現(xiàn)平臺使用VC++及0penGL共同構(gòu)建完成,VC++用于搭建單文檔的應(yīng) 用程序框架,0penGL圖形工具庫則用來構(gòu)建三維顯示平臺
(2)視口位置及大小的設(shè)置 窗口坐標系X軸正方向水平向右,Y軸正方向垂直向下,定義視圖的左上角坐標為 (O,O),高度與寬度為1,相當(dāng)于定義了視圖窗口的X、Y方向的坐標范圍為[O,l]。
視口被設(shè)定為視圖窗口的整個像素矩形,為了實現(xiàn)多視口的顯示,需要對視圖窗 口進行劃分,首先指定待顯示的0penGL視口左上角位于視圖區(qū)域中的位置,接下來設(shè)定該 視口的高度、寬度與整個視圖區(qū)域高度、寬度的比值,這四個值就能最終確定指定的視口在 視圖中的位置及大小信息。在這里,之所以將視圖高度、寬度定義為1,而0penGL視口的位 置與大小都使用與視圖實際大小無關(guān)的相對值,而不是使用絕對值,是為了當(dāng)視圖大小發(fā) 生變化時,根據(jù)這些相對值能夠很快的確定各OpenGL視口在新視圖區(qū)域中的位置與大小, 保證各視口之間的相對比例不會發(fā)生變化,避免在視圖大小改變時發(fā)生變形。各0penGL視 口位置及大小設(shè)置完畢后,為了保證視圖界面的簡潔美觀,這些信息只是記錄在系統(tǒng)內(nèi)部, 在視圖區(qū)域中不會顯示出明顯的分界線,如附圖6所示,它含有兩個0penGL視口 , 一個位于 左上,一個位于右半部份。兩個視口無縫的顯示在同一個視圖窗口中,從而實現(xiàn)分割屏幕的 顯示效果。 (3)三維模型的顯示 在不同的OpenGL視口中,可以顯示不同的模型,也可以顯示同一模型的不同部 分,如整體裝配模型與零部件的放大模型。對于單視圖中互不影響的多個OpenGL視口來 說,不能與現(xiàn)有的單視圖顯示方式一樣采用單一的投影矩陣,因此為了將不同的模型大小 適中的顯示在各自對應(yīng)的視口中,對于不同的OpenGL視口,需要定義各自獨立的投影矩 陣。本發(fā)明中采用的是正投影的方式,為每個OpenGL視口設(shè)置一個獨立的正投影矩陣,將 模型的三維坐標經(jīng)過變換后轉(zhuǎn)換成為屏幕坐標,使用0penGL對應(yīng)的顯示功能將它們在各 自對應(yīng)的視口中顯示出來,如附圖6所示,左上角為"中"字的整體結(jié)構(gòu)顯示,右半部份為 "中"字的外框部分,兩個OpenGL視口無縫的并存顯示在同一個視圖中。
模型的所有頂點坐標均可以表示成(x, y, z)的形式,為了將其轉(zhuǎn)換為屏幕坐標,
5需要將頂點坐標當(dāng)作齊次坐標進行處理,即表示成(x,y,z,l.O)的形式。 —個物體最終在屏幕上進行顯示,中間需要經(jīng)過多步變換,包括視圖、模型和投影
操作,這些操作包括旋轉(zhuǎn)、移動、縮放、反射、正投影和透視投影等。變換是用矩陣乘法來表
示的,每種變換都會創(chuàng)建一個矩陣。 一般情況下,在繪制時需要組合使用幾種變換。 視圖變換用于指定觀察點的位置和方向,模型變換的目的則是設(shè)置模型的位置和
方向,這兩者從本質(zhì)來說具有一定的相同之處,如既可以通過移動觀察點位置來從各個方
向觀察模型,也可以通過旋轉(zhuǎn)、移動這個模型來進行全方位觀察,兩者的效果在某種意義上
來說是相同的,因此通常將這兩種變換的矩陣相乘,其結(jié)果作為新的模型視圖矩陣,該矩陣
為一個4X4的矩陣。 下面以旋轉(zhuǎn)為例來說明矩陣的運算,假設(shè)當(dāng)前的模型視圖矩陣為B,下面給出的 4X4矩陣表示模型繞X軸旋轉(zhuǎn)a角度(逆時針為正,順時針為負)的變換,將該矩陣與矩陣 B相乘就得到一個新的模型視圖矩陣A,使用新的矩陣A,就可以驅(qū)動模型產(chǎn)生相應(yīng)的動作。 在本例中,模型會在當(dāng)前顯示狀態(tài)的基礎(chǔ)上,繞X軸旋轉(zhuǎn)a角度。
JO cos(a》 ,sln(a) 0 J 0 sfe(a)cos(a》 0 A = B X lo 0 0 0. 投影變換的目的則是定義一個可視空間,可視空間有兩種用途,它決定了一個物 體如何映射到屏幕上(即使用透視投影或正投影),并且定義了哪些物體或物體的部分被 最終裁減于最終的圖像之外。如附圖11、附圖12所示,分別為透視投影和正投影的方式,在 透視投影中,物體離相機(觀察點)越遠,它在最終圖像上看上去就越??;在正投影中,可視 空間是個長方體,物體和相機的遠近不影響它看上去的大小。位于可視空間外面的物體或 物體一部分將被裁減,不出現(xiàn)在顯示的圖像中。通過指定頂、底、左、右、近、遠六個平面即可 確定投影矩陣,正投影矩陣表示如下
『 , 垂0
》*> ,.,
00
f—&
0
0
/ — If
-00,0.復(fù) 其中,t、p、 1、r、n、f分別表示頂、底、左、右、近、遠六個平面。
模型坐標向屏幕坐標的轉(zhuǎn)換需要經(jīng)歷以下幾個步驟 1、定義投影矩陣,即指定六個平面,根據(jù)指定的這六個平面,創(chuàng)建投影矩陣;
2、定義模型視圖矩陣,初始時模型沒有發(fā)生任何動作,因此初始的模型視圖矩陣 為一4X4的單位矩陣; 3、模型所有頂點的齊次坐標分別與模型視圖矩陣、投影矩陣相乘,得到模型頂點 的屏幕 坐標
6
對于普通的單視圖或多視圖顯示來說,一個視圖窗口對應(yīng)著單一的視口,因此也 就對應(yīng)一個模型視圖矩陣及投影矩陣,而對于單視圖多OpenGL視口來說,為了將不同的模 型大小適中的顯示在各自對應(yīng)的視口中,且各視口之間互不影響,需要為每個0penGL視口 定義各自獨立的投影矩陣及模型視圖矩陣。 本發(fā)明中采用的是正投影的方式,為每個OpenGL視口設(shè)置一個獨立的模型視圖 矩陣及投影矩陣。 由于當(dāng)模型視圖矩陣為單位矩陣時,模型頂點經(jīng)過變換后所得到的屏幕坐標可能 不在視口范圍內(nèi),因此可能無法在屏幕上進行顯示,為了保證模型初始時能夠在視口中大 小適中的進行顯示,需要進行一定的變換,如平移、縮放等。首先計算模型的尺寸范圍及中 心點坐標,將模型的尺寸范圍與視口的大小進行比較獲取模型的放大倍數(shù)(小于1表示縮 小倍數(shù)),根據(jù)計算結(jié)果將模型放大或縮小到正好能夠在視口中完全顯示,然后將模型的中 心位置平移到視口中心位置處。這些模型變換將會產(chǎn)生一系列的變換矩陣,將它們依次與 對應(yīng)視口的初始模型視圖矩陣相乘,得到最終的模型視圖矩陣,使用該模型視圖矩陣計算 模型的屏幕坐標,根據(jù)OpenGL提供的繪制函數(shù)將這些點在指定的屏幕坐標處繪制出來,即 可將模型顯示在對應(yīng)的0penGL視口中。 如附圖6所示,左上角為"中"字的整體結(jié)構(gòu)顯示,右半部份為"中"字的外框部分, 兩個模型均以最佳比例分別顯示在各自的0penGL視口中。
(4)交互式操作 雖然多個0penGL視口位于同一個視圖中,但不同視口的模型之間無直接關(guān)聯(lián),因 此與現(xiàn)有的視圖操作不同,對某視口中的模型進行操作時不能影響到視圖中其他視口所顯 示的模型。 添加鼠標的交互式操作功能,從技術(shù)上實現(xiàn)來說是創(chuàng)建模型變換矩陣,對于現(xiàn)有
的單視圖顯示方式來說,當(dāng)鼠標進行交互式操作時,視圖中當(dāng)前顯示的全部模型都會產(chǎn)生
動作,而本發(fā)明中要實現(xiàn)不同視口之間操作互不影響,因此需要對每一個OpenGL視口設(shè)置
獨立的模型變換矩陣。另外本發(fā)明中還考慮到了絕大多數(shù)操作人員的習(xí)慣當(dāng)希望對某個
模型進行操作時,會將鼠標移動到該模型位置的附近再進行下一步的操作。 根據(jù)上面的描述,本發(fā)明中交互式操作功能的具體實現(xiàn)為當(dāng)發(fā)生鼠標操作消息
時,判斷當(dāng)前鼠標位置,獲取對應(yīng)的視口信息,同時根據(jù)鼠標的動作判斷操作類型,如鼠標
中建按下并移動表示平移物體或是鼠標滾輪滾動表示放大或縮小物體等,創(chuàng)建相應(yīng)的模型
變換矩陣,將它與發(fā)生操作的視口所擁有的模型視圖矩陣相乘,其結(jié)果成為新的當(dāng)前矩陣,
表示組合后的變換。重新執(zhí)行模型坐標到屏幕坐標的計算過程即可得到模型最新的屏幕坐
標,使用該坐標重新繪制模型,即可得到模型的最新狀態(tài),實現(xiàn)了模型的各種動作,如平移、
旋轉(zhuǎn)、放大等,從而實現(xiàn)全方位的模型觀察,同時由于未改變其他視口的模型變換矩陣,因
而對其他視口的模型不產(chǎn)生影響。 附圖6為各OpenGL視口中模型的最初顯示狀態(tài),附圖8僅對左上角視口中的模型 進行了旋轉(zhuǎn),附圖9則僅對右半視口的模型進行了旋轉(zhuǎn)、平移、縮放操作,可以看出在一個 視口中進行操作時對其他視口沒有影響。
(5)三維拾取操作 考慮到模型的選擇需求,特別是當(dāng)多個OpenGL視口分別用于顯示整體裝配模型
7與零部件模型時,需要能夠選擇整體模型中的各個部分。因此本發(fā)明中提供了三維拾取功
能,并與其他功能相同,在不同的OpenGL視口之間能互不影響的各自獨立選擇。在各自視
口中通過對模型的對象進行編號,當(dāng)鼠標在視圖中某處發(fā)生左鍵點擊操作時,首先當(dāng)前根
據(jù)鼠標位置判斷所屬的OpenGL視口,然后根據(jù)消息響應(yīng)時返回的信息調(diào)用OpenGL提供的
選擇函數(shù)判斷被選中的對象,并對選中對象進行相關(guān)操作,如改變顏色顯示、或是將它的局
部詳細信息放入其他OpenGL視口中進行顯示等。如附圖6、附圖7所示,附圖6中,在左上
角視口中,選擇了外框(輪廓線變?yōu)榘咨?,右半視口中則放大顯示了外框的形狀,而圖7
中,選擇了內(nèi)部的一個"口"字,右半視口中則放大顯示了該部分的形狀。 本發(fā)明實現(xiàn)了在單視圖上多個OpenGL視口無縫的并存顯示,且各視口之間的操
作互不影響,不僅界面美觀,而且對操作人員來說,操作也更為簡單方便。 以上所述的實施例,只是本發(fā)明較優(yōu)選的具體實施方式
,本領(lǐng)域的技術(shù)人員在本
發(fā)明技術(shù)方案范圍內(nèi)進行的通常變化和替換都應(yīng)包含在本發(fā)明的保護范圍內(nèi)。
權(quán)利要求
一種單視圖多OpenGL視口顯示的方法,其特征在于,所述顯示方法包括以下步驟步驟A設(shè)置多個OpenGL視口,并確定各自在視圖中所處位置及大??;步驟B對每個OpenGL視口使用獨立的正投影矩陣,將模型坐標經(jīng)過變換后分別顯示在對應(yīng)的視口中;步驟C當(dāng)發(fā)生鼠標操作時,檢測鼠標當(dāng)前位置,判斷發(fā)生操作響應(yīng)的視口和操作類型,并作出響應(yīng)。
2. 如權(quán)利要求1所述的單視圖多OpenGL視口顯示的方法,其特征在于,所述顯示方 法將視圖區(qū)域的左上角坐標定義為坐標原點,區(qū)域的高度、寬度均定義為l,首先指定每個 OpenGL視口的左上角在視圖區(qū)域中的比例位置,然后分別設(shè)定該視口的高、寬與視圖高、寬 的比值,從而確定該OpenGL視口位于視圖區(qū)域中的位置及大小。
3. 如權(quán)利要求1所述的單視圖多OpenGL視口顯示的方法,其特征在于,所有OpenGL視 口之間均是無縫連接的。
4. 如權(quán)利要求2所述的單視圖多OpenGL視口顯示的方法,其特征在于,所述多個 OpenGL視口 ,采用正投影的方式,分別為每個視口設(shè)置獨立的正投影矩陣,將模型的三維坐 標經(jīng)變換后成為屏幕坐標,然后將三維模型顯示在對應(yīng)的OpenGL視口中。
5. 如權(quán)利要求1所述的單視圖多OpenGL視口顯示的方法,其特征在于,所述步驟C中, 當(dāng)鼠標位于不同視口中時,進行放大、縮小、旋轉(zhuǎn)、平移等操作時只影響該視口中所繪制的 模型,而對本視圖其他視口中的模型不會產(chǎn)生影響。
6. 如權(quán)利要求1所述的單視圖多OpenGL視口顯示的方法,其特征在于,所述步驟C中, 包括三維拾取以及不同視口之間的相互關(guān)聯(lián)操作,利用OpenGL中的選擇功能,對模型的每 個對象進行編號,當(dāng)鼠標在某個視口中點擊時,判斷所選中的對象,將該對象的詳細信息顯 示在視圖的其他OpenGL視口中。
全文摘要
本發(fā)明提供了一種單視圖多OpenGL視口顯示的方法,其特征在于,所述顯示方法包括以下步驟步驟A設(shè)置多個OpenGL視口,并確定各自在視圖中所處位置及大??;步驟B對每個OpenGL視口使用獨立的正投影矩陣,將模型坐標經(jīng)過變換后分別顯示在對應(yīng)的視口中;步驟C當(dāng)發(fā)生鼠標操作時,檢測鼠標當(dāng)前位置,判斷發(fā)生操作響應(yīng)的視口和操作類型,并作出響應(yīng)。
文檔編號G06T17/40GK101789132SQ20101001828
公開日2010年7月28日 申請日期2010年1月22日 優(yōu)先權(quán)日2010年1月22日
發(fā)明者劉棟材, 尚文, 李相鵬, 鐘俊, 顏欽 申請人:蘇州領(lǐng)航自動化科技有限公司