《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 一種OpenGL局部縮放算法及應用
一種OpenGL局部縮放算法及應用
來源:微型機與應用2013年第19期
張立成1,,張 鴿2
(1.長安大學 信息工程學院,,陜西 西安 710064;2.西安中交土木科技有限公司,,陜西 西安 7
摘要: 縮放是OpenGL三維模型展示的基本操作之一,一般縮放時由于整個場景圍繞視景體中心縮放,感興趣區(qū)域在視圖窗口中的位置會不斷變化甚至離開視景體,,需要不斷地執(zhí)行平移操作,不斷地修正感興趣區(qū)域在視圖窗口中的位置,,無法集中精力觀察工程計算中模型的變化細節(jié),。為了解決該問題,從圖形學角度提出了一種改進的局部縮放算法,,實現(xiàn)了用鼠標滾輪縮放模型時,,鼠標選擇處的模型不離開視景體而相對視圖窗口的位置保持不變,省去了傳統(tǒng)算法中用戶進行縮放操作時需要不斷進行平移的操作,,改進了用戶體驗,。該算法在多個可視化項目中得到實際應用,取得了很好的操作體驗,。
Abstract:
Key words :

摘  要: 縮放是OpenGL三維模型展示的基本操作之一,,一般縮放時由于整個場景圍繞視景體中心縮放,感興趣區(qū)域在視圖窗口中的位置會不斷變化甚至離開視景體,,需要不斷地執(zhí)行平移操作,,不斷地修正感興趣區(qū)域在視圖窗口中的位置,無法集中精力觀察工程計算中模型的變化細節(jié),。為了解決該問題,,從圖形學角度提出了一種改進的局部縮放算法,實現(xiàn)了用鼠標滾輪縮放模型時,,鼠標選擇處的模型不離開視景體而相對視圖窗口的位置保持不變,,省去了傳統(tǒng)算法中用戶進行縮放操作時需要不斷進行平移的操作,,改進了用戶體驗。該算法在多個可視化項目中得到實際應用,,取得了很好的操作體驗,。
關鍵詞: 計算機應用坐標變換,; 局部縮放,;可視化;視景體

 OpenGL是一個與硬件平臺無關,、與系統(tǒng)平臺無關的三維圖形庫,,其在三維真實感圖形制作中具有優(yōu)秀的性能,已經(jīng)成為高性能的圖形和交互視景處理的標準,。OpenGL API由200多個函數(shù)組成,,主要提供圖形繪制、變換操作,、顏色模式,、光照、圖像效果增強,、位圖和圖像,、紋理映射、交互與動畫8個方面的功能,。一些跨平臺的三維庫(如OSG)也是建立在OpenGL之上的,,對OpenGL的API進行了封裝,利用這些三維庫,,開發(fā)人員可以開發(fā)豐富的交互式應用程序[1-3],。GPU高性能計算的支持,使得OpenGL開發(fā)的三維程序運行更加流暢,、場景更加逼真[4],。
 OpenGL具有強大的圖形處理功能,包括圖形的平移,、旋轉,、縮放等。靈活運用OpenGL的這些功能,,可以實現(xiàn)很多更復雜的操作。但在一般情況下,,當利用OpenGL進行圖形的縮放時,,往往是以視景體的中心為縮放中心進行整體縮放[5],該算法雖然在整體上實現(xiàn)了一定的縮放功能,,但縮放的過程中,,用戶期望的縮放區(qū)域會在Windows視圖窗口中不斷變化甚至離開視景體。以放大為例,為了觀察感興趣區(qū)域的細節(jié),,如模型在外力作用下的變化過程,,往往需要借助平移將目標區(qū)域移到合適位置后才能繼續(xù)放大,在放大達到一定系數(shù)時,,放大-平移的操作非常頻繁,,嚴重影響了操作體驗。參考文獻[6]提出了一種拉框放大算法,,計算鼠標框選區(qū)域在視景體中的位置,,然后將這個位置重新投影到視口上,該算法雖然能夠實現(xiàn)放大,,但是不能夠局部縮小,,且放大與縮小操作的切換不連貫。本文提出的算法不僅能夠實現(xiàn)局部縮放的效果,,而且在操作方法上也作了改進,,用戶滾動鼠標的滾輪,默認以光標處的模型為感興趣區(qū)域中心,,縮放將圍繞該中心進行,,而且用戶期望的縮放區(qū)域在視景體中原地縮放,縮小和放大操作切換流暢,。
1 OpenGL變換的基本原理
 三維模型顯示到二維屏幕的過程分為造型變換,、取景變換、投影變換和視口變換4個階段[7],,如圖1所示,。

 其中,方框中為坐標變換名稱,,箭頭上為坐標系名稱,。
 造型變換將各個處于自身局部坐標系中的模型變換到世界坐標系中組成整個場景;取景變換將定義在世界坐標系下的場景變換到視點坐標系中,;投影變換將視點坐標系中的場景投影到二維視窗區(qū)域,;視口變換將視窗中的投影結果轉換到屏幕坐標系中[8]。
 本文討論的相關算法涉及變換序列中的投影變換和視口變換,,為了使物體在屏幕上的顯示尺寸不受所處距離遠近的影響,,本文采用正投影。正投影將裁剪后的視景體投影到二維投影平面上,,映射到以像素為單位的屏幕坐標系的過程這里簡化為式(1),,因為Windows視圖窗口所在坐標系的默認形式為:視圖窗口左上角為原點,向右為X正方向,,向下為Y正方向(不考慮普通二維變換和光柵化等步驟),。

 由于放大后的視景體的長度和寬度都小于放大前的視景體的長度和寬度,,在視圖顯示窗口尺寸不變的前提下,模型只顯示虛線中的部分,,從而達到放大的效果,。

3 程序實現(xiàn)與應用
 以VC 8.0為開發(fā)工具,OpenGL最小系統(tǒng)的搭建過程省略,,本文算法的主要實現(xiàn)過程及代碼如下,。
3.1 定義變量
 在應用程序的頭文件里定義變量如下,這里變量的名稱和算法中描述的一致,。
//鼠標當前點坐標
    CPoint m_MousePos,;
    //鼠標當前點距離視景體左邊緣和下邊緣的距離
    double Xpv1,Ypv1,;
3.2 分別為應用程序添加WM_MOUSEMOVE和WM_MOUSEWHEEL消息
 在WM_MOUSEMOVE消息的響應函數(shù)中為定義的變量賦值,,部分代碼如下。
//獲取視圖窗口的尺寸
CRect rect,;
GetClientRect(&rect),;
//計算Xpv1和Ypv1
m_MousePos=CPoint(point.x,rect.Height()-point.y),;
double w,,h;
m_Camera.get_view_rect(w,,h),;
Xpv1=w*m_MousePos.x*1.0/rect.Width();
Ypv1=h*m_MousePos.y*1.0/rect.Height(),;
WM_MOUSEWHEEL消息響應函數(shù)核心代碼為:
//縮放系數(shù)
double a,;
//視景體寬度和高度
double w,h,;
//平移量
double t_x=0.0,,t_y=0.0;
if(zDelta<0)
{
    //縮小系數(shù)
    a=1.1,;
}
if(zDelta>0)
{
    //放大系數(shù)
    a=0.9,;
}    
//獲取視景體寬度和高度
m_Camera.get_view_rect(w,h),;
//根據(jù)算法計算平移量
t_x=(1-a)*(0.5*w-Xpv1),;
t_y=(1-a)*(0.5*h-Ypv1);
//累計平移量
m_Camera.set_move_view(t_x,,t_y),;
//縮放
m_Camera.zoom(a);
//計算新Xpv1,,Ypv1
m_Camera.get_view_rect(w,,h);
CRect rect,;
GetClientRect(&rect),;
Xpv1=w*m_MousePos.x*1.0/rect.Width();
Ypv1=h*m_MousePos.y*1.0/rect.Height(),;
InvalidateRect(NULL,,F(xiàn)ALSE);//刷新視圖
3.3 算法在工程計算可視化項目中的應用

 


 算法在多個可視化項目中得到應用,,圖3為“風,、地震、隨機車流與橋梁交互動力分析軟件”截圖,。一方面它能更真實地揭示出橋梁結構在汽車車輛荷載作用下的動態(tài)受力與變形本質,,另一方面又能描述出橋梁結構在地震作用下的系統(tǒng)影響。因為數(shù)據(jù)計算量大,,單純用VC++ 8.0程序計算耗時過多,,容易造成計算中斷,所以本軟件采用Fortran語言作為數(shù)值計算程序主體,,采用VC++ 8.0作為人機界面設計平臺,,通過混合編程實現(xiàn)3種程序設計語言的組合、相互調(diào)用,、參數(shù)傳遞,、數(shù)據(jù)結構與信息共享,從而形成統(tǒng)一的橋梁動力學分析可視化軟件,。
 該項目充分發(fā)揮Fortran語言在科學計算方面的優(yōu)勢及OpenGL在三維可視化渲染方面的優(yōu)勢,,將工程人員多年積累的代碼資源及計算結果以圖形化展示,實現(xiàn)了橋梁結構在風,、地震及隨機車流作用下的動態(tài)受力與變形的可視化,。
 縮放是該軟件的重要功能之一,工程可視化軟件與一般的三維模型渲染軟件的區(qū)別是:一般三維模型軟件的點元,、線元是基本不變的,,而工程可視化軟件中渲染的模型是變化的,重點是將模型在外力(車輛負荷,、風力,、地震等)作用下的變化展示出來,即點元,、線元的相對位置是變化的,。為了將精力集中在觀察橋梁的結構在風、地震及隨機車流作用下的動態(tài)受力與變形,,在對模型進行瀏覽時就不能不停地執(zhí)行平移放大操作,。假設圖3(a)中標記的點為感興趣點,,縮放應圍繞該目標點進行。圖3(b)為一般算法放大后的模型效果圖,,此時的目標點已經(jīng)離開Windows視圖窗口,,需要不斷平移再放大才能找到。圖3(c)為本文算法放大后的模型效果圖,,目標點依然在視圖窗口內(nèi),,在對模型進行瀏覽時不需要不停地平移即可看到模型的細節(jié),很好地改善了用戶的操作體驗,,讓工程人員能夠專注于橋梁結構在風,、地震及隨機車流作用下的影響。

 計算機圖形學給人們提供了一種直觀的信息交流工具,,計算機圖形學已被廣泛地應用于各個不同的領域,,尤其是在計算機輔助設計、計算機輔助制造和科學計算可視化等應用領域,。利用本文介紹的算法,,用戶可以方便地以某一點為中心進行自由縮放,及時捕捉工程計算的效果,,減少冗余操作,,改善用戶操作體驗,對開發(fā)圖形圖像應用軟件有一定的幫助,。
參考文獻
[1] 梅章明,,張秀山.基于MFC和OpenGL的噴泉模擬實現(xiàn)[J].微型機與應用,2012,,31(14):41-43.
[2] 何煦佳,,楊榮騫,黃毅洲,,等.基于OpenGL的醫(yī)學圖像實時交互處理技術[J].計算機應用與軟件,,2013,30(4):48-50,,64.
[3] 胡平平,,劉建明,王晶杰.OpenGL顯示3DS模型若干問題的研究[J].工程圖學學報,,2010(4):189-193.
[4] 張舒,,褚艷利.GPU高性能運算之CUDA[M].北京:中國水利水電出版社,2009.
[5] SHREINER D,, WOO M,, NEIDER J,等.OpenGL編程指南(第4版)[M].鄧鄭祥,譯.北京:人民郵電出版社,,2005.
[6] 崔洪斌,,秦國海,?,|.利用OpenGL實現(xiàn)圖形的局部放大[J].工程圖學學報,,2005(6):58-61.
[7] 姜衛(wèi)東.基于OpenGL的三維函數(shù)圖象繪制[D].長春:吉林大學,2007.
[8] 彭群生,,金小剛,萬華根,,等.計算機圖形學應用基礎(第1版)[M].北京:科學出版社,,2009.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉載,。