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

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

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

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

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

3 程序實現與應用
 以VC 8.0為開發工具,OpenGL最小系統的搭建過程省略,本文算法的主要實現過程及代碼如下。
3.1 定義變量
 在應用程序的頭文件里定義變量如下,這里變量的名稱和算法中描述的一致。
//鼠標當前點坐標
    CPoint m_MousePos;
    //鼠標當前點距離視景體左邊緣和下邊緣的距離
    double Xpv1,Ypv1;
3.2 分別為應用程序添加WM_MOUSEMOVE和WM_MOUSEWHEEL消息
 在WM_MOUSEMOVE消息的響應函數中為定義的變量賦值,部分代碼如下。
//獲取視圖窗口的尺寸
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消息響應函數核心代碼為:
//縮放系數
double a;
//視景體寬度和高度
double w,h;
//平移量
double t_x=0.0,t_y=0.0;
if(zDelta<0)
{
    //縮小系數
    a=1.1;
}
if(zDelta>0)
{
    //放大系數
    a=0.9;
}    
//獲取視景體寬度和高度
m_Camera.get_view_rect(w,h);
//根據算法計算平移量
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,FALSE);//刷新視圖
3.3 算法在工程計算可視化項目中的應用

 


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

 計算機圖形學給人們提供了一種直觀的信息交流工具,計算機圖形學已被廣泛地應用于各個不同的領域,尤其是在計算機輔助設計、計算機輔助制造和科學計算可視化等應用領域。利用本文介紹的算法,用戶可以方便地以某一點為中心進行自由縮放,及時捕捉工程計算的效果,減少冗余操作,改善用戶操作體驗,對開發圖形圖像應用軟件有一定的幫助。
參考文獻
[1] 梅章明,張秀山.基于MFC和OpenGL的噴泉模擬實現[J].微型機與應用,2012,31(14):41-43.
[2] 何煦佳,楊榮騫,黃毅洲,等.基于OpenGL的醫學圖像實時交互處理技術[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實現圖形的局部放大[J].工程圖學學報,2005(6):58-61.
[7] 姜衛東.基于OpenGL的三維函數圖象繪制[D].長春:吉林大學,2007.
[8] 彭群生,金小剛,萬華根,等.計算機圖形學應用基礎(第1版)[M].北京:科學出版社,2009.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 欧美精品hdvideosex | 最近免费中文字幕完整5 | 国产日韩中文字幕 | 亚洲午夜一区 | 影音先锋第一页 | 欧美精品亚洲人成在线观看 | 嫩草在线视频www免费观看 | 中文字幕激情视频 | 777奇米影视一区二区三区 | 免费香蕉一区二区在线观看 | 色网在线视频 | 青春草国产 | 五月天综合激情 | 国产xxxx做受性欧美88 | 你懂的网站在线观看 | 日韩在线第二页 | 色综合久久88色综合天天提莫 | 日日操夜夜操视频 | 亚洲成人免费看 | 特黄特色一级aa毛片免费观看 | 一级片免 | 秋霞国产一级特黄 | 亚洲欧美视频在线 | 成人午夜精品网站在线观看 | 国产精品一区在线观看 | 成人青草亚洲国产 | 国产成人综合网亚洲欧美在线 | 涩涩视频免费看 | 狠狠干婷婷 | 污黄视频在线看 | 久久久91精品国产一区二区三区 | 国产一区二区三区美女秒播 | 在线中文字幕日韩 | www黄色网址 | 欧美午夜在线播放 | 欧洲另类一二三四区 | 欧美超强性xxxxx | 黄色大片在线视频 | 天天爽天天干天天操 | 美国一级毛片a | 小明永久视频 |