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