版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1 / 32論文題目: 基于 OpenGL 的屏幕對象拾取 II / 32畢業(yè)論文(設(shè)計(jì))原創(chuàng)性聲明畢業(yè)論文(設(shè)計(jì))原創(chuàng)性聲明本人所呈交的畢業(yè)論文(設(shè)計(jì))是我在導(dǎo)師的指導(dǎo)下進(jìn)行的研究工作與取得的研本人所呈交的畢業(yè)論文(設(shè)計(jì))是我在導(dǎo)師的指導(dǎo)下進(jìn)行的研究工作與取得的研究成果。據(jù)我所知,除文中已經(jīng)注明引用的容外,本論文(設(shè)計(jì))不包含其他個人已究成果。據(jù)我所知,除文中已經(jīng)注明引用的容外,本論文(設(shè)計(jì))不包含其他個人已經(jīng)發(fā)表或撰寫過的研究成果。對本論文(設(shè)計(jì))的研究做出重要貢獻(xiàn)的個人和集體,經(jīng)發(fā)表或撰寫過的研究成果。對本論文(設(shè)計(jì))的研究做出重要貢獻(xiàn)的個人和集體,均已在文中作了明確說明并表示意。均已在
2、文中作了明確說明并表示意。 作者簽名:作者簽名: 日期:日期:畢業(yè)論文(設(shè)計(jì))授權(quán)使用說明畢業(yè)論文(設(shè)計(jì))授權(quán)使用說明本論文(設(shè)計(jì))作者完全了解本論文(設(shè)計(jì))作者完全了解*學(xué)院有關(guān)保留、使用畢業(yè)論文(設(shè)計(jì))學(xué)院有關(guān)保留、使用畢業(yè)論文(設(shè)計(jì))的規(guī)定,學(xué)校有權(quán)保留論文(設(shè)計(jì))并向相關(guān)部門送交論文(設(shè)計(jì))的電的規(guī)定,學(xué)校有權(quán)保留論文(設(shè)計(jì))并向相關(guān)部門送交論文(設(shè)計(jì))的電子版和紙質(zhì)版。有權(quán)將論文(設(shè)計(jì))用于非贏利目的的少量復(fù)制并允許論子版和紙質(zhì)版。有權(quán)將論文(設(shè)計(jì))用于非贏利目的的少量復(fù)制并允許論文(設(shè)計(jì))進(jìn)入學(xué)校圖書館被查閱。學(xué)校可以公布論文(設(shè)計(jì))的全部或文(設(shè)計(jì))進(jìn)入學(xué)校圖書館被查閱。學(xué)??梢?/p>
3、公布論文(設(shè)計(jì))的全部或部分容。的論文(設(shè)計(jì))在解密后適用本規(guī)定。部分容。的論文(設(shè)計(jì))在解密后適用本規(guī)定。 作者簽名:作者簽名: 指導(dǎo)教師簽名:指導(dǎo)教師簽名:日期:日期: 日期:日期:注意事項(xiàng)1.設(shè)計(jì)(論文)的容包括:1)封面(按教務(wù)處制定的標(biāo)準(zhǔn)封面格式制作)III / 322)原創(chuàng)性聲明3)中文摘要(300 字左右) 、關(guān)鍵詞4)外文摘要、關(guān)鍵詞5)目次頁(附件不統(tǒng)一編入)6)論文主體部分:引言(或緒論) 、正文、結(jié)論7)參考文獻(xiàn)8)致9)附錄(對論文支持必要時(shí))2.論文字?jǐn)?shù)要求:理工類設(shè)計(jì)(論文)正文字?jǐn)?shù)不少于 1 萬字(不包括圖紙、程序清單等) ,文科類論文正文字?jǐn)?shù)不少于 1.2 萬字
4、。3.附件包括:任務(wù)書、開題報(bào)告、外文譯文、譯文原文(復(fù)印件) 。4.文字、圖表要求:1)文字通順,語言流暢,書寫字跡工整,打印字體與大小符合要求,無錯別字,不準(zhǔn)請他人代寫2)工程設(shè)計(jì)類題目的圖紙,要求部分用尺規(guī)繪制,部分用計(jì)算機(jī)繪制,所有圖紙應(yīng)符合國家技術(shù)標(biāo)準(zhǔn)規(guī)。圖表整潔,布局合理,文字注釋必須使用工程字書寫,不準(zhǔn)用徒手畫3)畢業(yè)論文須用 A4 單面打印,論文 50 頁以上的雙面打印4)圖表應(yīng)繪制于無格子的頁面上5)軟件工程類課題應(yīng)有程序清單,并提供電子文檔5.裝訂順序1)設(shè)計(jì)(論文)2)附件:按照任務(wù)書、開題報(bào)告、外文譯文、譯文原文(復(fù)印件)次序裝訂3)其它目錄目錄摘要 1ABSTRACT
5、21 緒論 31.1 課題的目的和意義 3IV / 3 拾取技術(shù)國外研究拾取技術(shù)國外研究拾取技術(shù)國外研究 31.3 本論文研究主要容 32 基于 OPENGLMFC 的建?;A(chǔ) 52.1 OpenGL 概括 52.2 OpenGL 渲染管線過程 52.2.1 頂點(diǎn)變換 62.2.2 圖元組裝 62.2.3 圖元處理 62.2.4 片元處理 62.2.5 光柵化操作 62.3 MFC 概述 62.4 MFC 特點(diǎn) 72.4.1 封裝 72.4.2 繼承 82.4.3 虛擬函數(shù)和動態(tài)約束 82.5 應(yīng)用程序的構(gòu)成 82.6 基于 OpenGL+MFC 的三維模擬的編程環(huán)境配置
6、93 拾取技術(shù) 123.1 基于射線求交拾取技術(shù) 123.1.1 判斷線段和包圍盒的相對位置 123.2 基于 GPU 的重繪式拾取技術(shù) 143.3 各種拾取技術(shù)比較 164 系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 184.1 系統(tǒng)的選擇機(jī)制 184.1.1 進(jìn)入選擇模式之前 184.1.2 獲取當(dāng)前選擇模式 184.1.3 退出選擇模式 204.1.4 拾取 204.2 拾取結(jié)果截圖 215 結(jié)論與展望 255.1 結(jié)論 255.2 展望 25參考文獻(xiàn) 26致 281 / 32摘要摘要屏幕對象的拾取是計(jì)算機(jī)圖形處理系統(tǒng)中一個重要的功能,在許多情況下,計(jì)算機(jī)圖形處理系統(tǒng)不僅要繪制圖形,而且要允許操作者能夠通過輸入設(shè)
7、備(通常是鼠標(biāo))操縱屏幕上的物體(標(biāo)識、移動和修改)。有時(shí)還需要獲取物體上點(diǎn)的空間坐標(biāo)或測量物體的幾何特性如距離、角度、半徑等,這些操作都需要以拾取作為實(shí)現(xiàn)的基礎(chǔ)。OpenGL 為了解決拾取問題,提供了一種基于名字堆棧和命中記錄的選擇機(jī)制。在 OpenGL 中,拾取物體是利用拾取矩陣和投影變換,將拾取的圍限制在鼠標(biāo)熱點(diǎn)的有效區(qū)中,一旦觸發(fā)鼠標(biāo)事件就進(jìn)入選擇模式并將有效區(qū)初始化,最后利用拾取矩陣拾取有效區(qū)的物體。有效區(qū)的定義由 glPick2Matix()函數(shù)來完成。一旦拾取成功,就以記錄的形式返回與拾取物體相關(guān)的信息,并生成一個記錄表示一個物體被命中。這種物體拾取方法非常簡單,不需要寫很多代碼
8、。在使用 OpenGL 工具包開發(fā)圖形處理系統(tǒng)時(shí),物體的拾取有多種方法,其中包括 OpenGL 提供的選擇機(jī)制、射線拾取法、重繪式拾取法等。本文采用 OpenGL 本身提供的選擇機(jī)制來拾取對象,突出 OpenGL 工具包在屏幕對象的拾取方面的優(yōu)勢。關(guān)關(guān) 鍵鍵 詞:詞:OpenGL;計(jì)算機(jī)應(yīng)用;拾取算法2 / 32AbstractAbstractIn most cases, one important feature of graphics processing system is picking, which allow users to select objects by mouse, an
9、d to modify the their attributes, such as gemetry mesh or angle and so 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 th
10、e mouse, effective once entered the mouse event trigger mode choice and 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 re
11、levant information, and to create a record, says an object to be hit. 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
12、type gather method, etc. Based on the mechanism of OpenGL itself to provide choice pickup, outstanding OpenGL toolkit objects in the screen in the object.KeyKey words:words: OpenGL; computer application;picking3 / 321 1 緒論緒論目前許多優(yōu)秀的圖形工具能為我們繪制惟妙惟肖的虛擬現(xiàn)實(shí)場景,在面對這些場景時(shí)候我們除了欣賞之外更多的是希望能與之互動,做為編程人員可以使用代碼輕松的重新構(gòu)
13、造場景,但對于終端用戶而言,他們也希望自己也能對造場景進(jìn)行一些操作,如添加,刪除等等。對于這些操作而言,首先我們要做的是能讓用戶使用鼠標(biāo)來選擇他所希望操作的對象,這就是本文要討論的一個重點(diǎn):拾取,這是一種在許多交互性程序中有基礎(chǔ)地位的操作,是對屏幕中對象進(jìn)行定位,并確定所選擇的是哪個物體。然而該操作給我們提出了一些難題,首先,需要對對象進(jìn)行屆定。其次,必須對“拾取目標(biāo)”進(jìn)行定義。這就需要終端用戶確定單擊的位置是構(gòu)成對象的圖元上,還是對象附近的位置以與考慮如果選取點(diǎn)落在兩個以上物體交集部分如何處理等等問題,本文利用了 OpenGL 中的選擇模式進(jìn)行有效的對象判別和拾取。1.11.1 課題的目的和
14、意義課題的目的和意義圖形對象的拾取是計(jì)算機(jī)圖形處理系統(tǒng)中一個重要的功能,很多圖形系統(tǒng)需要用戶通過輸入設(shè)備與系統(tǒng)交互,如移動、旋轉(zhuǎn)某個物體,或查詢某個物體的狀態(tài)信息,需要通過拾取來確定景中的操作對象??焖倏煽康氖叭”粡V泛地運(yùn)用于各種系統(tǒng)中,如實(shí)時(shí)圖形系統(tǒng)、虛擬現(xiàn)實(shí)、游戲和 CAD系統(tǒng)等方面,拾取操作己成為這些系統(tǒng)的重要部分,它在計(jì)算機(jī)建模軟件尤其重要,能夠通過拾取操作對模型進(jìn)行局部修改和編輯,提高建模系統(tǒng)的靈活性和適用性。隨著計(jì)算機(jī)軟硬件的快速發(fā)展,人們對實(shí)時(shí)系統(tǒng)的交互的實(shí)時(shí)性要求也越發(fā)苛刻,而且三維場景復(fù)雜度也日益提高,這就要求系統(tǒng)提供快速的拾取操作。因此,高效的拾取算法能夠決定拾取操作快與慢
15、的關(guān)鍵所在,從而開發(fā)高效的拾取算法已成為當(dāng)今一個的課題研究。1 1.2.2 拾取技術(shù)國外研究拾取技術(shù)國外研究隨著網(wǎng)絡(luò)科技越來越發(fā)達(dá),拾取操作也越來越方便了,有的只要鼠標(biāo)點(diǎn)點(diǎn)就可以。而拾取操作的關(guān)鍵是拾取算法。到目前為止,拾取算法大致上可以分三種。第一種是基于射線求交的拾取技術(shù),1992 年,Mark Segul,Carl Korobkin,Rolf van Widenfelt 等人首次采用了基于射線求交的拾取技術(shù)原理實(shí)現(xiàn)了對衣服的拾取1;1998 年 Michael Deering,Step hanie Winner and Bic Schediwy 等也才采用了同樣的技術(shù)成功做到了人物的拾取
16、2;2005 年,龔堰玨,顏敏等人采用了基于射線求交的拾取技術(shù)實(shí)現(xiàn)對幾個簡單物體的拾取3;同年,韋宇煒也是用此技術(shù)實(shí)現(xiàn)對游戲中各類的拾取,如對技能的釋放,對地上物品的撿起來,對別的玩家人物屬性的查看等等4;2006年,繼權(quán),曉豁等人也采用了這種拾取技術(shù)成功地做到了對 3D 網(wǎng)游游戲中的各種各樣的拾取5,等等。第二種是基于 GPU 的重繪式拾取技術(shù),這種方法對硬件的依賴性大,不過拾取速度快。1997年,MasaakiOka,Kyoya Tsutsui,Akio Ohba 等人第一次采用了基于 GPU 的重繪式拾取技術(shù)在房子中拾取到了房子主人與小孩子6;2006 年,力強(qiáng),周明全等多人采用基于 G
17、PU 的重繪式拾取技術(shù),在大規(guī)模室外地形中拾取到了地面某個區(qū)域7。第三種是 OpenGL 自帶的拾取機(jī)制,1992 年 7月,SGI 公司發(fā)布了 OpenGL 的 1.0 版本,隨后又與微軟公司共同開發(fā)了 Windows NT 版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行的大型 3D 圖形處理軟件也可以在微機(jī)上運(yùn)用。1995 年 OpenGL 的 1.1 版本面市,該版本較 1.0 性能提高許多,并加入了一些新的功能,如本身自帶的拾取機(jī)制,這項(xiàng)功能使 OpenGL 在各個領(lǐng)域都得到了應(yīng)用8。隨后出現(xiàn)的各個版本,使自帶的拾取機(jī)制越來越完善,操作越來越方便,應(yīng)用圍越來越廣泛。1.3
18、1.3 本文本文研究的主要容研究的主要容(一):綜述本課題研究的意義以與國外研究現(xiàn)狀;(二):介紹了 OpenGL 與 OpenGL 渲染管道,分析 MFC 編程框架和基于 OpenGL+MFC 的三維模擬的編程環(huán)境配置;(三):各種拾取技術(shù)的實(shí)現(xiàn)原理,優(yōu)缺點(diǎn);(四):采用了 OpenGL 本身自帶的拾取機(jī)制設(shè)計(jì)并實(shí)現(xiàn)簡單的拾取操作;4 / 32(五):總結(jié)本文并進(jìn)一步給出了展望。5 / 322 2 基于基于 OpenGLOpenGLMFCMFC 的建?;A(chǔ)的建?;A(chǔ)2.12.1 OpenGLOpenGL 概括概括OpenGL(全寫 Open Graphics Library)是個定義了一個跨
19、編程語言、跨平臺的編程軟件接口的規(guī)格,該接口包括了大約 250 個不同的函數(shù)(其中核心 OpenGL 大約包括 200 個函數(shù),另外還有50 個左右位于 OpenGL 工具函數(shù)庫) ,可以用這些函數(shù)指定物體和操作,創(chuàng)建交互性三維應(yīng)用程序。它是個專業(yè)的圖形程序接口,是一個功能強(qiáng)大,調(diào)用方便的底層圖形庫,Opengl 用于三維圖象(二維的亦可) 。OpenGL 的設(shè)計(jì)目標(biāo)就是作為一種流線型的、獨(dú)立于硬件的接口,可以在許多不同的硬件平臺上實(shí)現(xiàn)。為了實(shí)現(xiàn)這個目標(biāo),OpenGL 并未包含用于執(zhí)行窗口任務(wù)或者獲取用戶輸入之類的函數(shù)。反之,必須通過窗口系統(tǒng)控制所使用的特定硬件。類似地,OpenGL 并沒有提
20、供用于描述三維物體模型的高層函數(shù)。這類函數(shù)可能允許你指定相對較為復(fù)雜的形狀,例如汽車、身體的某 個部位、飛機(jī)或分子等。在 OpenGL 中,必須根據(jù)少數(shù)幾個基本幾何圖元(geometric primitive) (如點(diǎn)、直線和多邊形)來創(chuàng)建你所需要的模型。當(dāng)然,我們可以在 OpenGL 上創(chuàng)建能夠提供這些特性的高級函數(shù)庫。OpenGL 實(shí)用函數(shù)庫(GLU)提供了許多建模特性,例如二次曲面以與 NURBS 曲線和表面。GLU 是所有 OpenGL 實(shí)現(xiàn)的一個標(biāo)準(zhǔn)組成部分。1992 年 7 月,SGI 公司發(fā)布了 OpenGL 的 1.0 版本,隨后又與微軟公司共同開發(fā)了 Windows NT版本
21、的 OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行的大型 3D 圖形處理軟件也可以在微機(jī)上運(yùn)用。1995 年 OpenGL 的 1.1 版本面市,該版本較 1.0 性能提高許多,并加入了一些新的功能。1997 年,Windows 95 下 3D 游戲的大量涌現(xiàn),游戲開發(fā)公司迫切需要一個功能強(qiáng)大、兼容性好的 3D 圖形接口,而當(dāng)時(shí)微軟公司自己的 3D 圖形接口 DirectX 3.0 功能卻是很糟糕。因而以制作雷神之錘等經(jīng)典 3D 射擊游戲而著名的 id 公司同其它一些游戲開發(fā)公司一同強(qiáng)烈要求微軟在Windows95 中加入對 OpenGL 的支持。微軟公司最終在 Windows95 的
22、 OSR2 版和后來的 Windows 版本中加入了對 OpenGL 的支持。這樣,不但許多支持 OpenGL 的電腦 3D 游戲得到廣泛應(yīng)用,而且許多在 3D 圖形設(shè)計(jì)軟件也可以運(yùn)用支持 OpenGL 標(biāo)準(zhǔn)的 3D 加速卡,大大提高其 3D 圖形的處理速度。2003 年的 7 月 28 日,SGI 和 ARB 公布了 OpenGL 1.5。OpenGL 1.5 中包括 OpenGL ARB 的正式擴(kuò)展規(guī)格繪制語言“OpenGL Shading Language” 。2004 年 8 月,OpenGL2.0 版本發(fā)布 OpenGL 2.0 標(biāo)準(zhǔn)的主要制訂者并非原來的 SGI,而是逐漸在 ARB
23、 中占據(jù)主動地位的 3Dlabs。2008 年 8 月初 Khronos 工作組在 Siggraph 2008 大會上宣布了 OpenGL 3.0 圖形接口規(guī),GLSL1.30 shader 語言和其他新增功能將再次未來開放 3D 接口發(fā)展指明方向。2009 年 3 月又公布了升級版新規(guī) OpenGL 3.1,也是這套跨平臺免費(fèi) API 有史以來的第九次更新。2009 年 8 月 Khronos 小組發(fā)布了 OpenGL 3.2,這是一年以來 OpenGL 進(jìn)行的第三次重要升級。Khronos 旗下的 OpenGL ARB(Architecture Review Board)工作組推出了 GL
24、SL 1.5OpenGLShading Language(OpenGL 著色語言)的升級版,以與在 OpenGL3.2 框架下推出了兩個新功能,可以讓開發(fā)者在開發(fā)新程序時(shí)能夠在使用流水線核特性或兼容性特性之間做出選擇,其中兼容性特性會提供與舊版 OpenGL 之間的兼容性。2.22.2 OpenGLOpenGL 渲染管線過程渲染管線過程管線這個術(shù)語用于描述一種過程,它涉與兩個或更多個獨(dú)特的階段或步驟。當(dāng)應(yīng)用程序進(jìn)行OpenGL API 調(diào)用時(shí),這些命令被放置在一個命令緩沖區(qū)中。這個緩沖區(qū)最終填滿了命令、頂點(diǎn)數(shù)據(jù)、紋理數(shù)據(jù)等。當(dāng)緩沖區(qū)被刷新時(shí),命令和數(shù)據(jù)就被傳遞給管線的下一個階段。通常,頂點(diǎn)數(shù)據(jù)
25、首先進(jìn)行轉(zhuǎn)換和光照。在轉(zhuǎn)換階段,描述物體幾何形狀的點(diǎn)被重新計(jì)算,以確定這個物體的位置和6 / 32方向。同時(shí)所進(jìn)行的光照計(jì)算將確定每個頂點(diǎn)應(yīng)該具有的顏色亮度。當(dāng)這個階段完成之后,數(shù)據(jù)就被輸入到管線的光柵化部分。光柵階段根據(jù)幾何圖形、顏色和紋理數(shù)據(jù)實(shí)際創(chuàng)建彩色圖像。然后,圖像被放入幀緩沖區(qū)中。幀緩沖區(qū)就是圖形顯示設(shè)備的存,這意味著這幅圖像將會在屏幕上顯示。圖 1 顯示了 OpenGL 工作流程圖順序,雖然并沒有嚴(yán)格規(guī)定 OpenGL 必須采用這樣的實(shí)現(xiàn),但它卻提供了一個可靠的指南方向,可以預(yù)測 OpenGL 將以什么樣的順序來執(zhí)行這些操作。圖 1 Opengl 工作渲染流程圖OpenGL 渲染管
26、線的操作過程主要包括以下幾部分:1)頂點(diǎn)變換2)圖元組裝3)圖元處理4)片元處理5)光柵化操作.1 頂點(diǎn)變換頂點(diǎn)變換這個階段主要是對輸入的頂點(diǎn)進(jìn)行逐個處理,這些頂點(diǎn)都包括很多屬性(如位置、顏色、法線和紋理坐標(biāo)等) ,經(jīng)過處理后,輸出是經(jīng)過變換后的頂點(diǎn)屬性與關(guān)聯(lián)信息。主要過程:頂點(diǎn)變換(幾何變換和投影變換) 、光照計(jì)算、紋理坐標(biāo)變換和生成。.2 圖元組裝圖元組裝這個階段主要是按照輸入的變換后的頂點(diǎn)屬性和關(guān)聯(lián)信息,組裝形成圖元。.3 圖元處理圖元處理這個階段主要是對輸入的圖元進(jìn)行處理,輸出片元(幀緩存中更新象素屬性的數(shù)據(jù))信息,該片元信息是對頂點(diǎn)變換
27、階段得出的屬性進(jìn)行插值處理得到的。主要過程:視景裁剪、背面剔除。.4 片元處理片元處理這個階段的輸入為經(jīng)過插值計(jì)算后的最終片元信息,經(jīng)過處理后,輸出信息為片元的深度和顏色值。 主要過程:紋理、霧化、顏色匯總(包括紋理顏色,光照顏色,主顏色等) 。.5 光柵化操作光柵化操作這個階段的輸入為像素位置和片元的深度、顏色值等信息,經(jīng)過一系列的測試(剪切測試、Alpha 測試、模板測試和深度測試)后形成像素的顏色。主要過程:剪切測試、Alpha 測試、模板測試和深度測試、寫入幀緩存。2.32.3 MFCMFC 概述概述MFC(Microsoft Foundation Cl
28、ass Library)中的各種類結(jié)合起來構(gòu)成了一個應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來建立 Windows 下的應(yīng)用程序,這是一種相對 SDK 來說更為簡單7 / 32的方法。因?yàn)榭傮w上,MFC 框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓。Microsoft Visual C+提供了相應(yīng)的工具來完成這個工作:AppWizard 可以用來生成初步的框架文件(代碼和資源等) ;資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;ClassWizard 用來協(xié)助添加代碼到框架文件;最后,編譯,則通過類庫實(shí)現(xiàn)了應(yīng)用程序
29、特定的邏輯。 MFC 是在 1992 年隨微軟的 Microsoft C/C+ 7.0 編譯器發(fā)布的,用于面向 16 位 Windows 的軟件開發(fā)。起初,MFC 是作為一個應(yīng)用程序框架開發(fā)的,所以定名為 Application FrameworkX (AFX)。 Borland 幾乎同時(shí)發(fā)布了面向 Turbo C 編譯器的 OWL,并且在一開始比 MFC 更具有市場占有率,但是在 Borland 發(fā)布了一個不向下兼容的應(yīng)用程序框架之后,它喪失了很多市場份額;在 Borland從微軟獲得發(fā)布 MFC 的授權(quán)之后它的市場份額進(jìn)一步減少。Borland 最終用 Visual Component L
30、ibrary 來作為 OWL 的后繼者。 隨著 Visual Basic 和 Visual Studio .NET 的發(fā)布,曾經(jīng)一度被微軟重點(diǎn)推薦的 MFC 被Visual Basic、C#、Windows Forms 搶走了不少市場份額,但是 MFC 繼續(xù)在非托管軟件開發(fā)中占據(jù)重要地位。在托管開發(fā)方面,MFC 中也包括對 Windows Forms 和托管非托管互操作的封裝。微軟在 Windows Vista 和 Windows 7 發(fā)布之后在 MFC 中增加了對新的 Windows API 支持。 很多商用類庫在 MFC 的基礎(chǔ)上進(jìn)一步實(shí)現(xiàn)了皮膚、漸變風(fēng)格、多頂層窗口程序、屬性列表等較受歡
31、迎的功能;同時(shí),在 C+在線社區(qū)中,很大一部分開放的源代碼也是基于 MFC 的。VC+產(chǎn)品版本與 MFC 版本如下:表格 1 VC+產(chǎn)品版本與 MFC 版本2.42.4 MFCMFC 特點(diǎn)特點(diǎn).1 封裝封裝構(gòu)成 MFC 框架的是 MFC 類庫。MFC 類庫是 C+類庫。這些類或者封裝了 Win32 應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了 OLE 特性,或者封裝了 ODBC 和 DAO 數(shù)據(jù)訪問的功能,8 / 32等等,分述如下:(1)對 Win32 應(yīng)用程序編程接口的封裝;(2)對應(yīng)用程序概念的封裝;(3)對 COM/OLE 特性的封裝;(4)對 ODBC 功能
32、的封裝。.2 繼承繼承首先,MFC 抽象出眾多類的共同特性,設(shè)計(jì)出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是 CObject 和 CCmdTarget。CObject 是 MFC 的根類,絕大多數(shù) MFC 類是其派生的,包括CCmdTarget。CObject 實(shí)現(xiàn)了一些重要的特性,包括動態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、對程序調(diào)試的支持,等等。所有從 CObject 派生的類都將具備或者可以具備 CObject 所擁有的特性。CCmdTarget 通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。MFC 中,任何可以處理消息的類都從 CCmdTarget 派生。針對每種不
33、同的對象,MFC 都設(shè)計(jì)了一組類對這些對象進(jìn)行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是CWnd;應(yīng)用程序?qū)ο?,基類?CwinThread;文檔對象,基類是 Cdocument,等等。.3 虛擬函數(shù)和動態(tài)約束虛擬函數(shù)和動態(tài)約束MFC 以“C+”為基礎(chǔ),自然支持虛擬函數(shù)和動態(tài)約束。但是作為一個編程框架,有一個問題必須解決:如果僅僅通過虛擬函數(shù)來支持動態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過于臃腫,消耗存,效率低下。例如,CWnd 封裝 Windows 窗口對象時(shí),每一條 Windows 消息對應(yīng)一個成員函數(shù),這些成員函數(shù)為派生類所繼承。如
34、果這些函數(shù)都設(shè)計(jì)成虛擬函數(shù),由于數(shù)量太多,實(shí)現(xiàn)起來不現(xiàn)實(shí)。于是,MFC 建立了消息映射機(jī)制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。2.52.5 應(yīng)用程序的構(gòu)成應(yīng)用程序的構(gòu)成圖 2 解釋了該應(yīng)用程序的結(jié)構(gòu)與對象,箭頭表示信息流向。圖 2 應(yīng)用程序的結(jié)構(gòu)從 CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd 類對應(yīng)地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame 五個類,這五個類的實(shí)例分別是應(yīng)用程序?qū)ο?、文檔對象、視對象、主框架窗口對象和文檔邊框窗口對象。主框架窗口包含了視窗口、工具條
35、和狀態(tài)欄。對這些類或者對象解釋如下:9 / 32(1)應(yīng)用程序(CWinApp) 應(yīng)用程序類派生于 CWinApp?;诳蚣艿膽?yīng)用程序必須有且只有一個應(yīng)用程序?qū)ο?,它?fù)責(zé)應(yīng)用程序的初始化、運(yùn)行和結(jié)束。 (2)邊框窗口(CMDIFrameWnd) 如果是 SDI 應(yīng)用程序,從 CFrameWnd 類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含視窗口;如果是 MDI 應(yīng)用程序,從 CMDIFrameWnd 類派生邊框窗口類,邊框窗口的客戶子窗口(MDIClient)直接包含文檔邊框窗口。如果要支持工具條、狀態(tài)欄,則派生的邊框窗口類還要添加 CToolBar 和 CStatus
36、Bar 類型的成員變量,以與在一個 OnCreate 消息處理函數(shù)中初始化這兩個控制窗口。邊框窗口用來管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(SHIFT+F1 模式)和打印預(yù)覽) 。 (3)文檔邊框窗口(CMDIChildWnd) 文檔邊框窗口類從 CMDIChildWnd 類派生,MDI 應(yīng)用程序使用文檔邊框窗口來包含視窗口。(4)文檔(CDocument) 文檔類從 CDocument 類派生,用來管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過文檔實(shí)現(xiàn)的。視窗口通過文檔對象來訪問和更新數(shù)據(jù)。 (5)視(CView) 視類從 CView 或它的派生類派生。視和文
37、檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的容,并把用戶輸入轉(zhuǎn)換成對文檔的操作。用圖的形式可直觀地表示所涉與的 MFC 類的繼承或者派生關(guān)系,如下:圖 3 MFC 的層次2.62.6 基于基于 OpenGL+MFCOpenGL+MFC 的三維模擬的編程環(huán)境配置的三維模擬的編程環(huán)境配置用 MFC 調(diào)用 OpenGL 函數(shù)來進(jìn)行三維模擬的編程環(huán)境配置:(一)創(chuàng)建 MFC 項(xiàng)目(1) 創(chuàng)建項(xiàng)目文件:選擇 File/New 菜單選項(xiàng),建立一個名為 MyTest 的單文檔 (SDI) 應(yīng)用程序;(二)配置 OpenGL 開發(fā)環(huán)境(1)將 91h,gluh,glauxh 和 gluth
38、 拷貝到(即盤符+路徑)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:WINDOWSsystem32 目錄下;(4)選擇 Project/Setting 菜單選項(xiàng)。在 Link 欄的 Lib 輸入域中添加openg132.lib、gl
39、u32.lib,若需使用 OpenGL 的輔助庫函數(shù),則還需添加 glaux.lib。10 / 32到此,基于 OpenGLMFC 的開發(fā)環(huán)境就建立好。(三)初始化 OpenGL具體編程步驟:第一步:修改窗口風(fēng)格設(shè)置。需要在函數(shù) CGLView:PreCreateWindow 中增加對 Windows 窗口風(fēng)格的設(shè)置,以防止在窗口重疊時(shí)把圖形繪制到子窗口和兄弟窗口。實(shí)現(xiàn)代碼如下:csstyle l=WS_CLIPCHILDREN WS CLIPSIBLINGS;第二步:設(shè)置像素格式。首先需要在視圖類 CGLView 中添加一個成員函數(shù),函數(shù)原型如下:BOOL CGLView:SetupPixe
40、lFormat(CDC*pDC);設(shè)置像素格式并向視圖類 CGLView 中添加兩個成員變量:CDC* m_pDC;OpenGL 設(shè)備場境 HGLRC m_hRC;OpenGL 渲染場境在 Windows 中,使用結(jié)構(gòu) PIXELFO腿 ATDEscRIPTOR 來設(shè)置像素格式,并提供 ChoosePixelFormat()函數(shù)來選擇最為匹配的像素格式以與 SetPixelFormat()函數(shù)來為設(shè)備場境設(shè)置像素格式。設(shè)置像素格式的步驟如下:a.填寫結(jié)構(gòu) PIXELFORMATDESCRIPTOR,像素格式是用這個結(jié)構(gòu)來描述的。b.調(diào)用函數(shù) ChoosePixelFormat(),將填寫好的像
41、素格式結(jié)構(gòu)傳遞給該函數(shù),函數(shù)ChoosePixelFormat()返回一個整型的序號。這個序號標(biāo)識一個當(dāng)前設(shè)備場境中所能提供的,且與所要求的像素格式最為匹配的像素格式。c將這個返回的像素格式序號傳遞給函數(shù) SetPixelFormat(),使之設(shè)置成為當(dāng)前設(shè)備場境的像素格式。第三步:創(chuàng)建渲染場境。用 wglreatecontext()函數(shù)來創(chuàng)建 OpenGL 的一個渲染場境;用 wglMakeCurrent()函數(shù)使給定的渲染場境設(shè)置成為當(dāng)前調(diào)用線程的渲染場境,而線程中隨后調(diào)用的 OpenGL 命令都將通過與該渲染場境相關(guān)聯(lián)的設(shè)備場境來實(shí)現(xiàn)窗口的場景繪制。具體實(shí)現(xiàn)代碼如下:HDC m hDC;
42、HGLRC nl hglRC:m_hglRC=wglCreateContext(m_hDC);創(chuàng)建一個渲染場境wglMakecurrent(m_hDC,m hglRC);使成為當(dāng)前調(diào)用線程的渲染場境第四步:添加消息處理函數(shù)。利用 MFC ClassWizard 為 CGLView 類添加消息:帳_CREATE、wM_DESTROY、m,t_SIZE 和刪_TIMER 的響應(yīng)函數(shù),消息處理函數(shù)名依次為:OnCreate()、onDestroy()、OnSize()和 OnTimer()。ACGLView:OnCreate()函數(shù)該函數(shù)完成的功能是:在視圖窗口創(chuàng)建完成后,進(jìn)行 OpenGLWind
43、ows 的初始化工作。(四)清理工作CGLView:OnDestroy()函數(shù)該函數(shù)完成的功能是:在視圖窗口被釋放時(shí),用于清除當(dāng)前的渲染場境,并釋放設(shè)備場境。具體實(shí)現(xiàn)代碼如下:wglMakeCurrent(NULL,NULL);wglDeleteContext(m_hglRC);清除渲染場境:ReleaseDC(m_hWnd,m_hDC);釋放設(shè)備場境CCGLView:OnSize()函數(shù)DCGLView:OnTimer()函數(shù)該函數(shù)完成的功能是:通過定時(shí)器每隔一定時(shí)間的消息驅(qū)動,來實(shí)現(xiàn)動態(tài)的場景更新。11 / 3212 / 323 3 拾取技術(shù)拾取技術(shù)拾取算法的研究可大致分為兩類:一類是基于
44、三維空間的射線拾取算法,代表算法就是基于CPU 的射線求交拾取技術(shù);另一類是基于圖像空間的拾取算法,例如:基于 GPU 的重繪式拾取技術(shù)。3.13.1 基于射線求交拾取技術(shù)基于射線求交拾取技術(shù)其基本原理是:獲取屏幕坐標(biāo)并轉(zhuǎn)換成圖形系統(tǒng)的視口坐標(biāo),根據(jù)不同圖形 API(應(yīng)用程序編程接口)的實(shí)現(xiàn)給該點(diǎn)加上適當(dāng)?shù)纳疃戎?如 OpenGL 標(biāo)準(zhǔn)的深度值介于 0-1),反算出該拾取點(diǎn)的世界空間坐標(biāo),將相機(jī)焦點(diǎn)坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo),過相機(jī)位置點(diǎn)向鼠標(biāo)選中點(diǎn)作一條射線在三維空間中對射線和物體進(jìn)行求交,離相機(jī)位置點(diǎn)最近的實(shí)體就是被選中的實(shí)體。算法的具體實(shí)現(xiàn)步驟如下:(1)初始化,獲取鼠標(biāo)點(diǎn)的屏幕坐標(biāo)(x,y),
45、并將相機(jī)焦點(diǎn)坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo);(2)相機(jī)焦點(diǎn)深度值(z 值)作為鼠標(biāo)點(diǎn)的深度值(z 值),并將鼠標(biāo)點(diǎn)坐標(biāo)轉(zhuǎn)化為世界坐標(biāo)(XW ,YW ,ZW) ;(3)過相機(jī)位置點(diǎn)向點(diǎn)(XW,YW,ZW)作一射線 m,并分別求射線 m 和投影空間近截面和遠(yuǎn)截面的交點(diǎn) A,B,得到線段 AB。如果射線 m 垂直于視線,則射線 m 和投影空間不相交;(4)依次取出場景實(shí)體列表中的每個實(shí)體,獲取該實(shí)體的轉(zhuǎn)換矩陣,并利用該矩陣將 A、B 點(diǎn)的坐標(biāo)轉(zhuǎn)換為局部坐標(biāo);(5)計(jì)算實(shí)體的包圍盒,并判斷 AB 和包圍盒的相對位置。如果 AB 和包圍盒相交,則求該實(shí)體和 AB交點(diǎn)的參數(shù)值,并將該實(shí)體標(biāo)記為選中對象。如不相交,則進(jìn)
46、行下一個實(shí)體的處理。在上述算法中,判斷線段 AB 和實(shí)體包圍盒的相對位置與線段 AB 和實(shí)體的求交是算法實(shí)現(xiàn)的關(guān)鍵。為了提高拾取速度,對傳統(tǒng)的包圍盒算法和求交算法進(jìn)行了改進(jìn)。.1 判斷線段和包圍盒的相對位置判斷線段和包圍盒的相對位置實(shí)體的最大包圍盒是一個各表面平行于坐標(biāo)平面的六面體,其左下頂點(diǎn)的 x、y、z 坐標(biāo)值為實(shí)體所有頂點(diǎn)相應(yīng)坐標(biāo)值的最小值,其右上頂點(diǎn)的坐標(biāo)值為實(shí)體所有頂點(diǎn)相應(yīng)坐標(biāo)值的最大值。采用向量法來判斷線段和包圍盒相對位置,該算法的基本思想為:將線段看成一個由起點(diǎn)指向終點(diǎn)的向量,求向量各分量和離起點(diǎn)最近的三個包圍盒側(cè)面所在平面的交點(diǎn),如果各分量與平面的交點(diǎn)都在包圍盒
47、側(cè)面上或者在包圍盒且在各分量上,則該線段和包圍盒相交(本文中我們把線段與包圍盒相交和線段在包圍盒這兩種情況統(tǒng)稱為相交)。判斷線段與包圍盒相對位置的具體步驟如下:(1)判斷起點(diǎn) A 是否在包圍盒,如果在盒,則線段 AB 和包圍盒相交,判斷結(jié)束;如果不在盒,則記下該包圍盒離起點(diǎn) A 最近的三個側(cè)面,這三個側(cè)面必定共點(diǎn)且相互垂直;(2)過起點(diǎn) A 向各側(cè)面做垂線,得到三個垂足,連接點(diǎn) A 和各垂足,得到三個向量 a1、a2、a3(如圖 4 所示),并求 a1、a2、a3 和向量 AB 各相應(yīng)分量的比值 ti=ai/AB(i=1,2,3)。如果 AB 的某個分量為零,則比值取-1。取 t1、t2、t3
48、 中的最大值為 tmax,如果 tmax1,則 AB 和包圍盒不相交,判斷結(jié)束;(3)根據(jù) tmax 值求出交點(diǎn)坐標(biāo),判斷交點(diǎn)是否在包圍盒上。 (此處最好給出交點(diǎn)坐標(biāo)的計(jì)算式,以與交點(diǎn)是否在包圍盒上的判斷算式。 )如果交點(diǎn)在盒上,則 AB 和包圍盒相交,否則,AB 和包圍盒相離。圖 4 線段 AB 和包圍盒的位置關(guān)系圖判斷線段與包圍盒相對位置的算法流程如圖 5 所示。13 / 32圖 5 向量法判斷線段和包圍盒相對位置算法流程圖根據(jù)拾取對象的不同,線段和相關(guān)對象求交的方法和過程存在差別。設(shè)要和拾取對象求交的線段為 AB,針對不同的情況,下面對兩種求交過程分別加以描述。(1)拾取對象為點(diǎn)當(dāng)拾取對
49、象為點(diǎn)時(shí),求交的實(shí)質(zhì)就是以 AB 為軸線,以一個很小的浮點(diǎn)數(shù)tolerance(tolerance 一般小于 0.001)為半徑做一個圓柱,在這個圓柱離視點(diǎn)最近的點(diǎn)就是所求的交點(diǎn)。具體做法是將實(shí)體的每一個頂點(diǎn)向 AB 投影,并求出投影點(diǎn)在線段 AB 上的參數(shù)坐標(biāo)。在 0到 1 的圍,參數(shù)坐標(biāo)的值越小,說明該點(diǎn)離視點(diǎn)越近。如果我們發(fā)現(xiàn)了某個實(shí)體頂點(diǎn)比當(dāng)前的最近點(diǎn)離視點(diǎn)更近且該點(diǎn)到 AB 所在直線的距離小于 tolerance,則把該點(diǎn)記錄為當(dāng)前的最近點(diǎn)。當(dāng)所有的點(diǎn)處理完畢,當(dāng)前的最近點(diǎn)就是該實(shí)體和線段 AB 的交點(diǎn)。(2)拾取對象為直線或復(fù)合線復(fù)合線一般指由多個直線段相連接所構(gòu)成的單元體,在本文
50、所述的三維圖形瀏覽器系統(tǒng)中,曲14 / 32線如 NURBS 曲線、圓弧等都存儲為復(fù)合線的形式。對于線狀圖元,比較常用的方法是通過計(jì)算點(diǎn)線距離來進(jìn)行拾取,這種方法簡單易懂,易于實(shí)現(xiàn)。但當(dāng)拾取曲線、復(fù)雜折線等圖元時(shí),計(jì)算量會非常大。為此提出一種新的改進(jìn)算法,其具體操作步驟如下:以拾取點(diǎn)為中心、兩倍拾取精度(在本文中拾取精度一般為象素寬度的 25 倍)為邊長,繪制一個以背景色為填充色的正方形作為“測試窗口” 。 如圖 6 所示圖 6 測試窗口重繪圖形對象。如果圖元進(jìn)入拾取圍,則必然在“測試區(qū)”中留下軌跡,重繪圖形對象的目的是為了恢復(fù)可能被“測試窗口”遮蔽的圖形對象。循環(huán)讀取“測試窗口”中象素點(diǎn)顏色
51、。當(dāng)發(fā)現(xiàn)象素點(diǎn)顏色有別于背景色時(shí),終止讀點(diǎn),標(biāo)識拾取成功。若未發(fā)現(xiàn)有別于背景色的象素點(diǎn)時(shí),則繼續(xù)進(jìn)行下一個圖元的檢測。如圖 7 所示圖 7 測試區(qū)中的軌跡3.23.2 基于基于 GPUGPU 的重繪式拾取技術(shù)的重繪式拾取技術(shù)基本思路:重繪式拾取法是在 OpenGL 繪圖模式下,通過 2 次繪圖來拾取并顯示物體。第 1 次繪圖為虛擬繪圖,通過在 OpenGL 幀緩存中繪制一些輔助圖形來幫助選取物體。這些輔助圖形對于系統(tǒng)使用者是不可見的,因此在確定所選物體之后要將輔助圖形從幀緩存中清除掉才能進(jìn)行第 2 次繪圖。第 2 次繪圖為實(shí)際繪圖,所繪圖形為系統(tǒng)使用者看到的真實(shí)圖形。在 GPU 上實(shí)現(xiàn)三維圖元
52、拾取的方法有兩種,第一種方法與場景幾何無關(guān),第二種方法是場景幾何依賴。下面介紹第一種方法:場景幾何無關(guān)方法的應(yīng)用一直受到限制:它需要 GPU 的可編程能力,需要 ShaderModel2.0 和浮點(diǎn)型紋理支持;其次是因?yàn)槊看纬霭l(fā)拾取程序的時(shí)候都要在后臺繪制一表面,等同于重復(fù)繪制了兩次場景,不適合頻繁連續(xù)的拾取動作。該方法的核心是把圖元的幾何信息、指針等相關(guān)信息作為它的顏色渲染到后臺的一 Render Target 型表面上對應(yīng)幀緩沖做一次特殊的“渲染” 。在渲染后只要讀取表面上相應(yīng)像素坐標(biāo)的顏色值就可以得知它相對應(yīng)圖元的信息。整個算法分為在 CPU 上和在 GPU 上的兩部分。在 CPU 上
53、C+程序的任務(wù)是建立一個后臺的表面,然后調(diào)用 GPU 上的程序?qū)ξ矬w進(jìn)行特殊的 RTT(Rallderto Texture,渲染到紋理),再根據(jù)渲染結(jié)果讀取表面某坐標(biāo)的顏色并還原信息。具體實(shí)現(xiàn)時(shí)考慮到紋理有 pow of two 和 nonpow of two 之別,屏幕分辨率一般不為 pow of two,因此可以考慮采用渲染到表面(RRS),用 Direct3D9 中的 CreateRenderTarget()創(chuàng)建一個 Render Target 型表面,CPU 上的主要流程如下:鼠標(biāo)點(diǎn)擊拾取事件觸發(fā)下面流程:(1)建立一新的臨時(shí)紋理;(2)將當(dāng)前設(shè)備屏幕的容存入緩沖中,將設(shè)備的渲染對象設(shè)
54、為該臨時(shí)紋理;(3)做好渲染前的準(zhǔn)備,包括從 fx 文件中讀入 effect;(4)對于每個幾何對象在 GPU 通過 Shader 進(jìn)行特殊渲染;(5)還原設(shè)備信息,設(shè)備的渲染對象指向幀緩沖;(6)獲取臨時(shí)紋理上拾取區(qū)域的像素;(7)將獲得的像素按定義的格式解碼。圖 8 說明了上述整個流程。15 / 32圖 8 GPU 拾取流程下面定義 Vertex Shader 的輸出容,定義了一個包括坐標(biāo)和顏色的結(jié)構(gòu)(struct)。其中,pos用于頂點(diǎn)轉(zhuǎn)換,color 用于頂點(diǎn)信息存儲。Struct VSResultFloat4 pos:POSITION;Float4 color:TEXCOORDO;在
55、 Vertex Shader 中,輸入某點(diǎn)的局部坐標(biāo),把坐標(biāo)的值編碼成一個顏色的 RGB 值后作為輸出顏色的 RGB 值,同時(shí)將輸入坐標(biāo)向量左乘世界矩陣、觀察矩陣、投影矩陣后得到最終輸出的坐標(biāo)值。在 Pixel Shader 中,將物體指針信息作為顏色的 Alpha 值,加上 Vertex Shader 輸出的顏色,輸出為最終的渲染顏色。在單個幾何圖元中,不同頂點(diǎn)有不同的坐標(biāo),在 Vertex Shader 中,根據(jù)坐標(biāo)信息進(jìn)行頂點(diǎn)轉(zhuǎn)換,同時(shí)將坐標(biāo)信息作為顏色值存入 VSResult 中。主要如下:VSResult Vs_main float3 pos:POSITION VSResult re
56、t;ret.color=float4(pos,1.of);float4 worldpos=mul(float4(pos,1),worldmatrix);ret.pos=mul(worldpos,ViewProjection);return ret;對于 ret.color,前 3 個 RGB 值表示輸入的位置坐標(biāo);而第 4 個 Alpha 值用作存儲其他信息,暫時(shí)填入 1.Of,后文將填充圖元的指針。3.33.3 各種拾取技術(shù)比較各種拾取技術(shù)比較各種拾取技術(shù)比較表如下:表 2 各種拾取技術(shù)比較16 / 32原理優(yōu)點(diǎn)局限性O(shè)penGL的選擇機(jī)制先把場景畫進(jìn)幀緩沖,然后進(jìn)入選擇模式并重新繪制這個場
57、景。當(dāng)退出選擇模式時(shí),OpenGL 返回一個圖元(premitives)清單,圖元可能被視見體(viewing volume)分割。每個被視見體圖元引出一資選擇命中(hit)。確切的說,圖元清單是作為一個取整數(shù)值的名字(integer-valued names)數(shù)組和相關(guān)的數(shù)據(jù)命中記錄(hit record)對應(yīng)名字棧(name stack)的當(dāng)前容。當(dāng)在選擇模式下發(fā)布圖元繪制命令時(shí)向名字棧中加入名字就可建立起名字棧。當(dāng)名字清單被返回后,可以用它來確定屏幕上的哪個圖元可能被用戶選中了。此算法簡單名字堆棧容量有限,不能處理大規(guī)模場景中的拾取。射線拾取方法獲取屏幕坐標(biāo)并轉(zhuǎn)換成圖形系統(tǒng)的視口坐標(biāo),根
58、據(jù)不同圖形API(應(yīng)用程序編程接口)的實(shí)現(xiàn)給該點(diǎn)加上適當(dāng)?shù)纳疃戎?如OpenGL 標(biāo)準(zhǔn)的深度值介于 0-1),反算出該拾取點(diǎn)的世界空間坐標(biāo),并由視點(diǎn)向此點(diǎn)引一條射線,在三維空間中對射線和物體進(jìn)行求交。對拾取對象為點(diǎn)或簡單的選擇體較為方便,速度快。(1)因它假設(shè)所有的圖形變換矩陣必須可逆,經(jīng)過一系列的逆運(yùn)算可得到圖像空間某點(diǎn)的三維坐標(biāo),但實(shí)際上這些矩陣并非總是可逆;(2)對于復(fù)雜的選擇體,判斷物體是否在選擇體部的算法極其復(fù)雜。從而使整個處理過程耗時(shí)巨大,且如此復(fù)雜的算法也會給整個系統(tǒng)的實(shí)現(xiàn)帶來一定難度。重繪式拾取法在 OpenGL 繪圖模式下,通過 2次繪圖來拾取并顯示物體。第1 次繪圖為虛擬繪
59、圖,通過在OpenGL 幀緩存中繪制一些輔助圖形來幫助選取物體。這些輔助圖形對于系統(tǒng)使用者是不可見的,因此在確定所選物體之(1)沒有采用OpenGL 選擇機(jī)制。整個拾取過程都在OpenGL 的繪圖模式下完成,因此不必要為每個物體命名。同時(shí),避免了在繪圖模式與選擇模式之間依賴于硬件,與 GPU 的性能息息相關(guān)17 / 32后要將輔助圖形從幀緩存中清除掉才能進(jìn)行第 2 次繪圖。第2 次繪圖為實(shí)際繪圖,所繪圖形為系統(tǒng)使用者看到的真實(shí)圖形。的切換;(2)靈活的拾取圍,可以定義各種形態(tài)的框選,如圓形,方形;(3)算法簡單,容易實(shí)現(xiàn),且容易遷移到GPU 上,利用硬件加速拾取算法。18 / 324 4 系統(tǒng)
60、的設(shè)計(jì)與實(shí)現(xiàn)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)有些圖形應(yīng)用程序只繪制兩維和三維物體構(gòu)成的靜態(tài)圖形,另一些允許用戶識別屏幕上的物體并移動、修改、刪除或用其它方法操縱這些物體。OpenGL 正是設(shè)計(jì)用于支持這些交互式應(yīng)用程序的。因?yàn)槔L制在屏幕上的物體通常經(jīng)過多次旋轉(zhuǎn)、移動和透視變換,所以確定用戶選中了三維場景中的哪個物體會很困難。為了解決這個問題,OpenGL 提供了一個選擇機(jī)制可惟自動告訴你哪個物體被繪制在窗口的提定區(qū)域里。本文的拾取考慮到簡單地拾取三個不同的物體,分別是一個一個拾取,而不是同時(shí)拾取的過程且拾取物體是簡單的選擇體,這些正好都不是 OpenGL 的選擇機(jī)制的各種缺點(diǎn)且 OpenGL 的選擇機(jī)制是 O
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 路面彩色瀝青養(yǎng)護(hù)施工方案
- 浙江地坪環(huán)氧施工方案
- 橋西防腐施工隊(duì)施工方案
- 銅仁化糞池施工方案
- 鋼板倉內(nèi)部耐磨錐施工方案
- 通信架空鋼管施工方案
- 學(xué)校樓道消防管道施工方案
- 無錫結(jié)構(gòu)粘鋼加固施工方案
- 裝飾木板安裝施工方案
- 2025年中國工業(yè)控制軟件行業(yè)發(fā)展監(jiān)測及投資方向研究報(bào)告
- 經(jīng)方治療腦梗塞的體會
- 新版DFMEA基礎(chǔ)知識解析與運(yùn)用-培訓(xùn)教材
- 制氮機(jī)操作安全規(guī)程
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(全真題庫)
- 護(hù)理安全用氧培訓(xùn)課件
- 《三國演義》中人物性格探析研究性課題報(bào)告
- 注冊電氣工程師公共基礎(chǔ)高數(shù)輔導(dǎo)課件
- 土方勞務(wù)分包合同中鐵十一局
- 乳腺導(dǎo)管原位癌
- 冷庫管道應(yīng)急預(yù)案
- 司法考試必背大全(涵蓋所有法律考點(diǎn))
評論
0/150
提交評論