摘 要: 在數(shù)控加工仿真真實感圖形顯示中,通用的消隱算法用起來,效率相對較低,難以達(dá)到實時動態(tài)真實感圖形顯示的要求。專用的消隱算法有的計算仍然比較復(fù)雜,難以在微機(jī)上滿足實時真實感圖形顯示的需要。作者在總結(jié)前人研究成果的基礎(chǔ)上,充分運用了OpenGL的顯示機(jī)制,提出了一種快速局部消隱算法,該算法不僅速度快,而且非常穩(wěn)定,可以在微機(jī)上顯示高質(zhì)量的真實感圖形。
關(guān)鍵詞: 真實感圖形 消隱算法 顯示機(jī)制 局部
1.前言
實時動態(tài)仿真需要很快的顯示速度。消隱計算所耗費的時間,在顯示真實感圖形過程中占有相當(dāng)大的比重。消隱問題又是計算機(jī)圖形學(xué)中一個十分重要的內(nèi)容,至今仍然在不斷研究和完善之中。提出的消隱算法很多,如畫家算法,Z緩存算法,掃描線算法,等等[1],但是這些消隱算法往往非常復(fù)雜。為特殊的應(yīng)用,人們也常常開發(fā)一些具有針對性的專用消隱算法[2],[3]。我們研究了數(shù)控仿真的圖形顯示的特性,發(fā)現(xiàn)通用的消隱算法用起來,效率相對較低,難以達(dá)到實時動態(tài)真實感圖形顯示的要求。本文根據(jù)數(shù)控仿真的消隱和圖形顯示的特點,充分利用圖形顯示中的緩存技術(shù)[4],提出一種用于數(shù)控仿真的快速消隱算法。
2.通用的消隱算法
生成真實感圖形,消隱是必須解決的問題之一。因此消隱是計算機(jī)圖形學(xué)的重要研究內(nèi)容之一。至今提出了非常多的消隱算法如:深度緩存算法又稱Z緩存算法、掃描線算法、多邊形區(qū)域排序算法、畫家算法,等等。這些算法各有優(yōu)缺點,因OpenGL采用的是深度緩存算法,所有這里著重介紹深度緩存算法。如圖1,在屏幕坐標(biāo)系中,Z軸的方向為觀察方向。屏幕上任意一像素點(i,j)作平行于Z軸的射線R,與物體表面上的多邊形相交于pl點和p2點。pl和p2為多邊形屏幕上對應(yīng)像素(i,j)的點,pl和p2的Z值稱為該點的深度值。
圖1 深度緩存消隱
深度緩存法比較pl和p2的Z值,將最小的Z值存入深度緩存,最小的Z值所對應(yīng)的多邊形顏色存入顯示器的顏色緩存。其算法步驟如下:
初時化深度緩存ZB和顏色緩存FB,使ZB(i,j)=機(jī)器最大值,F(xiàn)B(i,j)=背景顏色,F(xiàn)OR j=1,n,F(xiàn)OR k=1,m,令Zi j=機(jī)器最大值,判斷點(i,j)是否在多邊形P在XOY面上的投影多邊形內(nèi);若是,則計算多邊形P在點(i,j)處的深度數(shù)值Zij;比較Zij與ZB(i,j)的大小,若Zij
3.OpenGL的模板緩存和深度緩存
屏幕是由象素的矩形陣列所組成,每個象素在圖像中顯示一個小方格的顏色。全部象素的存儲器稱為緩存(buffer)。存儲每個象素的顯示顏色的緩存稱為顏色緩存。空間幾何元素通過一系列的變換在屏幕上顯示出來,屏幕上一個象素對應(yīng)空間幾何元素上被顯示的點。存儲象素對應(yīng)空間幾何元素上被顯示的點的深度信息的緩存稱為深度緩存。為了更好地控制空間幾何元素的顯示,又增加了模板緩存。
深度緩存存儲每個象素的深度值。這個深度值是利用眼睛(觀測點)的距離來度量的,所以有較大深度緩存數(shù)值的空間點被較小深度緩存數(shù)值的點所覆蓋。在顯示每一個象素前比較該象素和深度緩存中原先象素的深度值,如果當(dāng)前象素的深度值小于原象素的深度緩存數(shù)值,那么顯示當(dāng)前象素,并且用當(dāng)前象素的深度緩存數(shù)值代替原先象素的深度緩存數(shù)值。這樣深度緩存數(shù)值大的象素不被顯示。
模板緩存是將繪圖局限于屏幕的某些部分。如同我們用卡紙模板來簡化和加快噴涂標(biāo)語或圖案一樣。例如,要繪制一個由內(nèi)向外從行進(jìn)中汽車窗口所看見的變動的場景,因為汽車內(nèi)部沒有變化,可以利用模板緩存使得顯示的改變僅僅發(fā)生在窗口范圍內(nèi)。這樣可以大大加快顯示的速度。方法是激活模板緩存,并設(shè)置全屏幕模板緩存內(nèi)容為0。一次繪制汽車內(nèi)部圖像并且改變所繪制范圍內(nèi)模板緩存為1,以后每次僅僅顯示汽車外部變化的場景,并且繪圖時檢查模板緩存內(nèi)容,只有在模板緩存內(nèi)容小于1的范圍才發(fā)生繪圖。
4.快速局部消隱算法
數(shù)控銑削的加工代碼少的有數(shù)百上千行,多的則上萬行甚至數(shù)十萬行代碼,銑削加工的零件形狀也多種多樣,有些形狀相當(dāng)復(fù)雜。用普通的消隱算法很難達(dá)到仿真顯示所需要的運行速度。數(shù)控加工過程仿真顯示是動態(tài)顯示刀具運動和毛坯的材料去除,每一次切削,顯示圖像僅僅是刀具切削的局部發(fā)生了變化,所以特別適合用局部刷新的方式進(jìn)行真實感圖形的顯示。本文提出的利用OpenGL顯示緩存、深度緩存和模板緩存機(jī)制的消隱算法是一種適應(yīng)局部刷新顯示要求的快速消隱算法。
具體算法描述如下:1.用模板為0畫毛坯。2.啟動深度緩存檢驗,畫刀具運動包絡(luò)體。設(shè)置顏色緩存的內(nèi)容為不能修改,所畫刀具運動包絡(luò)體不顯示,但是模板緩存中相應(yīng)內(nèi)容變?yōu)?。3.關(guān)閉深度緩存檢驗,啟用模板緩存檢驗,設(shè)置模板1的范圍內(nèi)可以顯示圖形。4.按有遠(yuǎn)到近的順序,顯示刀具軌跡中每一個小長方體的可見部分。5.將全部模板緩存內(nèi)容設(shè)置為0。6.如果還有刀具軌跡顯示需要,返回2,如果沒有刀具軌跡需要顯示,程序結(jié)束。
這個消隱算法的主要思路是:在第2步時激活深度緩存,利用Z緩存消隱算法消除刀具切削刀痕被其他結(jié)構(gòu)遮擋時的情況。同時避免將刀具切入毛坯部分的模板緩存改為1,從而出現(xiàn)圖2的錯誤消隱結(jié)果。利用第3步關(guān)閉深度緩存檢驗,啟用模板緩存檢驗。第4步在模板緩存容許的范圍內(nèi),按有遠(yuǎn)到近的順序顯示小立方體來顯示凹陷的刀具切削刀痕。
如圖3所示,執(zhí)行第2步畫刀具包絡(luò)體,模板緩存改變成1的范圍。因為顏色緩存的內(nèi)容不能更改,所以屏幕上并不顯示如圖6所示的深色的刀具的包絡(luò)體,為了便于說明模板緩存內(nèi)容改變的范圍,我們在圖3上畫出了深色刀具的包絡(luò)體,用于表示模板緩存改變的范圍。因為是激活了深度緩存,所以離視點遠(yuǎn)的刀具切入毛坯的部分,其包絡(luò)體范圍的模板緩存不改變。這樣凹陷的刀具切削刀痕中靠近視點的邊緣遮擋的部分不顯示,因此這部分的模板緩存內(nèi)容保持為0。如圖4為所顯示的刀具切削軌跡。圖5是在前景物體遮擋時畫刀具包絡(luò)體的情況,因為是激活深度緩存,所以包絡(luò)體有一部分消隱,相應(yīng)的模板緩存內(nèi)容不改變,保持為0。因此,圖5所顯示的刀具切削軌跡相對應(yīng)的部分不顯示。用這種方法,避免了一般消隱算法中的大量的求交計算,提高了顯示速度。
圖2 錯誤的消隱結(jié)果
圖3 深色部分模板內(nèi)容為1
圖4 刀具軌跡痕跡
圖5 有遮擋時的模板內(nèi)容
5.結(jié)語
消隱算法是計算機(jī)圖形學(xué)的重要研究內(nèi)容之一,至今已提出了很多算法,并且仍然是計算機(jī)圖形學(xué)的研究熱點之一。本文提出的專用于數(shù)控加工仿真的局部快速消隱算法,不僅速度快、穩(wěn)定,為在微機(jī)上實時顯示真實感圖形提供了前提條件,而且克服了等軸測投影的消隱算法不能在任意顯示工件加工過程的缺陷,具有一定的先進(jìn)性。
參考文獻(xiàn):
[1]孫家廣,楊長貴.計算機(jī)圖形學(xué).北京:清華大學(xué)出版社,1995,5.
[2]詹梅,劉郁麗,揚合.適用于三維有限元網(wǎng)格的逐步消隱法.西北工業(yè)大學(xué)學(xué)報,1998,10:641—664.
[3]焦法成,唐樹忠,梁錦文,和柏超.智能化二維消隱技術(shù).計算機(jī)輔助設(shè)計與圖形學(xué)學(xué)報,1996,1:12—17.
[4]Jackie Nelder,Tom Davis,and Mason Woo,,t openGL Programlning Guide”Addison—Wesle