




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、PAGE 論文(lnwn)題目: 基于OpenGL的屏幕(pngm)對象拾取 系 別: 計算機系 專業(yè)(zhuny)年級: 學 號: 姓 名: 指導教師、職稱: 年 05 月 10 日PAGE IPAGE II目錄(ml) TOC o 1-3 h z u HYPERLINK l _Toc262023611 摘要(zhiyo) PAGEREF _Toc262023611 h 1 HYPERLINK l _Toc262023612 Abstract PAGEREF _Toc262023612 h 2 HYPERLINK l _Toc262023613 1 緒論(xln) PAGEREF _Toc2
2、62023613 h 3 HYPERLINK l _Toc262023614 1.1 課題的目的和意義 PAGEREF _Toc262023614 h 3 HYPERLINK l _Toc262023615 1.2 拾取技術(shù)國內(nèi)外研究 PAGEREF _Toc262023615 h 3 HYPERLINK l _Toc262023616 1.3 本論文研究主要內(nèi)容 PAGEREF _Toc262023616 h 3 HYPERLINK l _Toc262023617 2 基于OpenGLMFC的建模基礎 PAGEREF _Toc262023617 h 5 HYPERLINK l _Toc262
3、023618 2.1 OpenGL概括 PAGEREF _Toc262023618 h 5 HYPERLINK l _Toc262023619 2.2 OpenGL渲染管線過程 PAGEREF _Toc262023619 h 5 HYPERLINK l _Toc262023620 2.2.1頂點變換 PAGEREF _Toc262023620 h 6 HYPERLINK l _Toc262023621 2.2.2圖元組裝 PAGEREF _Toc262023621 h 6 HYPERLINK l _Toc262023622 2.2.3圖元處理 PAGEREF _Toc262023622 h 6
4、 HYPERLINK l _Toc262023623 2.2.4片元處理 PAGEREF _Toc262023623 h 6 HYPERLINK l _Toc262023624 2.2.5光柵化操作 PAGEREF _Toc262023624 h 6 HYPERLINK l _Toc262023625 2.3 MFC概述 PAGEREF _Toc262023625 h 6 HYPERLINK l _Toc262023626 2.4 MFC特點 PAGEREF _Toc262023626 h 7 HYPERLINK l _Toc262023627 2.4.1封裝 PAGEREF _Toc2620
5、23627 h 7 HYPERLINK l _Toc262023628 2.4.2繼承 PAGEREF _Toc262023628 h 8 HYPERLINK l _Toc262023629 2.4.3虛擬函數(shù)和動態(tài)約束 PAGEREF _Toc262023629 h 8 HYPERLINK l _Toc262023630 2.5 應用程序的構(gòu)成 PAGEREF _Toc262023630 h 8 HYPERLINK l _Toc262023631 2.6 基于OpenGL+MFC的三維模擬的編程環(huán)境配置 PAGEREF _Toc262023631 h 9 HYPERLINK l _Toc26
6、2023632 3 拾取技術(shù) PAGEREF _Toc262023632 h 12 HYPERLINK l _Toc262023633 3.1 基于射線求交拾取技術(shù) PAGEREF _Toc262023633 h 12 HYPERLINK l _Toc262023634 3.1.1判斷線段和包圍盒的相對位置 PAGEREF _Toc262023634 h 12 HYPERLINK l _Toc262023635 3.2 基于GPU的重繪式拾取技術(shù) PAGEREF _Toc262023635 h 14 HYPERLINK l _Toc262023636 3.3 各種拾取技術(shù)比較 PAGEREF
7、_Toc262023636 h 16 HYPERLINK l _Toc262023637 4 系統(tǒng)的設計及實現(xiàn) PAGEREF _Toc262023637 h 18 HYPERLINK l _Toc262023638 4.1 系統(tǒng)的選擇機制 PAGEREF _Toc262023638 h 18 HYPERLINK l _Toc262023639 4.1.1進入選擇模式之前 PAGEREF _Toc262023639 h 18 HYPERLINK l _Toc262023640 4.1.2獲取當前選擇模式 PAGEREF _Toc262023640 h 18 HYPERLINK l _Toc26
8、2023641 4.1.3退出選擇模式 PAGEREF _Toc262023641 h 20 HYPERLINK l _Toc262023642 4.1.4拾取 PAGEREF _Toc262023642 h 20 HYPERLINK l _Toc262023643 4.2 拾取結(jié)果截圖 PAGEREF _Toc262023643 h 21 HYPERLINK l _Toc262023644 5 結(jié)論與展望 PAGEREF _Toc262023644 h 25 HYPERLINK l _Toc262023645 5.1 結(jié)論 PAGEREF _Toc262023645 h 25 HYPERLI
9、NK l _Toc262023646 5.2 展望 PAGEREF _Toc262023646 h 25 HYPERLINK l _Toc262023647 參考文獻 PAGEREF _Toc262023647 h 26 HYPERLINK l _Toc262023648 致謝 PAGEREF _Toc262023648 h 28PAGE 40摘要(zhiyo)屏幕(pngm)對象的拾取是計算機圖形處理系統(tǒng)中一個重要的功能,在許多情況下,計算機圖形處理系統(tǒng)不僅要繪制(huzh)圖形,而且要允許操作者能夠通過輸入設備(通常是鼠標)操縱屏幕上的物體(標識、移動和修改)。有時還需要獲取物體上點的空間
10、坐標或測量物體的幾何特性如距離、角度、半徑等,這些操作都需要以拾取作為實現(xiàn)的基礎。OpenGL為了解決拾取問題,提供了一種基于名字堆棧和命中記錄的選擇機制。在OpenGL中,拾取物體是利用拾取矩陣和投影變換,將拾取的范圍限制在鼠標熱點的有效區(qū)中,一旦觸發(fā)鼠標事件就進入選擇模式并將有效區(qū)初始化,最后利用拾取矩陣拾取有效區(qū)內(nèi)的物體。有效區(qū)的定義由glPick2Matix()函數(shù)來完成。一旦拾取成功,就以記錄的形式返回與拾取物體相關(guān)的信息,并生成一個記錄表示一個物體被命中。這種物體拾取方法非常簡單,不需要寫很多代碼。在使用OpenGL工具包開發(fā)圖形處理系統(tǒng)時,物體的拾取有多種方法,其中包括OpenG
11、L提供的選擇機制、射線拾取法、重繪式拾取法等。本文采用OpenGL本身提供的選擇機制來拾取對象,突出OpenGL工具包在屏幕對象的拾取方面的優(yōu)勢。關(guān) 鍵 詞:OpenGL;計算機應用;拾取算法AbstractIn most cases, one important feature of graphics processing system is picking, which allow users to select objects by mouse, and to modify the their attributes, such as gemetry mesh or angle and s
12、o on. In order to solve the problem, pick OpenGL provides a name on the stack and hit record choice mechanism. In the OpenGL and pickobject is using the loot matrix and projection transformation, and will gather in the limits of the mouse, effective once entered the mouse event trigger mode choice a
13、nd will be effective area, finally using initialization gleaned matrix pick objects in the area of effective. The definition of effective glPick2Matix () function to finish. Once pick success, to return to pick the record object relevant information, and to create a record, says an object to be hit.
14、 This object pick method is very simple, need not write many code.In the use of graphics processing system development OpenGL toolkit objects, pick a variety of methods, including OpenGL provide choice mechanism, ray pick, redrawn type gather method, etc. Based on the mechanism of OpenGL itself to p
15、rovide choice pickup, outstanding OpenGL toolkit objects in the screen in the object.Key words: OpenGL; computer application;picking1 緒論(xln)目前許多優(yōu)秀的圖形工具能為我們繪制惟妙惟肖的虛擬現(xiàn)實場景,在面對這些場景時候我們除了欣賞之外更多的是希望能與之互動,做為編程人員可以使用代碼輕松的重新構(gòu)造場景,但對于終端用戶而言,他們也希望自己也能對造場景進行一些操作,如添加,刪除等等。對于這些操作而言,首先我們要做的是能讓用戶使用鼠標來選擇(xunz)他所希望操作
16、的對象,這就是本文要討論的一個重點:拾取,這是一種在許多交互性程序中有基礎地位的操作,是對屏幕中對象進行定位,并確定所選擇的是哪個物體。然而該操作給我們提出了一些難題,首先,需要對對象進行屆定。其次,必須對“拾取(shq)目標”進行定義。這就需要終端用戶確定單擊的位置是構(gòu)成對象的圖元上,還是對象附近的位置以及考慮如果選取點落在兩個以上物體交集部分如何處理等等問題,本文利用了OpenGL中的選擇模式進行有效的對象判別和拾取。1.1 課題的目的和意義圖形對象的拾取是計算機圖形處理系統(tǒng)中一個重要的功能,很多圖形系統(tǒng)需要用戶通過輸入設備與系統(tǒng)交互,如移動、旋轉(zhuǎn)某個物體,或查詢某個物體的狀態(tài)信息,需要通
17、過拾取來確定景中的操作對象。快速可靠的拾取被廣泛地運用于各種系統(tǒng)中,如實時圖形系統(tǒng)、虛擬現(xiàn)實、游戲和CAD系統(tǒng)等方面,拾取操作己成為這些系統(tǒng)的重要部分,它在計算機建模軟件尤其重要,能夠通過拾取操作對模型進行局部修改和編輯,提高建模系統(tǒng)的靈活性和適用性。隨著計算機軟硬件的快速發(fā)展,人們對實時系統(tǒng)的交互的實時性要求也越發(fā)苛刻,而且三維場景復雜度也日益提高,這就要求系統(tǒng)提供快速的拾取操作。因此,高效的拾取算法能夠決定拾取操作快與慢的關(guān)鍵所在,從而開發(fā)高效的拾取算法已成為當今一個的課題研究。1.2 拾取技術(shù)國內(nèi)外研究隨著網(wǎng)絡科技越來越發(fā)達,拾取操作也越來越方便了,有的只要鼠標點點就可以。而拾取操作的關(guān)
18、鍵是拾取算法。到目前為止,拾取算法大致上可以分三種。第一種是基于射線求交的拾取技術(shù),1992年,Mark Segul,Carl Korobkin,Rolf van Widenfelt等人首次采用了基于射線求交的拾取技術(shù)原理實現(xiàn)了對衣服的拾取1;1998年Michael Deering,Step hanie Winner and Bic Schediwy等也才采用了同樣的技術(shù)成功做到了人物的拾取2;2005年,龔堰玨,顏敏等人采用了基于射線求交的拾取技術(shù)實現(xiàn)對幾個簡單物體的拾取3;同年,韋宇煒也是用此技術(shù)實現(xiàn)對游戲中各類的拾取,如對技能的釋放,對地上物品的撿起來,對別的玩家人物屬性的查看等等4;
19、2006年,姚繼權(quán),李曉豁等人也采用了這種拾取技術(shù)成功地做到了對3D網(wǎng)游游戲中的各種各樣的拾取5,等等。第二種是基于GPU的重繪式拾取技術(shù),這種方法對硬件的依賴性大,不過拾取速度快。1997年,MasaakiOka,Kyoya Tsutsui,Akio Ohba等人第一次采用了基于GPU的重繪式拾取技術(shù)在房子中拾取到了房子主人與小孩子6;2006年,劉力強,周明全等多人采用基于GPU的重繪式拾取技術(shù),在大規(guī)模室外地形中拾取到了地面某個區(qū)域7。第三種是OpenGL自帶的拾取機制,1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了Windows NT版本的Open
20、GL,從而使一些原來必須在高檔圖形工作站上運行的大型3D圖形處理軟件也可以在微機上運用。1995年OpenGL的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能,如本身自帶的拾取機制,這項功能使OpenGL在各個領(lǐng)域都得到了應用8。隨后出現(xiàn)的各個版本,使自帶的拾取機制越來越完善,操作越來越方便,應用范圍越來越廣泛。1.3 本文研究(ynji)的主要(zhyo)內(nèi)容(一):綜述本課題研究的意義以及(yj)國內(nèi)外研究現(xiàn)狀;(二):介紹了OpenGL與OpenGL渲染管道,分析MFC編程框架和基于OpenGL+MFC的三維模擬的編程環(huán)境配置;(三):各種拾取技術(shù)的實現(xiàn)原理,優(yōu)缺點;(
21、四):采用了OpenGL本身自帶的拾取機制設計并實現(xiàn)簡單的拾取操作;(五):總結(jié)本文并進一步給出了展望。2 基于(jy)OpenGLMFC的建模基礎2.1 OpenGL概括(giku) OpenGL(全寫Open Graphics Library)是個定義(dngy)了一個跨編程語言、跨平臺的編程軟件接口的規(guī)格,該接口包括了大約250個不同的函數(shù)(其中核心OpenGL大約包括200個函數(shù),另外還有50個左右位于OpenGL工具函數(shù)庫),可以用這些函數(shù)指定物體和操作,創(chuàng)建交互性三維應用程序。它是個專業(yè)的圖形程序接口,是一個功能強大,調(diào)用方便的底層圖形庫,Opengl用于三維圖象(二維的亦可)。O
22、penGL的設計目標就是作為一種流線型的、獨立于硬件的接口,可以在許多不同的硬件平臺上實現(xiàn)。為了實現(xiàn)這個目標,OpenGL并未包含用于執(zhí)行窗口任務或者獲取用戶輸入之類的函數(shù)。反之,必須通過窗口系統(tǒng)控制所使用的特定硬件。類似地,OpenGL并沒有提供用于描述三維物體模型的高層函數(shù)。這類函數(shù)可能允許你指定相對較為復雜的形狀,例如汽車、身體的某 個部位、飛機或分子等。在OpenGL中,必須根據(jù)少數(shù)幾個基本幾何圖元(geometric primitive)(如點、直線和多邊形)來創(chuàng)建你所需要的模型。當然,我們可以在OpenGL上創(chuàng)建能夠提供這些特性的高級函數(shù)庫。OpenGL 實用函數(shù)庫(GLU)提供了
23、許多建模特性,例如二次曲面以及NURBS曲線和表面。GLU是所有OpenGL實現(xiàn)的一個標準組成部分。1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了Windows NT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運行的大型3D圖形處理軟件也可以在微機上運用。1995年OpenGL的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能。1997年,Windows 95下3D游戲的大量涌現(xiàn),游戲開發(fā)公司迫切需要一個功能強大、兼容性好的3D圖形接口,而當時微軟公司自己的3D圖形接口DirectX 3.0功能卻是很糟糕。因而以制作雷神之錘等經(jīng)
24、典3D射擊游戲而著名的id公司同其它一些游戲開發(fā)公司一同強烈要求微軟在Windows95中加入對OpenGL的支持。微軟公司最終在Windows95的OSR2版和后來的Windows版本中加入了對OpenGL的支持。這樣,不但許多支持OpenGL的電腦3D游戲得到廣泛應用,而且許多在3D圖形設計軟件也可以運用支持OpenGL標準的3D加速卡,大大提高其3D圖形的處理速度。2003年的7月28日,SGI和ARB公布了OpenGL 1.5。OpenGL 1.5中包括OpenGL ARB的正式擴展規(guī)格繪制語言“OpenGL Shading Language”。2004年8月,OpenGL2.0版本發(fā)
25、布OpenGL 2.0標準的主要制訂者并非原來的SGI,而是逐漸在ARB中占據(jù)主動地位的3Dlabs。2008年8月初Khronos工作組在Siggraph 2008大會上宣布了OpenGL 3.0圖形接口規(guī)范,GLSL1.30 shader語言和其他新增功能將再次未來開放3D接口發(fā)展指明方向。2009年3月又公布了升級版新規(guī)范OpenGL 3.1,也是這套跨平臺免費API有史以來的第九次更新。2009年8月Khronos小組發(fā)布了OpenGL 3.2,這是一年以來OpenGL進行的第三次重要升級。Khronos旗下的OpenGL ARB(Architecture Review Board)工
26、作組推出了GLSL 1.5OpenGLShading Language(OpenGL著色語言)的升級版,以及在OpenGL3.2框架下推出了兩個新功能,可以讓開發(fā)者在開發(fā)新程序時能夠在使用流水線內(nèi)核(ni h)特性或兼容性特性之間做出選擇,其中兼容性特性會提供與舊版OpenGL之間的兼容性。2.2 OpenGL渲染(xunrn)管線過程管線這個術(shù)語用于描述一種過程,它涉及兩個或更多個獨特的階段或步驟(bzhu)。當應用程序進行OpenGL API 調(diào)用時,這些命令被放置在一個命令緩沖區(qū)中。這個緩沖區(qū)最終填滿了命令、頂點數(shù)據(jù)、紋理數(shù)據(jù)等。當緩沖區(qū)被刷新時,命令和數(shù)據(jù)就被傳遞給管線的下一個階段。通
27、常,頂點數(shù)據(jù)首先進行轉(zhuǎn)換和光照。在轉(zhuǎn)換階段,描述物體幾何形狀的點被重新計算,以確定這個物體的位置和方向。同時所進行的光照計算將確定每個頂點應該具有的顏色亮度。當這個階段完成之后,數(shù)據(jù)就被輸入到管線的光柵化部分。光柵階段根據(jù)幾何圖形、顏色和紋理數(shù)據(jù)實際創(chuàng)建彩色圖像。然后,圖像被放入幀緩沖區(qū)中。幀緩沖區(qū)就是圖形顯示設備的內(nèi)存,這意味著這幅圖像將會在屏幕上顯示。圖1顯示了OpenGL工作流程圖順序,雖然并沒有嚴格規(guī)定OpenGL必須采用這樣的實現(xiàn),但它卻提供了一個可靠的指南方向,可以預測OpenGL將以什么樣的順序來執(zhí)行這些操作。圖 SEQ 圖表 * ARABIC 1 Opengl工作渲染流程圖Op
28、enGL渲染管線的操作過程主要包括以下幾部分:1)頂點變換2)圖元組裝3)圖元處理4)片元處理5)光柵化操作2.2.1頂點變換這個階段主要是對輸入的頂點進行逐個處理,這些頂點都包括很多屬性(如位置、顏色、法線和紋理坐標等),經(jīng)過處理后,輸出是經(jīng)過變換后的頂點屬性及關(guān)聯(lián)信息。 主要過程:頂點變換(幾何變換和投影變換)、光照計算、紋理坐標變換和生成。2.2.2圖元組裝這個階段主要是按照輸入的變換后的頂點屬性和關(guān)聯(lián)信息,組裝形成圖元。2.2.3圖元處理(chl)這個階段主要是對輸入的圖元進行處理,輸出片元(幀緩存中更新象素屬性的數(shù)據(jù))信息,該片元信息是對頂點變換階段得出(d ch)的屬性進行插值處理
29、得到的。 主要過程(guchng):視景裁剪、背面剔除。2.2.4片元處理這個階段的輸入為經(jīng)過插值計算后的最終片元信息,經(jīng)過處理后,輸出信息為片元的深度和顏色值。 主要過程:紋理、霧化、顏色匯總(包括紋理顏色,光照顏色,主顏色等)。2.2.5光柵化操作這個階段的輸入為像素位置和片元的深度、顏色值等信息,經(jīng)過一系列的測試(剪切測試、Alpha測試、模板測試和深度測試)后形成像素的顏色。 主要過程:剪切測試、Alpha測試、模板測試和深度測試、寫入幀緩存。2.3 MFC概述MFC(Microsoft Foundation Class Library)中的各種類結(jié)合起來構(gòu)成了一個應用程序框架,它的目
30、的就是讓程序員在此基礎上來建立Windows下的應用程序,這是一種相對SDK來說更為簡單的方法。因為總體上,MFC框架定義了應用程序的輪廓,并提供了用戶接口的標準實現(xiàn)方法,程序員所要做的就是通過預定義的接口把具體應用程序特有的東西填入這個輪廓。Microsoft Visual C+提供了相應的工具來完成這個工作:AppWizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設計用戶接口;ClassWizard用來協(xié)助添加代碼到框架文件;最后,編譯,則通過類庫實現(xiàn)了應用程序特定的邏輯。 MFC是在1992年隨微軟的Microsoft C/C+ 7.0編譯器發(fā)布的,用于面向
31、16位Windows的軟件開發(fā)。起初,MFC是作為一個應用程序框架開發(fā)的,所以定名為Application FrameworkX (AFX)。 Borland幾乎同時發(fā)布了面向Turbo C編譯器的OWL,并且在一開始比MFC更具有市場占有率,但是在Borland發(fā)布了一個不向下兼容的應用程序框架之后,它喪失了很多市場份額;在Borland從微軟獲得發(fā)布MFC的授權(quán)之后它的市場份額進一步減少。Borland最終用Visual Component Library來作為OWL的后繼者。 隨著Visual Basic和Visual Studio .NET的發(fā)布,曾經(jīng)一度被微軟重點推薦的MFC被Vis
32、ual Basic、C#、Windows Forms搶走了不少市場份額,但是MFC繼續(xù)在非托管軟件開發(fā)中占據(jù)重要地位。在托管開發(fā)方面,MFC中也包括對Windows Forms和托管非托管互操作的封裝。微軟在Windows Vista和Windows 7發(fā)布之后在MFC中增加了對新的Windows API支持。 很多商用類庫在MFC的基礎上進一步實現(xiàn)了皮膚、漸變風格、多頂層窗口程序、屬性列表等較受歡迎的功能;同時,在C+在線社區(qū)中,很大一部分開放的源代碼也是基于MFC的。VC+產(chǎn)品版本與MFC版本如下:表格(biog) SEQ 表格(biog) * ARABIC 1 VC+產(chǎn)品(chnpn)版
33、本與MFC版本2.4 MFC 特點2.4.1封裝構(gòu)成MFC框架的是MFC類庫。MFC類庫是C+類庫。這些類或者封裝了Win32應用程序編程接口,或者封裝了應用程序的概念,或者封裝了OLE特性,或者封裝了ODBC和DAO數(shù)據(jù)訪問的功能,等等,分述如下:(1)對Win32應用程序編程接口的封裝;(2)對應用程序概念的封裝;(3)對COM/OLE特性的封裝;(4)對ODBC功能的封裝。2.4.2繼承首先,MFC抽象出眾多類的共同特性,設計出一些基類作為實現(xiàn)其他類的基礎。這些類中,最重要的類是CObject和CCmdTarget。CObject是MFC的根類,絕大多數(shù)MFC類是其派生的,包括CCmdT
34、arget。CObject 實現(xiàn)了一些重要的特性,包括動態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、對程序調(diào)試的支持,等等。所有從CObject派生的類都將具備或者可以具備CObject所擁有的特性。CCmdTarget通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。MFC中,任何可以處理消息的類都從CCmdTarget派生。 針對每種不同的對象,MFC都設計了一組類對這些對象進行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是CWnd;應用程序?qū)ο螅愂荂winThread;文檔對象,基類是Cdocument,等等。2.4.3虛擬函數(shù)和動態(tài)約束MFC以“C+
35、”為基礎,自然支持虛擬函數(shù)(hnsh)和動態(tài)約束。但是作為一個編程框架,有一個問題必須解決:如果僅僅通過虛擬函數(shù)來支持動態(tài)約束,必然導致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如,CWnd封裝 Windows窗口對象時,每一條Windows消息對應一個成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設計成虛擬函數(shù),由于數(shù)量太多,實現(xiàn)起來不現(xiàn)實。于是,MFC建立了消息映射機制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。2.5 應用程序的構(gòu)成(guchng)圖2解釋(jish)了該應用程序的結(jié)構(gòu)與對象,箭頭表示信息流向。圖 2 應用程序的結(jié)構(gòu)從CWinApp、CDocum
36、ent、CView、CMDIFrameWnd、CMDIChildWnd類對應地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五個類,這五個類的實例分別是應用程序?qū)ο蟆⑽臋n對象、視對象、主框架窗口對象和文檔邊框窗口對象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。對這些類或者對象解釋如下:(1)應用程序(CWinApp) 應用程序類派生于CWinApp。基于框架的應用程序必須有且只有一個應用程序?qū)ο螅撠煈贸绦虻某跏蓟⑦\行和結(jié)束。(2)邊框窗口(CMDIFrameWnd) 如果是SDI應用程序,從CFrameWnd類派生邊框窗口類,邊框窗口的客戶子窗口
37、(MDIClient)直接包含視窗口;如果是MDI應用程序,從CMDIFrameWnd類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含文檔邊框窗口。如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加CToolBar和CStatusBar類型的成員變量,以及在一個OnCreate消息處理函數(shù)中初始化這兩個控制窗口。 邊框窗口用來管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(SHIFT+F1模式)和打印預覽)。(3)文檔邊框窗口(CMDIChildWnd) 文檔邊框窗口類從CMDIChildWnd類派生,MDI應用程序使用文檔邊框窗口來包含
38、視窗口。(4)文檔(CDocument) 文檔類從CDocument類派生,用來管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過文檔實現(xiàn)的。視窗口通過文檔對象來訪問和更新數(shù)據(jù)。(5)視(CView) 視類從CView或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對文檔的操作。用圖的形式可直觀地表示所涉及的MFC類的繼承或者(huzh)派生關(guān)系,如下(rxi):圖 3 MFC的層次(cngc)2.6 基于OpenGL+MFC的三維模擬的編程環(huán)境配置用MFC調(diào)用OpenGL函數(shù)來進行三維模擬的編程環(huán)境配置:(一)創(chuàng)建MFC項目(1) 創(chuàng)建項目文件
39、:選擇File/New 菜單選項,建立一個名為MyTest 的單文檔 (SDI) 應用程序;(二)配置OpenGL開發(fā)環(huán)境(1)將91h,gluh,glauxh和gluth拷貝到(即盤符+路徑)Microsoft Visual StudioVC98IncludeGL目錄中;(2)將opengl321ib,glu321ib,glaux1ib和glut321ib拷貝到(即盤符+路徑)Microsoft Visual StudioVc98Lib目錄中;(3)將opengl32.dll,glu.dll,glu32.dll,glut.dll,glut32.dll文件拷貝到操作系統(tǒng)安裝目錄C:WINDOW
40、Ssystem32目錄下;(4)選擇Project/Setting 菜單選項。在Link欄的Lib輸入域中添加openg132.lib、glu32.lib,若需使用OpenGL的輔助庫函數(shù),則還需添加glaux.lib。到此,基于OpenGLMFC的開發(fā)環(huán)境(hunjng)就建立好。(三)初始化OpenGL具體(jt)編程步驟:第一步:修改(xigi)窗口風格設置。需要在函數(shù)CGLView:PreCreateWindow中增加對Windows窗口風格的設置,以防止在窗口重疊時把圖形繪制到子窗口和兄弟窗口。實現(xiàn)代碼如下:csstyle l=WS_CLIPCHILDREN WS CLIPSIBLI
41、NGS;第二步:設置像素格式。首先需要在視圖類CGLView中添加一個成員函數(shù),函數(shù)原型如下:BOOL CGLView:SetupPixelFormat(CDC*pDC);設置像素格式并向視圖類CGLView中添加兩個成員變量:CDC* m_pDC;OpenGL設備場境HGLRC m_hRC;OpenGL渲染場境在Windows中,使用結(jié)構(gòu)PIXELFO腿ATDEscRIPTOR來設置像素格式,并提供ChoosePixelFormat()函數(shù)來選擇最為匹配的像素格式以及SetPixelFormat()函數(shù)來為設備場境設置像素格式。設置像素格式的步驟如下:a.填寫結(jié)構(gòu)PIXELFORMATDES
42、CRIPTOR,像素格式是用這個結(jié)構(gòu)來描述的。b.調(diào)用函數(shù)ChoosePixelFormat(),將填寫好的像素格式結(jié)構(gòu)傳遞給該函數(shù),函數(shù)ChoosePixelFormat()返回一個整型的序號。這個序號標識一個當前設備場境中所能提供的,且與所要求的像素格式最為匹配的像素格式。c將這個返回的像素格式序號傳遞給函數(shù)SetPixelFormat(),使之設置成為當前設備場境的像素格式。第三步:創(chuàng)建渲染場境。用wglreatecontext()函數(shù)來創(chuàng)建OpenGL的一個渲染場境;用wglMakeCurrent()函數(shù)使給定的渲染場境設置成為當前調(diào)用線程的渲染場境,而線程中隨后調(diào)用的OpenGL命令
43、都將通過與該渲染場境相關(guān)聯(lián)的設備場境來實現(xiàn)窗口的場景繪制。具體實現(xiàn)代碼如下:HDC m hDC;HGLRC nl hglRC:m_hglRC=wglCreateContext(m_hDC);創(chuàng)建一個渲染場境wglMakecurrent(m_hDC,m hglRC);使成為當前調(diào)用線程的渲染場境第四步:添加消息處理函數(shù)。利用MFC ClassWizard為CGLView類添加消息:帳_CREATE、wM_DESTROY、m,t_SIZE和刪_TIMER的響應函數(shù),消息處理函數(shù)名依次為:OnCreate()、onDestroy()、OnSize()和OnTimer()。ACGLView:OnCre
44、ate()函數(shù)該函數(shù)完成的功能是:在視圖窗口創(chuàng)建完成后,進行OpenGLWindows的初始化工作。(四)清理工作CGLView:OnDestroy()函數(shù)該函數(shù)完成的功能是:在視圖窗口被釋放時,用于清除當前的渲染場境,并釋放設備場境。具體實現(xiàn)代碼如下:wglMakeCurrent(NULL,NULL);wglDeleteContext(m_hglRC);清除渲染場境:ReleaseDC(m_hWnd,m_hDC);釋放(shfng)設備場境CCGLView:OnSize()函數(shù)(hnsh)DCGLView:OnTimer()函數(shù)(hnsh)該函數(shù)完成的功能是:通過定時器每隔一定時間的消息驅(qū)動
45、,來實現(xiàn)動態(tài)的場景更新。3 拾取(shq)技術(shù)拾取(shq)算法的研究可大致分為兩類:一類是基于三維空間的射線拾取算法,代表(dibio)算法就是基于CPU的射線求交拾取技術(shù);另一類是基于圖像空間的拾取算法,例如:基于GPU的重繪式拾取技術(shù)。3.1 基于射線求交拾取技術(shù)其基本原理是:獲取屏幕坐標并轉(zhuǎn)換成圖形系統(tǒng)的視口坐標,根據(jù)不同圖形API(應用程序編程接口)的實現(xiàn)給該點加上適當?shù)纳疃戎?如OpenGL標準的深度值介于0-1),反算出該拾取點的世界空間坐標,將相機焦點坐標轉(zhuǎn)換為屏幕坐標,過相機位置點向鼠標選中點作一條射線在三維空間中對射線和物體進行求交,離相機位置點最近的實體就是被選中的實體。
46、算法的具體實現(xiàn)步驟如下:(1)初始化,獲取鼠標點的屏幕坐標(x,y),并將相機焦點坐標轉(zhuǎn)換為屏幕坐標;(2)相機焦點深度值(z值)作為鼠標點的深度值(z值),并將鼠標點坐標轉(zhuǎn)化為世界坐標(XW ,YW ,ZW);(3)過相機位置點向點(XW,YW,ZW)作一射線m,并分別求射線m 和投影空間近截面和遠截面的交點A,B,得到線段AB。如果射線m垂直于視線,則射線m和投影空間不相交;(4)依次取出場景實體列表中的每個實體,獲取該實體的轉(zhuǎn)換矩陣,并利用該矩陣將A、B點的坐標轉(zhuǎn)換為局部坐標;(5)計算實體的包圍盒,并判斷AB和包圍盒的相對位置。如果AB和包圍盒相交,則求該實體和AB交點的參數(shù)值,并將該
47、實體標記為選中對象。如不相交,則進行下一個實體的處理。在上述算法中,判斷線段AB和實體包圍盒的相對位置及線段AB和實體的求交是算法實現(xiàn)的關(guān)鍵。為了提高拾取速度,對傳統(tǒng)的包圍盒算法和求交算法進行了改進。3.1.1判斷線段和包圍盒的相對位置實體的最大包圍盒是一個各表面平行于坐標平面的六面體,其左下頂點的x、y、z坐標值為實體所有頂點相應坐標值的最小值,其右上頂點的坐標值為實體所有頂點相應坐標值的最大值。采用向量法來判斷線段和包圍盒相對位置,該算法的基本思想為:將線段看成一個由起點指向終點的向量,求向量各分量和離起點最近的三個包圍盒側(cè)面所在平面的交點,如果各分量與平面的交點都在包圍盒側(cè)面上或者在包圍
48、盒內(nèi)且在各分量上,則該線段和包圍盒相交(本文中我們把線段與包圍盒相交和線段在包圍盒內(nèi)這兩種情況統(tǒng)稱為相交)。判斷線段與包圍盒相對位置的具體步驟如下:(1)判斷起點A是否在包圍盒內(nèi),如果在盒內(nèi),則線段AB和包圍盒相交,判斷結(jié)束;如果不在盒內(nèi),則記下該包圍盒離起點A最近的三個側(cè)面,這三個側(cè)面必定共點且相互垂直;(2)過起點A向各側(cè)面做垂線,得到三個垂足,連接點A和各垂足,得到三個向量a1、a2、a3(如圖4所示),并求a1、a2、a3和向量AB各相應分量的比值ti=ai/AB(i=1,2,3)。如果AB的某個分量為零,則比值取-1。取t1、t2、t3中的最大值為tmax,如果tmax1,則AB和包
49、圍盒不相交,判斷結(jié)束;(3)根據(jù)(gnj)tmax值求出交點坐標,判斷交點是否(sh fu)在包圍盒上。(此處最好給出交點坐標的計算式,以及交點是否在包圍(bowi)盒上的判斷算式。)如果交點在盒上,則AB和包圍盒相交,否則,AB和包圍盒相離。圖 4 線段AB 和包圍盒的位置關(guān)系圖判斷線段與包圍盒相對位置的算法流程如圖5所示。圖 5 向量法判斷線段和包圍盒相對位置算法流程圖根據(jù)拾取(shq)對象的不同,線段和相關(guān)對象求交的方法和過程存在(cnzi)差別。設要和拾取對象求交的線段為AB,針對不同(b tn)的情況,下面對兩種求交過程分別加以描述。(1)拾取對象為點當拾取對象為點時,求交的實質(zhì)就是
50、以AB為軸線,以一個很小的浮點數(shù)tolerance(tolerance一般小于0.001)為半徑做一個圓柱,在這個圓柱內(nèi)離視點最近的點就是所求的交點。具體做法是將實體的每一個頂點向AB投影,并求出投影點在線段AB上的參數(shù)坐標。在0到1的范圍內(nèi),參數(shù)坐標的值越小,說明該點離視點越近。如果我們發(fā)現(xiàn)了某個實體頂點比當前的最近點離視點更近且該點到AB所在直線的距離小于tolerance,則把該點記錄為當前的最近點。當所有的點處理完畢,當前的最近點就是該實體和線段AB的交點。(2)拾取對象為直線或復合線復合線一般指由多個直線段相連接所構(gòu)成的單元體,在本文所述的三維圖形瀏覽器系統(tǒng)中,曲線如NURBS曲線、
51、圓弧等都存儲為復合線的形式。對于線狀圖元,比較常用的方法是通過計算點線距離來進行拾取,這種方法簡單易懂,易于實現(xiàn)。但當拾取曲線、復雜折線等圖元時,計算量會非常大。為此提出一種新的改進算法,其具體操作步驟如下:以拾取點為中心、兩倍拾取精度(在本文中拾取精度一般為象素寬度的25倍)為邊長,繪制一個以背景色為填充色的正方形作為“測試窗口”。 如圖6所示圖 6 測試窗口重繪圖形對象。如果圖元進入拾取范圍,則必然在“測試區(qū)”中留下軌跡,重繪圖形對象的目的是為了恢復可能被“測試窗口”遮蔽的圖形對象。循環(huán)讀取“測試窗口”中象素點顏色。當發(fā)現(xiàn)象素點顏色有別于背景色時,終止讀點,標識拾取成功。若未發(fā)現(xiàn)有別于背景
52、色的象素點時,則繼續(xù)進行下一個圖元的檢測。如圖7所示圖 7 測試區(qū)中的軌跡3.2 基于GPU的重繪式拾取技術(shù)基本思路:重繪式拾取法是在OpenGL繪圖模式下,通過2次繪圖來拾取并顯示物體。第1次繪圖為虛擬繪圖,通過在OpenGL幀緩存中繪制一些輔助圖形來幫助選取物體。這些輔助圖形對于系統(tǒng)使用者是不可見的,因此在確定所選物體之后要將輔助圖形從幀緩存中清除掉才能進行第2次繪圖。第2次繪圖為實際繪圖,所繪圖形為系統(tǒng)(xtng)使用者看到的真實圖形。在GPU上實現(xiàn)三維圖元拾取的方法有兩種,第一種方法與場景幾何(j h)無關(guān),第二種方法是場景幾何依賴。下面(xi mian)介紹第一種方法:場景幾何無關(guān)方
53、法的應用一直受到限制:它需要GPU的可編程能力,需要ShaderModel2.0和浮點型紋理支持;其次是因為每次出發(fā)拾取程序的時候都要在后臺繪制一張表面,等同于重復繪制了兩次場景,不適合頻繁連續(xù)的拾取動作。該方法的核心是把圖元的幾何信息、指針等相關(guān)信息作為它的顏色渲染到后臺的一張Render Target型表面上對應幀緩沖做一次特殊的“渲染”。在渲染后只要讀取表面上相應像素坐標的顏色值就可以得知它相對應圖元的信息。整個算法分為在CPU上和在GPU上的兩部分。在CPU上C+程序的任務是建立一個后臺的表面,然后調(diào)用GPU上的程序?qū)ξ矬w進行特殊的RTT(Rallderto Texture,渲染到紋理
54、),再根據(jù)渲染結(jié)果讀取表面某坐標的顏色并還原信息。具體實現(xiàn)時考慮到紋理有pow of two和nonpow of two之別,屏幕分辨率一般不為pow of two,因此可以考慮采用渲染到表面(RRS),用Direct3D9中的CreateRenderTarget()創(chuàng)建一個Render Target型表面,CPU上的主要流程如下:鼠標點擊拾取事件觸發(fā)下面流程:(1)建立一張新的臨時紋理;(2)將當前設備屏幕的內(nèi)容存入緩沖中,將設備的渲染對象設為該臨時紋理;(3)做好渲染前的準備,包括從fx文件中讀入effect;(4)對于每個幾何對象在GPU通過Shader進行特殊渲染;(5)還原設備信息,
55、設備的渲染對象指向幀緩沖;(6)獲取臨時紋理上拾取區(qū)域的像素;(7)將獲得的像素按定義的格式解碼。圖8說明了上述整個流程。圖 8 GPU拾取流程下面定義(dngy)Vertex Shader的輸出內(nèi)容,定義了一個包括坐標和顏色的結(jié)構(gòu)(struct)。其中,pos用于頂點轉(zhuǎn)換,color用于頂點信息存儲。Struct VSResultFloat4 pos:POSITION;Float4 color:TEXCOORDO;在Vertex Shader中,輸入某點的局部坐標,把坐標的值編碼成一個顏色的RGB值后作為輸出顏色的RGB值,同時將輸入坐標向量左乘世界矩陣、觀察矩陣、投影矩陣后得到最終(zu
56、zhn)輸出的坐標值。在Pixel Shader中,將物體指針信息作為顏色的Alpha值,加上Vertex Shader輸出的顏色,輸出為最終的渲染顏色。在單個幾何圖元中,不同頂點有不同的坐標,在Vertex Shader中,根據(jù)坐標信息進行(jnxng)頂點轉(zhuǎn)換,同時將坐標信息作為顏色值存入VSResult中。主要如下:VSResult Vs_main float3 pos:POSITION VSResult ret;ret.color=float4(pos,1.of);float4 worldpos=mul(float4(pos,1),worldmatrix);ret.pos=mul(wo
57、rldpos,ViewProjection);return ret;對于ret.color,前3個RGB值表示輸入的位置坐標;而第4個Alpha值用作存儲其他信息,暫時填入1.Of,后文將填充圖元的指針。3.3 各種拾取技術(shù)比較 各種拾取技術(shù)比較表如下:表 2 各種拾取技術(shù)比較原理優(yōu)點局限性OpenGL的選擇機制先把場景畫進幀緩沖,然后進入選擇模式并重新繪制這個場景。當退出選擇模式時,OpenGL返回一個圖元(premitives)清單,圖元可能被視見體(viewing volume)分割。每個被視見體圖元引出一資選擇命中(hit)。確切的說,圖元清單是作為一個取整數(shù)值的名字(integer-
58、valued names)數(shù)組和相關(guān)的數(shù)據(jù)命中記錄(hit record)對應名字棧(name stack)的當前內(nèi)容。當在選擇模式下發(fā)布圖元繪制命令時向名字棧中加入名字就可建立起名字棧。當名字清單被返回后,可以用它來確定屏幕上的哪個圖元可能被用戶選中了。此算法簡單名字堆棧容量有限,不能處理大規(guī)模場景中的拾取。射線拾取方法獲取屏幕坐標并轉(zhuǎn)換成圖形系統(tǒng)的視口坐標,根據(jù)不同圖形API(應用程序編程接口)的實現(xiàn)給該點加上適當?shù)纳疃戎?如OpenGL標準的深度值介于0-1),反算出該拾取點的世界空間坐標,并由視點向此點引一條射線,在三維空間中對射線和物體進行求交。對拾取對象為點或簡單的選擇體較為方便,
59、速度快。(1)因它假設所有的圖形變換矩陣必須可逆,經(jīng)過一系列的逆運算可得到圖像空間某點的三維坐標,但實際上這些矩陣并非總是可逆;(2)對于復雜的選擇體,判斷物體是否在選擇體內(nèi)部的算法極其復雜。從而使整個處理過程耗時巨大,且如此復雜的算法也會給整個系統(tǒng)的實現(xiàn)帶來一定難度。重繪式拾取法在OpenGL繪圖模式下,通過2次繪圖來拾取并顯示物體。第1次繪圖為虛擬繪圖,通過在OpenGL幀緩存中繪制一些輔助圖形來幫助選取物體。這些輔助圖形對于系統(tǒng)使用者是不可見的,因此在確定所選物體之后要將輔助圖形從幀緩存中清除掉才能進行第2次繪圖。第2次繪圖為實際繪圖,所繪圖形為系統(tǒng)使用者看到的真實圖形。(1)沒有采用O
60、penGL選擇機制。整個拾取過程都在OpenGL的繪圖模式下完成,因此不必要為每個物體命名。同時,避免了在繪圖模式與選擇模式之間的切換;(2)靈活的拾取范圍,可以定義各種形態(tài)的框選,如圓形,方形;(3)算法簡單,容易實現(xiàn),且容易遷移到GPU上,利用硬件加速拾取算法。依賴于硬件,與GPU的性能息息相關(guān)4 系統(tǒng)(xtng)的設計(shj)及實現(xiàn)(shxin)有些圖形應用程序只繪制兩維和三維物體構(gòu)成的靜態(tài)圖形,另一些允許用戶識別屏幕上的物體并移動、修改、刪除或用其它方法操縱這些物體。OpenGL正是設計用于支持這些交互式應用程序的。因為繪制在屏幕上的物體通常經(jīng)過多次旋轉(zhuǎn)、移動和透視變換,所以確定用戶
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水情監(jiān)測系統(tǒng)施工方案
- 童車產(chǎn)品研發(fā)項目管理與團隊協(xié)作考核試卷
- 窗簾布藝的數(shù)字化生產(chǎn)模式創(chuàng)新與實施考核試卷
- 云浮駁岸聯(lián)鎖塊施工方案
- 電梯控制系統(tǒng)與智能化技術(shù)考核試卷
- 石油化工專用儀器與工藝考核試卷
- 礦山機械模擬仿真與實驗技術(shù)考核試卷
- 塔吊黑匣子施工方案
- 私募股權(quán)投資多元化策略與實踐考核試卷
- 紙板容器生產(chǎn)線優(yōu)化配置考核試卷
- IC反應器的設計11
- IEEE-30節(jié)點全套數(shù)據(jù)2
- 數(shù)學-山東省名校考試聯(lián)盟2023-2024學年高一下學期5月期中檢測試題和答案
- 敦煌的藝術(shù)-知到答案、智慧樹答案
- 2024糖尿病酮癥酸中毒診斷和治療課件
- 妊娠期糖尿病產(chǎn)后護理
- 老撾萬象鉀礦百萬噸級規(guī)模氯化鉀開發(fā)項目可行性分析研究的開題報告
- 編輯打印新課標高考英語詞匯表3500詞
- 2023年湖南省煙草專賣局(公司)真題
- 22G101基礎平法識圖與鋼筋計算
- 2024年專升本考試-專升本考試(機械設計基礎)筆試歷年真題薈萃含答案
評論
0/150
提交評論