摘 要: 基于OpenGL提出了一種重繪式拾取法,,詳細介紹了拾取方法和具體應用。該方法是在原來的繪圖過程中添加一次虛擬繪圖來幫助拾取物體,。
關(guān)鍵詞: OpenGL 拾取 點云
OpenGL作為一個性能優(yōu)越的圖形應用程序設(shè)計界面而廣泛應用于科學計算可視化,、CAD/CAM、仿真,、虛擬現(xiàn)實(VR)等領(lǐng)域,。其中物體的拾取屬于OpenGL中人機實時交互技術(shù)的一部分。它是由操作者通過輸入設(shè)備輸入相應信息,,來選取屏幕所顯示的物體,。
拾取是計算機圖形處理系統(tǒng)中的一個重要功能。在許多情況下,,不僅要繪制圖形,,而且允許操作者能夠通過輸入設(shè)備操縱屏幕上的物體。有時還需要獲取物體的空間坐標或圖形數(shù)值,,所有這些都要以拾取作為實現(xiàn)的基礎(chǔ),。在使用OpenGL工具包開發(fā)圖形處理系統(tǒng)時,物體的拾取有多種方法,,其中包括OpenGL提供的選擇機制,、射線拾取法(raypicking)等。作者在開發(fā)三維圖形處理系統(tǒng),,實現(xiàn)大量三維點(點云)的框選功能時,,發(fā)現(xiàn)OpenGL提供的選擇機制有其自身的缺陷,而射線拾取法又會涉及到過于復雜的算法,。為此研究出一種易于實現(xiàn),、適應性強的物體拾取方法——重繪式拾取法。
1 拾取方法綜述
1.1 OpenGL選擇機制
OpenGL為了解決拾取問題,,提供了一種基于名字堆棧和命中記錄的選擇機制,。但是,,這種機制使用限制較多,其拾取最小單位是圖元,,而不是空間點,,且對于數(shù)據(jù)量較大的物體會因為名字堆棧的溢出而無法成功實現(xiàn)。另外,,OpenGL的選擇機制使用起來比較麻煩,,需要在正常模式和選擇模式之間進行切換。
1.2 射線拾取法
射線拾取法是通過獲取鼠標在屏幕上的點擊點,,經(jīng)屏幕坐標轉(zhuǎn)換得到投影點,,以視點為起點,經(jīng)投影點構(gòu)造一條垂直指向屏幕的射線,。由于所有物體都位于視錐之內(nèi),,因而只需判斷這條射線與場景中的哪些物體相交,經(jīng)過選擇即可獲取所需要物體,。
將這種方法應用于點云的框選時,,則需要將屏幕上的n個點擊點所對應的n條射線構(gòu)成一個選擇體。然后,,通過算法來對每個點進行處理判斷,,在選擇體內(nèi)部的點就是所要拾取的點。
這種方法的缺點是,,對于復雜的選擇體,,判斷物體是否在選擇體內(nèi)部的算法極其復雜。從而使整個處理過程耗時巨大,,且如此復雜的算法也會給整個系統(tǒng)的實現(xiàn)帶來一定難度,。
1.3 對象緩沖區(qū)的拾取方法
對象緩沖區(qū)的拾取方法需要在內(nèi)存中創(chuàng)建對象緩沖區(qū),且需要對內(nèi)存進行大量操作,,因而降低了效率,。而重繪式拾取法則不需進行屏幕數(shù)據(jù)的讀取和拷貝。
1.4 重繪式拾取法
重繪式拾取法避免了前述方法的缺點,。其優(yōu)點:(1)沒有采用OpenGL選擇機制,。整個拾取過程都在OpenGL的繪圖模式下完成,因此不必要為每個物體命名,。同時,,避免了在繪圖模式與選擇模式之間的切換。(2)這種方法在框選時,,選擇框可以是方形、圓形等各種自定義形狀,,并且此方法容易實現(xiàn),,不會涉及到復雜算法。
2 重繪式拾取法
2.1 基本思路
重繪式拾取法是在OpenGL繪圖模式下,通過2次繪圖來拾取并顯示物體。第1次繪圖為虛擬繪圖,,通過在OpenGL幀緩存中繪制一些輔助圖形來幫助選取物體,。這些輔助圖形對于系統(tǒng)使用者是不可見的,因此在確定所選物體之后要將輔助圖形從幀緩存中清除掉才能進行第2次繪圖,。第2次繪圖為實際繪圖,,所繪圖形為系統(tǒng)使用者看到的真實圖形。
這種拾取方法的過程如下:(1)進入虛擬繪圖過程,,繪制輔助圖形,。根據(jù)不同的應用,可以使用不同的輔助圖形,。(2)從輔助圖形得出相應信息,,搜索出所要拾取的物體。(3)進入真實繪圖過程,,清除輔助圖形,,設(shè)置背景顏色,繪制真實圖形,。在不需要拾取物體的時候,,不必執(zhí)行虛擬繪圖過程,直接執(zhí)行步驟(3)進入真實繪圖過程即可,。
此種拾取方法與前述的幾種拾取方法也有相通之處,。與OpenGL的選擇機制對比,這種方法雖然沒有進入選擇模式建立名字堆棧,,但在實際應用中,,常會利用不同的顏色值來對物體進行區(qū)分,其虛擬繪圖過程相當于OpenGL的選擇模式,。射線拾取法是通過復雜的算法來確定物體與選擇體之間的空間位置關(guān)系,,從而選取相應的物體。而這種重繪式拾取法則將確定空間位置關(guān)系的工作交給了OpenGL,,通過輔助圖形和OpenGL提供的函數(shù)來選擇相應的物體,。
2.2 輔助圖形
此方法的第一步虛擬繪圖的主要工作就是要繪制輔助圖形。輔助圖形通常是借助顏色來分辨選中的物體和未被選中的物體,。如在點云的框選中,,可以將選擇區(qū)域涂成白色,將未被選擇的區(qū)域(背景)涂成黑色,,白色區(qū)域中的點即是所要選擇的點,。整個白色的選擇區(qū)域就是在虛擬繪圖中所要繪制的輔助圖形。
輔助圖形是整個重繪式拾取法的核心,。對不同的拾取要求(如點的框選或者是大物體的點選等),,輔助圖形各不相同,。輔助圖形的選擇決定了拾取功能實現(xiàn)的成功與否。
2.3 搜索物體
此方法的第二步是搜索物體,,它需要根據(jù)一些信息來對所有物體進行遍歷,。目前都是通過顏色信息來確定被選物體。如在點云的框選中,,就需要遍歷所有的點,,其所在位置的顏色就是決定其是否被選中的依據(jù)。
3 應 用
這種重繪式拾取方法在作者自行開發(fā)的圖形處理系統(tǒng)中已經(jīng)得到了應用,。下面用實例來介紹這種拾取方法的實現(xiàn)過程,。
作者的圖形處理系統(tǒng)是根據(jù)大量的三維點(點云)進行曲面重構(gòu)。其中點的拾取是必不可少的,。重繪式的拾取方法極其適合點云的框選,。其具體處理過程如下。
(1)繪制輔助圖形,。此輔助圖形為輸入設(shè)備所提供的選擇框,,且選擇框的形狀可任意。選擇框的內(nèi)部填充為白色,。
(2)確定選擇框內(nèi)部的三維點,。通過判斷三維點所在位置的屏幕顏色來判斷此點是否為被選點。被選擇的點位于選擇框之內(nèi),,其顏色值應為選擇框的顏色(白色),。沒被選中的點位于選擇框之外,其顏色值應為背景的顏色(黑色),。
這個過程用到的2個關(guān)鍵OpenGL API函數(shù)是glReadPixels與gluProject,。首先,用函數(shù)glReadPixels讀取幀緩存中的象素值,。然后用函數(shù)gluProject將所有點的三維坐標轉(zhuǎn)換成點在幀緩存中的位移,,由這些位移便可以得到每個點在幀緩存中的象素值,從而可以判斷出哪些三維點為選中點,。
注意,,函數(shù)glReadPixels只能讀取幀緩存的象素值,捕獲不到顯示窗口外的象素點,。因此,,當選擇框超過當前窗口的大小時,則需要將坐標系進行縮放,,使得選擇框能夠在當前窗口中全部顯示,。此外,繪圖過程中要使用OpenGL的平坦模式,,并且要關(guān)閉燈光和顏色抖動,,否則將干擾選擇程序進行正確的選擇,。
(3)清除輔助圖形,,繪制真實圖形,。可使用OpenGL的函數(shù)glClear清空屏幕和深度緩存,,從而清除掉白色實心的選擇體,。
圖1為作者開發(fā)的軟件在框選點之前的截圖。圖2為框選點之后的截圖,,圖中有4萬個三維點(有很多重合點),。在框選時,拾取速度很快且沒有閃屏和漏選的現(xiàn)象,。圖2中白色框為選擇框,,圖中的點為選中的點。
4 展 望
以上所講的只是重繪式拾取法的一個實例,,對于其他的拾取情況,,可以采取不同的輔助圖形和篩選方法來拾取物體,甚至可以利用光照,、顏色抖動,、材質(zhì)等各種OpenGL提供的繪圖環(huán)境來達到目的。但是這些技術(shù)還需要進一步的研究和開發(fā),。
參考文獻
1 Wright R S,,Sweet J M.OpenGL超級寶典.北京:人民郵電 出版社,2000
2 Heran D,,Baker M P.計算機圖形學.北京:清華大學出版社,,1998
3 喬林,費廣正.OpenGL程序設(shè)計.北京:清華大學出版社,, 2000
4 白燕斌,,史惠康.OpenGL三維圖形編程指南.北京:機械工 業(yè)出版社,1998