基于Opengl的屏幕對(duì)象拾取-本科畢業(yè)論文_第1頁
基于Opengl的屏幕對(duì)象拾取-本科畢業(yè)論文_第2頁
基于Opengl的屏幕對(duì)象拾取-本科畢業(yè)論文_第3頁
基于Opengl的屏幕對(duì)象拾取-本科畢業(yè)論文_第4頁
基于Opengl的屏幕對(duì)象拾取-本科畢業(yè)論文_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

PAGE論文題目:基于OpenGL的屏幕對(duì)象拾取PAGEIV畢業(yè)論文(設(shè)計(jì))原創(chuàng)性聲明本人所呈交的畢業(yè)論文(設(shè)計(jì))是我在導(dǎo)師的指導(dǎo)下進(jìn)行的研究工作及取得的研究成果。據(jù)我所知,除文中已經(jīng)注明引用的內(nèi)容外,本論文(設(shè)計(jì))不包含其他個(gè)人已經(jīng)發(fā)表或撰寫過的研究成果。對(duì)本論文(設(shè)計(jì))的研究做出重要貢獻(xiàn)的個(gè)人和集體,均已在文中作了明確說明并表示謝意。作者簽名:日期:畢業(yè)論文(設(shè)計(jì))授權(quán)使用說明本論文(設(shè)計(jì))作者完全了解**學(xué)院有關(guān)保留、使用畢業(yè)論文(設(shè)計(jì))的規(guī)定,學(xué)校有權(quán)保留論文(設(shè)計(jì))并向相關(guān)部門送交論文(設(shè)計(jì))的電子版和紙質(zhì)版。有權(quán)將論文(設(shè)計(jì))用于非贏利目的的少量復(fù)制并允許論文(設(shè)計(jì))進(jìn)入學(xué)校圖書館被查閱。學(xué)校可以公布論文(設(shè)計(jì))的全部或部分內(nèi)容。保密的論文(設(shè)計(jì))在解密后適用本規(guī)定。

作者簽名:指導(dǎo)教師簽名:日期:日期:

注意事項(xiàng)1.設(shè)計(jì)(論文)的內(nèi)容包括:1)封面(按教務(wù)處制定的標(biāo)準(zhǔn)封面格式制作)2)原創(chuàng)性聲明3)中文摘要(300字左右)、關(guān)鍵詞4)外文摘要、關(guān)鍵詞5)目次頁(附件不統(tǒng)一編入)6)論文主體部分:引言(或緒論)、正文、結(jié)論7)參考文獻(xiàn)8)致謝9)附錄(對(duì)論文支持必要時(shí))2.論文字?jǐn)?shù)要求:理工類設(shè)計(jì)(論文)正文字?jǐn)?shù)不少于1萬字(不包括圖紙、程序清單等),文科類論文正文字?jǐn)?shù)不少于1.2萬字。3.附件包括:任務(wù)書、開題報(bào)告、外文譯文、譯文原文(復(fù)印件)。4.文字、圖表要求:1)文字通順,語言流暢,書寫字跡工整,打印字體及大小符合要求,無錯(cuò)別字,不準(zhǔn)請(qǐng)他人代寫2)工程設(shè)計(jì)類題目的圖紙,要求部分用尺規(guī)繪制,部分用計(jì)算機(jī)繪制,所有圖紙應(yīng)符合國(guó)家技術(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 21緒論 31.1課題的目的和意義 31.2拾取技術(shù)國(guó)內(nèi)外研究 31.3本論文研究主要內(nèi)容 32基于OpenGL+MFC的建模基礎(chǔ) 52.1OpenGL概括 52.2OpenGL渲染管線過程 52.2.1頂點(diǎn)變換 62.2.2圖元組裝 62.2.3圖元處理 62.2.4片元處理 62.2.5光柵化操作 62.3MFC概述 62.4MFC特點(diǎn) 72.4.1封裝 72.4.2繼承 82.4.3虛擬函數(shù)和動(dòng)態(tài)約束 82.5應(yīng)用程序的構(gòu)成 82.6基于OpenGL+MFC的三維模擬的編程環(huán)境配置 93拾取技術(shù) 123.1基于射線求交拾取技術(shù) 123.1.1判斷線段和包圍盒的相對(duì)位置 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致謝 28PAGE29摘要屏幕對(duì)象的拾取是計(jì)算機(jī)圖形處理系統(tǒng)中一個(gè)重要的功能,在許多情況下,計(jì)算機(jī)圖形處理系統(tǒng)不僅要繪制圖形,而且要允許操作者能夠通過輸入設(shè)備(通常是鼠標(biāo))操縱屏幕上的物體(標(biāo)識(shí)、移動(dòng)和修改)。有時(shí)還需要獲取物體上點(diǎn)的空間坐標(biāo)或測(cè)量物體的幾何特性如距離、角度、半徑等,這些操作都需要以拾取作為實(shí)現(xiàn)的基礎(chǔ)。OpenGL為了解決拾取問題,提供了一種基于名字堆棧和命中記錄的選擇機(jī)制。在OpenGL中,拾取物體是利用拾取矩陣和投影變換,將拾取的范圍限制在鼠標(biāo)熱點(diǎn)的有效區(qū)中,一旦觸發(fā)鼠標(biāo)事件就進(jìn)入選擇模式并將有效區(qū)初始化,最后利用拾取矩陣拾取有效區(qū)內(nèi)的物體。有效區(qū)的定義由glPick2Matix()函數(shù)來完成。一旦拾取成功,就以記錄的形式返回與拾取物體相關(guān)的信息,并生成一個(gè)記錄表示一個(gè)物體被命中。這種物體拾取方法非常簡(jiǎn)單,不需要寫很多代碼。在使用OpenGL工具包開發(fā)圖形處理系統(tǒng)時(shí),物體的拾取有多種方法,其中包括OpenGL提供的選擇機(jī)制、射線拾取法、重繪式拾取法等。本文采用OpenGL本身提供的選擇機(jī)制來拾取對(duì)象,突出OpenGL工具包在屏幕對(duì)象的拾取方面的優(yōu)勢(shì)。關(guān)鍵詞:OpenGL;計(jì)算機(jī)應(yīng)用;拾取算法AbstractInmostcases,oneimportantfeatureofgraphicsprocessingsystemispicking,whichallowuserstoselectobjectsbymouse,andtomodifythetheirattributes,suchasgemetrymeshorangleandsoon.Inordertosolvetheproblem,pickOpenGLprovidesanameonthestackandhitrecordchoicemechanism.IntheOpenGLandpickobjectisusingthelootmatrixandprojectiontransformation,andwillgatherinthelimitsofthemouse,effectiveonceenteredthemouseeventtriggermodechoiceandwillbeeffectivearea,finallyusinginitializationgleanedmatrixpickobjectsintheareaofeffective.ThedefinitionofeffectiveglPick2Matix()functiontofinish.Oncepicksuccess,toreturntopicktherecordobjectrelevantinformation,andtocreatearecord,saysanobjecttobehit.Thisobjectpickmethodisverysimple,neednotwritemanycode.IntheuseofgraphicsprocessingsystemdevelopmentOpenGLtoolkitobjects,pickavarietyofmethods,includingOpenGLprovidechoicemechanism,raypick,redrawntypegathermethod,etc.BasedonthemechanismofOpenGLitselftoprovidechoicepickup,outstandingOpenGLtoolkitobjectsinthescreenintheobject.Keywords:OpenGL;computerapplication;picking1緒論目前許多優(yōu)秀的圖形工具能為我們繪制惟妙惟肖的虛擬現(xiàn)實(shí)場(chǎng)景,在面對(duì)這些場(chǎng)景時(shí)候我們除了欣賞之外更多的是希望能與之互動(dòng),做為編程人員可以使用代碼輕松的重新構(gòu)造場(chǎng)景,但對(duì)于終端用戶而言,他們也希望自己也能對(duì)造場(chǎng)景進(jìn)行一些操作,如添加,刪除等等。對(duì)于這些操作而言,首先我們要做的是能讓用戶使用鼠標(biāo)來選擇他所希望操作的對(duì)象,這就是本文要討論的一個(gè)重點(diǎn):拾取,這是一種在許多交互性程序中有基礎(chǔ)地位的操作,是對(duì)屏幕中對(duì)象進(jìn)行定位,并確定所選擇的是哪個(gè)物體。然而該操作給我們提出了一些難題,首先,需要對(duì)對(duì)象進(jìn)行屆定。其次,必須對(duì)“拾取目標(biāo)”進(jìn)行定義。這就需要終端用戶確定單擊的位置是構(gòu)成對(duì)象的圖元上,還是對(duì)象附近的位置以及考慮如果選取點(diǎn)落在兩個(gè)以上物體交集部分如何處理等等問題,本文利用了OpenGL中的選擇模式進(jìn)行有效的對(duì)象判別和拾取。1.1課題的目的和意義圖形對(duì)象的拾取是計(jì)算機(jī)圖形處理系統(tǒng)中一個(gè)重要的功能,很多圖形系統(tǒng)需要用戶通過輸入設(shè)備與系統(tǒng)交互,如移動(dòng)、旋轉(zhuǎn)某個(gè)物體,或查詢某個(gè)物體的狀態(tài)信息,需要通過拾取來確定景中的操作對(duì)象??焖倏煽康氖叭”粡V泛地運(yùn)用于各種系統(tǒng)中,如實(shí)時(shí)圖形系統(tǒng)、虛擬現(xiàn)實(shí)、游戲和CAD系統(tǒng)等方面,拾取操作己成為這些系統(tǒng)的重要部分,它在計(jì)算機(jī)建模軟件尤其重要,能夠通過拾取操作對(duì)模型進(jìn)行局部修改和編輯,提高建模系統(tǒng)的靈活性和適用性。隨著計(jì)算機(jī)軟硬件的快速發(fā)展,人們對(duì)實(shí)時(shí)系統(tǒng)的交互的實(shí)時(shí)性要求也越發(fā)苛刻,而且三維場(chǎng)景復(fù)雜度也日益提高,這就要求系統(tǒng)提供快速的拾取操作。因此,高效的拾取算法能夠決定拾取操作快與慢的關(guān)鍵所在,從而開發(fā)高效的拾取算法已成為當(dāng)今一個(gè)的課題研究。1.2拾取技術(shù)國(guó)內(nèi)外研究隨著網(wǎng)絡(luò)科技越來越發(fā)達(dá),拾取操作也越來越方便了,有的只要鼠標(biāo)點(diǎn)點(diǎn)就可以。而拾取操作的關(guān)鍵是拾取算法。到目前為止,拾取算法大致上可以分三種。第一種是基于射線求交的拾取技術(shù),1992年,MarkSegul,CarlKorobkin,RolfvanWidenfelt等人首次采用了基于射線求交的拾取技術(shù)原理實(shí)現(xiàn)了對(duì)衣服的拾取[1];1998年MichaelDeering,StephanieWinnerandBicSchediwy等也才采用了同樣的技術(shù)成功做到了人物的拾取[2];2005年,龔堰玨,顏敏等人采用了基于射線求交的拾取技術(shù)實(shí)現(xiàn)對(duì)幾個(gè)簡(jiǎn)單物體的拾取[3];同年,韋宇煒也是用此技術(shù)實(shí)現(xiàn)對(duì)游戲中各類的拾取,如對(duì)技能的釋放,對(duì)地上物品的撿起來,對(duì)別的玩家人物屬性的查看等等[4];2006年,姚繼權(quán),李曉豁等人也采用了這種拾取技術(shù)成功地做到了對(duì)3D網(wǎng)游游戲中的各種各樣的拾取[5],等等。第二種是基于GPU的重繪式拾取技術(shù),這種方法對(duì)硬件的依賴性大,不過拾取速度快。1997年,Masaaki.Oka,KyoyaTsutsui,AkioOhba等人第一次采用了基于GPU的重繪式拾取技術(shù)在房子中拾取到了房子主人與小孩子[6];2006年,劉力強(qiáng),周明全等多人采用基于GPU的重繪式拾取技術(shù),在大規(guī)模室外地形中拾取到了地面某個(gè)區(qū)域[7]。第三種是OpenGL自帶的拾取機(jī)制,1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了WindowsNT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行的大型3D圖形處理軟件也可以在微機(jī)上運(yùn)用。1995年OpenGL的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能,如本身自帶的拾取機(jī)制,這項(xiàng)功能使OpenGL在各個(gè)領(lǐng)域都得到了應(yīng)用[8]。隨后出現(xiàn)的各個(gè)版本,使自帶的拾取機(jī)制越來越完善,操作越來越方便,應(yīng)用范圍越來越廣泛。1.3本文研究的主要內(nèi)容(一):綜述本課題研究的意義以及國(guó)內(nèi)外研究現(xiàn)狀;(二):介紹了OpenGL與OpenGL渲染管道,分析MFC編程框架和基于OpenGL+MFC的三維模擬的編程環(huán)境配置;(三):各種拾取技術(shù)的實(shí)現(xiàn)原理,優(yōu)缺點(diǎn);(四):采用了OpenGL本身自帶的拾取機(jī)制設(shè)計(jì)并實(shí)現(xiàn)簡(jiǎn)單的拾取操作;(五):總結(jié)本文并進(jìn)一步給出了展望。2基于OpenGL+MFC的建?;A(chǔ)2.1OpenGL概括OpenGL(全寫OpenGraphicsLibrary)是個(gè)定義了一個(gè)跨編程語言、跨平臺(tái)的編程軟件接口的規(guī)格,該接口包括了大約250個(gè)不同的函數(shù)(其中核心OpenGL大約包括200個(gè)函數(shù),另外還有50個(gè)左右位于OpenGL工具函數(shù)庫(kù)),可以用這些函數(shù)指定物體和操作,創(chuàng)建交互性三維應(yīng)用程序。它是個(gè)專業(yè)的圖形程序接口,是一個(gè)功能強(qiáng)大,調(diào)用方便的底層圖形庫(kù),Opengl用于三維圖象(二維的亦可)。OpenGL的設(shè)計(jì)目標(biāo)就是作為一種流線型的、獨(dú)立于硬件的接口,可以在許多不同的硬件平臺(tái)上實(shí)現(xiàn)。為了實(shí)現(xiàn)這個(gè)目標(biāo),OpenGL并未包含用于執(zhí)行窗口任務(wù)或者獲取用戶輸入之類的函數(shù)。反之,必須通過窗口系統(tǒng)控制所使用的特定硬件。類似地,OpenGL并沒有提供用于描述三維物體模型的高層函數(shù)。這類函數(shù)可能允許你指定相對(duì)較為復(fù)雜的形狀,例如汽車、身體的某個(gè)部位、飛機(jī)或分子等。在OpenGL中,必須根據(jù)少數(shù)幾個(gè)基本幾何圖元(geometricprimitive)(如點(diǎn)、直線和多邊形)來創(chuàng)建你所需要的模型。當(dāng)然,我們可以在OpenGL上創(chuàng)建能夠提供這些特性的高級(jí)函數(shù)庫(kù)。OpenGL實(shí)用函數(shù)庫(kù)(GLU)提供了許多建模特性,例如二次曲面以及NURBS曲線和表面。GLU是所有OpenGL實(shí)現(xiàn)的一個(gè)標(biāo)準(zhǔn)組成部分。1992年7月,SGI公司發(fā)布了OpenGL的1.0版本,隨后又與微軟公司共同開發(fā)了WindowsNT版本的OpenGL,從而使一些原來必須在高檔圖形工作站上運(yùn)行的大型3D圖形處理軟件也可以在微機(jī)上運(yùn)用。1995年OpenGL的1.1版本面市,該版本較1.0性能提高許多,并加入了一些新的功能。1997年,Windows95下3D游戲的大量涌現(xiàn),游戲開發(fā)公司迫切需要一個(gè)功能強(qiáng)大、兼容性好的3D圖形接口,而當(dāng)時(shí)微軟公司自己的3D圖形接口DirectX3.0功能卻是很糟糕。因而以制作《雷神之錘》等經(jīng)典3D射擊游戲而著名的id公司同其它一些游戲開發(fā)公司一同強(qiáng)烈要求微軟在Windows95中加入對(duì)OpenGL的支持。微軟公司最終在Windows95的OSR2版和后來的Windows版本中加入了對(duì)OpenGL的支持。這樣,不但許多支持OpenGL的電腦3D游戲得到廣泛應(yīng)用,而且許多在3D圖形設(shè)計(jì)軟件也可以運(yùn)用支持OpenGL標(biāo)準(zhǔn)的3D加速卡,大大提高其3D圖形的處理速度。2003年的7月28日,SGI和ARB公布了OpenGL1.5。OpenGL1.5中包括OpenGLARB的正式擴(kuò)展規(guī)格繪制語言“OpenGLShadingLanguage”。2004年8月,OpenGL2.0版本發(fā)布OpenGL2.0標(biāo)準(zhǔn)的主要制訂者并非原來的SGI,而是逐漸在ARB中占據(jù)主動(dòng)地位的3Dlabs。2008年8月初Khronos工作組在Siggraph2008大會(huì)上宣布了OpenGL3.0圖形接口規(guī)范,GLSL1.30shader語言和其他新增功能將再次未來開放3D接口發(fā)展指明方向。2009年3月又公布了升級(jí)版新規(guī)范OpenGL3.1,也是這套跨平臺(tái)免費(fèi)API有史以來的第九次更新。2009年8月Khronos小組發(fā)布了OpenGL3.2,這是一年以來OpenGL進(jìn)行的第三次重要升級(jí)。Khronos旗下的OpenGLARB(ArchitectureReviewBoard)工作組推出了GLSL1.5OpenGLShadingLanguage(OpenGL著色語言)的升級(jí)版,以及在OpenGL3.2框架下推出了兩個(gè)新功能,可以讓開發(fā)者在開發(fā)新程序時(shí)能夠在使用流水線內(nèi)核特性或兼容性特性之間做出選擇,其中兼容性特性會(huì)提供與舊版OpenGL之間的兼容性。2.2OpenGL渲染管線過程管線這個(gè)術(shù)語用于描述一種過程,它涉及兩個(gè)或更多個(gè)獨(dú)特的階段或步驟。當(dāng)應(yīng)用程序進(jìn)行OpenGLAPI調(diào)用時(shí),這些命令被放置在一個(gè)命令緩沖區(qū)中。這個(gè)緩沖區(qū)最終填滿了命令、頂點(diǎn)數(shù)據(jù)、紋理數(shù)據(jù)等。當(dāng)緩沖區(qū)被刷新時(shí),命令和數(shù)據(jù)就被傳遞給管線的下一個(gè)階段。通常,頂點(diǎn)數(shù)據(jù)首先進(jìn)行轉(zhuǎn)換和光照。在轉(zhuǎn)換階段,描述物體幾何形狀的點(diǎn)被重新計(jì)算,以確定這個(gè)物體的位置和方向。同時(shí)所進(jìn)行的光照計(jì)算將確定每個(gè)頂點(diǎn)應(yīng)該具有的顏色亮度。當(dāng)這個(gè)階段完成之后,數(shù)據(jù)就被輸入到管線的光柵化部分。光柵階段根據(jù)幾何圖形、顏色和紋理數(shù)據(jù)實(shí)際創(chuàng)建彩色圖像。然后,圖像被放入幀緩沖區(qū)中。幀緩沖區(qū)就是圖形顯示設(shè)備的內(nèi)存,這意味著這幅圖像將會(huì)在屏幕上顯示。圖1顯示了OpenGL工作流程圖順序,雖然并沒有嚴(yán)格規(guī)定OpenGL必須采用這樣的實(shí)現(xiàn),但它卻提供了一個(gè)可靠的指南方向,可以預(yù)測(cè)OpenGL將以什么樣的順序來執(zhí)行這些操作。圖SEQ圖表\*ARABIC1Opengl工作渲染流程圖OpenGL渲染管線的操作過程主要包括以下幾部分:1)頂點(diǎn)變換2)圖元組裝3)圖元處理4)片元處理5)光柵化操作2.2.1頂點(diǎn)變換這個(gè)階段主要是對(duì)輸入的頂點(diǎn)進(jìn)行逐個(gè)處理,這些頂點(diǎn)都包括很多屬性(如位置、顏色、法線和紋理坐標(biāo)等),經(jīng)過處理后,輸出是經(jīng)過變換后的頂點(diǎn)屬性及關(guān)聯(lián)信息。

主要過程:頂點(diǎn)變換(幾何變換和投影變換)、光照計(jì)算、紋理坐標(biāo)變換和生成。2.2.2圖元組裝這個(gè)階段主要是按照輸入的變換后的頂點(diǎn)屬性和關(guān)聯(lián)信息,組裝形成圖元。2.2.3圖元處理這個(gè)階段主要是對(duì)輸入的圖元進(jìn)行處理,輸出片元(幀緩存中更新象素屬性的數(shù)據(jù))信息,該片元信息是對(duì)頂點(diǎn)變換階段得出的屬性進(jìn)行插值處理得到的。

主要過程:視景裁剪、背面剔除。2.2.4片元處理這個(gè)階段的輸入為經(jīng)過插值計(jì)算后的最終片元信息,經(jīng)過處理后,輸出信息為片元的深度和顏色值。

主要過程:紋理、霧化、顏色匯總(包括紋理顏色,光照顏色,主顏色等)。2.2.5光柵化操作這個(gè)階段的輸入為像素位置和片元的深度、顏色值等信息,經(jīng)過一系列的測(cè)試(剪切測(cè)試、Alpha測(cè)試、模板測(cè)試和深度測(cè)試)后形成像素的顏色。

主要過程:剪切測(cè)試、Alpha測(cè)試、模板測(cè)試和深度測(cè)試、寫入幀緩存。2.3MFC概述MFC(MicrosoftFoundationClassLibrary)中的各種類結(jié)合起來構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此基礎(chǔ)上來建立Windows下的應(yīng)用程序,這是一種相對(duì)SDK來說更為簡(jiǎn)單的方法。因?yàn)榭傮w上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。MicrosoftVisualC++提供了相應(yīng)的工具來完成這個(gè)工作:AppWizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;ClassWizard用來協(xié)助添加代碼到框架文件;最后,編譯,則通過類庫(kù)實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。

MFC是在1992年隨微軟的MicrosoftC/C++7.0編譯器發(fā)布的,用于面向16位Windows的軟件開發(fā)。起初,MFC是作為一個(gè)應(yīng)用程序框架開發(fā)的,所以定名為ApplicationFrameworkX(AFX)。

Borland幾乎同時(shí)發(fā)布了面向TurboC編譯器的OWL,并且在一開始比MFC更具有市場(chǎng)占有率,但是在Borland發(fā)布了一個(gè)不向下兼容的應(yīng)用程序框架之后,它喪失了很多市場(chǎng)份額;在Borland從微軟獲得發(fā)布MFC的授權(quán)之后它的市場(chǎng)份額進(jìn)一步減少。Borland最終用VisualComponentLibrary來作為OWL的后繼者。

隨著VisualBasic和VisualStudio.NET的發(fā)布,曾經(jīng)一度被微軟重點(diǎn)推薦的MFC被VisualBasic、C#、WindowsForms搶走了不少市場(chǎng)份額,但是MFC繼續(xù)在非托管軟件開發(fā)中占據(jù)重要地位。在托管開發(fā)方面,MFC中也包括對(duì)WindowsForms和托管/非托管互操作的封裝。微軟在WindowsVista和Windows7發(fā)布之后在MFC中增加了對(duì)新的WindowsAPI支持。

很多商用類庫(kù)在MFC的基礎(chǔ)上進(jìn)一步實(shí)現(xiàn)了皮膚、漸變風(fēng)格、多頂層窗口程序、屬性列表等較受歡迎的功能;同時(shí),在C++在線社區(qū)中,很大一部分開放的源代碼也是基于MFC的。VC++產(chǎn)品版本與MFC版本如下:表格SEQ表格\*ARABIC1VC++產(chǎn)品版本與MFC版本2.4MFC特點(diǎn)2.4.1封裝構(gòu)成MFC框架的是MFC類庫(kù)。MFC類庫(kù)是C++類庫(kù)。這些類或者封裝了Win32應(yīng)用程序編程接口,或者封裝了應(yīng)用程序的概念,或者封裝了OLE特性,或者封裝了ODBC和DAO數(shù)據(jù)訪問的功能,等等,分述如下:(1)對(duì)Win32應(yīng)用程序編程接口的封裝;(2)對(duì)應(yīng)用程序概念的封裝;(3)對(duì)COM/OLE特性的封裝;(4)對(duì)ODBC功能的封裝。2.4.2繼承首先,MFC抽象出眾多類的共同特性,設(shè)計(jì)出一些基類作為實(shí)現(xiàn)其他類的基礎(chǔ)。這些類中,最重要的類是CObject和CCmdTarget。CObject是MFC的根類,絕大多數(shù)MFC類是其派生的,包括CCmdTarget。CObject實(shí)現(xiàn)了一些重要的特性,包括動(dòng)態(tài)類信息、動(dòng)態(tài)創(chuàng)建、對(duì)象序列化、對(duì)程序調(diào)試的支持,等等。所有從CObject派生的類都將具備或者可以具備CObject所擁有的特性。CCmdTarget通過封裝一些屬性和方法,提供了消息處理的架構(gòu)。MFC中,任何可以處理消息的類都從CCmdTarget派生。

針對(duì)每種不同的對(duì)象,MFC都設(shè)計(jì)了一組類對(duì)這些對(duì)象進(jìn)行封裝,每一組類都有一個(gè)基類,從基類派生出眾多更具體的類。這些對(duì)象包括以下種類:窗口對(duì)象,基類是CWnd;應(yīng)用程序?qū)ο?,基類是CwinThread;文檔對(duì)象,基類是Cdocument,等等。2.4.3虛擬函數(shù)和動(dòng)態(tài)約束MFC以“C++”為基礎(chǔ),自然支持虛擬函數(shù)和動(dòng)態(tài)約束。但是作為一個(gè)編程框架,有一個(gè)問題必須解決:如果僅僅通過虛擬函數(shù)來支持動(dòng)態(tài)約束,必然導(dǎo)致虛擬函數(shù)表過于臃腫,消耗內(nèi)存,效率低下。例如,CWnd封裝Windows窗口對(duì)象時(shí),每一條Windows消息對(duì)應(yīng)一個(gè)成員函數(shù),這些成員函數(shù)為派生類所繼承。如果這些函數(shù)都設(shè)計(jì)成虛擬函數(shù),由于數(shù)量太多,實(shí)現(xiàn)起來不現(xiàn)實(shí)。于是,MFC建立了消息映射機(jī)制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動(dòng)態(tài)約束問題。2.5應(yīng)用程序的構(gòu)成圖2解釋了該應(yīng)用程序的結(jié)構(gòu)與對(duì)象,箭頭表示信息流向。圖2應(yīng)用程序的結(jié)構(gòu)從CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd類對(duì)應(yīng)地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五個(gè)類,這五個(gè)類的實(shí)例分別是應(yīng)用程序?qū)ο?、文檔對(duì)象、視對(duì)象、主框架窗口對(duì)象和文檔邊框窗口對(duì)象。主框架窗口包含了視窗口、工具條和狀態(tài)欄。對(duì)這些類或者對(duì)象解釋如下:

(1)應(yīng)用程序(CWinApp)

應(yīng)用程序類派生于CWinApp。基于框架的應(yīng)用程序必須有且只有一個(gè)應(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和CStatusBar類型的成員變量,以及在一個(gè)OnCreate消息處理函數(shù)中初始化這兩個(gè)控制窗口。

邊框窗口用來管理文檔邊框窗口、視窗口、工具條、菜單、加速鍵等,協(xié)調(diào)半模式狀態(tài)(如上下文的幫助(SHIFT+F1模式)和打印預(yù)覽)。

(3)文檔邊框窗口(CMDIChildWnd)

文檔邊框窗口類從CMDIChildWnd類派生,MDI應(yīng)用程序使用文檔邊框窗口來包含視窗口。

(4)文檔(CDocument)

文檔類從CDocument類派生,用來管理數(shù)據(jù),數(shù)據(jù)的變化、存取都是通過文檔實(shí)現(xiàn)的。視窗口通過文檔對(duì)象來訪問和更新數(shù)據(jù)。

(5)視(CView)

視類從CView或它的派生類派生。視和文檔聯(lián)系在一起,在文檔和用戶之間起中介作用,即視在屏幕上顯示文檔的內(nèi)容,并把用戶輸入轉(zhuǎn)換成對(duì)文檔的操作。用圖的形式可直觀地表示所涉及的MFC類的繼承或者派生關(guān)系,如下:圖3MFC的層次2.6基于OpenGL+MFC的三維模擬的編程環(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),建立一個(gè)名為MyTest的單文檔(SDI)應(yīng)用程序;(二)配置OpenGL開發(fā)環(huán)境(1)將91.h,glu.h,glaux.h和glut.h拷貝到???(即盤符+路徑)\MicrosoftVisualStudio\VC98\Include\GL目錄中;(2)將opengl32.1ib,glu32.1ib,glaux.1ib和glut32.1ib拷貝到???(即盤符+路徑)\MicrosoftVisualStudio\Vc98\Lib目錄中;(3)將opengl32.dll,glu.dll,glu32.dll,glut.dll,glut32.dll文件拷貝到操作系統(tǒng)安裝目錄C:\WINDOWS\system32目錄下;(4)選擇Project/Setting菜單選項(xiàng)。在Link欄的Lib輸入域中添加openg132.lib、glu32.lib,若需使用OpenGL的輔助庫(kù)函數(shù),則還需添加glaux.lib。到此,基于OpenGL+MFC的開發(fā)環(huán)境就建立好。(三)初始化OpenGL

具體編程步驟:第一步:修改窗口風(fēng)格設(shè)置。需要在函數(shù)CGLView::PreCreateWindow中增加對(duì)Windows窗口風(fēng)格的設(shè)置,以防止在窗口重疊時(shí)把圖形繪制到子窗口和兄弟窗口。實(shí)現(xiàn)代碼如下:cs.stylel=WS_CLIPCHILDRENWSCLIPSIBLINGS;第二步:設(shè)置像素格式。首先需要在視圖類CGLView中添加一個(gè)成員函數(shù),函數(shù)原型如下:BOOLCGLView::SetupPixelFormat(CDC*pDC);設(shè)置像素格式并向視圖類CGLView中添加兩個(gè)成員變量:CDC*m_pDC;OpenGL設(shè)備場(chǎng)境HGLRCm_hRC;OpenGL渲染場(chǎng)境在Windows中,使用結(jié)構(gòu)PIXELFO腿ATDEscRIPTOR來設(shè)置像素格式,并提供ChoosePixelFormat()函數(shù)來選擇最為匹配的像素格式以及SetPixelFormat()函數(shù)來為設(shè)備場(chǎng)境設(shè)置像素格式。設(shè)置像素格式的步驟如下:a.填寫結(jié)構(gòu)PIXELFORMATDESCRIPTOR,像素格式是用這個(gè)結(jié)構(gòu)來描述的。b.調(diào)用函數(shù)ChoosePixelFormat(),將填寫好的像素格式結(jié)構(gòu)傳遞給該函數(shù),函數(shù)ChoosePixelFormat()返回一個(gè)整型的序號(hào)。這個(gè)序號(hào)標(biāo)識(shí)一個(gè)當(dāng)前設(shè)備場(chǎng)境中所能提供的,且與所要求的像素格式最為匹配的像素格式。c.將這個(gè)返回的像素格式序號(hào)傳遞給函數(shù)SetPixelFormat(),使之設(shè)置成為當(dāng)前設(shè)備場(chǎng)境的像素格式。第三步:創(chuàng)建渲染場(chǎng)境。用wglreatecontext()函數(shù)來創(chuàng)建OpenGL的一個(gè)渲染場(chǎng)境;用wglMakeCurrent()函數(shù)使給定的渲染場(chǎng)境設(shè)置成為當(dāng)前調(diào)用線程的渲染場(chǎng)境,而線程中隨后調(diào)用的OpenGL命令都將通過與該渲染場(chǎng)境相關(guān)聯(lián)的設(shè)備場(chǎng)境來實(shí)現(xiàn)窗口的場(chǎng)景繪制。具體實(shí)現(xiàn)代碼如下:HDCmhDC;HGLRCnlhglRC:m_hglRC=wglCreateContext(m_hDC);創(chuàng)建一個(gè)渲染場(chǎng)境wglMakecurrent(m_hDC,mhglRC);使成為當(dāng)前調(diào)用線程的渲染場(chǎng)境第四步:添加消息處理函數(shù)。利用MFCClassWizard為CGLView類添加消息:帳_CREATE、wM_DESTROY、m,t_SIZE和刪_TIMER的響應(yīng)函數(shù),消息處理函數(shù)名依次為:OnCreate()、onDestroy()、OnSize()和OnTimer()。A.CGLView::OnCreate()函數(shù)該函數(shù)完成的功能是:在視圖窗口創(chuàng)建完成后,進(jìn)行OpenGLWindows的初始化工作。(四)清理工作CGLView::OnDestroy()函數(shù)該函數(shù)完成的功能是:在視圖窗口被釋放時(shí),用于清除當(dāng)前的渲染場(chǎng)境,并釋放設(shè)備場(chǎng)境。具體實(shí)現(xiàn)代碼如下:wglMakeCurrent(NULL,NULL);wglDeleteContext(m__hglRC);清除渲染場(chǎng)境:ReleaseDC(m_hWnd,m_hDC);釋放設(shè)備場(chǎng)境C.CGLView::OnSize()函數(shù)D.CGLView::OnTimer()函數(shù)該函數(shù)完成的功能是:通過定時(shí)器每隔一定時(shí)間的消息驅(qū)動(dòng),來實(shí)現(xiàn)動(dòng)態(tài)的場(chǎng)景更新。3拾取技術(shù)拾取算法的研究可大致分為兩類:一類是基于三維空間的射線拾取算法,代表算法就是基于CPU的射線求交拾取技術(shù);另一類是基于圖像空間的拾取算法,例如:基于GPU的重繪式拾取技術(shù)。3.1基于射線求交拾取技術(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)作一條射線在三維空間中對(duì)射線和物體進(jìn)行求交,離相機(jī)位置點(diǎn)最近的實(shí)體就是被選中的實(shí)體。

算法的具體實(shí)現(xiàn)步驟如下:(1)初始化,獲取鼠標(biāo)點(diǎn)的屏幕坐標(biāo)(x,y),并將相機(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)依次取出場(chǎng)景實(shí)體列表中的每個(gè)實(shí)體,獲取該實(shí)體的轉(zhuǎn)換矩陣,并利用該矩陣將A、B點(diǎn)的坐標(biāo)轉(zhuǎn)換為局部坐標(biāo);(5)計(jì)算實(shí)體的包圍盒,并判斷AB和包圍盒的相對(duì)位置。如果AB和包圍盒相交,則求該實(shí)體和AB交點(diǎn)的參數(shù)值,并將該實(shí)體標(biāo)記為選中對(duì)象。如不相交,則進(jìn)行下一個(gè)實(shí)體的處理。在上述算法中,判斷線段AB和實(shí)體包圍盒的相對(duì)位置及線段AB和實(shí)體的求交是算法實(shí)現(xiàn)的關(guān)鍵。為了提高拾取速度,對(duì)傳統(tǒng)的包圍盒算法和求交算法進(jìn)行了改進(jìn)。3.1.1判斷線段和包圍盒的相對(duì)位置實(shí)體的最大包圍盒是一個(gè)各表面平行于坐標(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)值的最大值。采用向量法來判斷線段和包圍盒相對(duì)位置,該算法的基本思想為:將線段看成一個(gè)由起點(diǎn)指向終點(diǎn)的向量,求向量各分量和離起點(diǎn)最近的三個(gè)包圍盒側(cè)面所在平面的交點(diǎn),如果各分量與平面的交點(diǎn)都在包圍盒側(cè)面上或者在包圍盒內(nèi)且在各分量上,則該線段和包圍盒相交(本文中我們把線段與包圍盒相交和線段在包圍盒內(nèi)這兩種情況統(tǒng)稱為相交)。判斷線段與包圍盒相對(duì)位置的具體步驟如下:(1)判斷起點(diǎn)A是否在包圍盒內(nèi),如果在盒內(nèi),則線段AB和包圍盒相交,判斷結(jié)束;如果不在盒內(nèi),則記下該包圍盒離起點(diǎn)A最近的三個(gè)側(cè)面,這三個(gè)側(cè)面必定共點(diǎn)且相互垂直;(2)過起點(diǎn)A向各側(cè)面做垂線,得到三個(gè)垂足,連接點(diǎn)A和各垂足,得到三個(gè)向量a1、a2、a3(如圖4所示),并求a1、a2、a3和向量AB各相應(yīng)分量的比值ti=ai/AB(i=1,2,3)。如果AB的某個(gè)分量為零,則比值取-1。取t1、t2、t3中的最大值為tmax,如果tmax<0或tmax>1,則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)系圖判斷線段與包圍盒相對(duì)位置的算法流程如圖5所示。圖5向量法判斷線段和包圍盒相對(duì)位置算法流程圖根據(jù)拾取對(duì)象的不同,線段和相關(guān)對(duì)象求交的方法和過程存在差別。設(shè)要和拾取對(duì)象求交的線段為AB,針對(duì)不同的情況,下面對(duì)兩種求交過程分別加以描述。(1)拾取對(duì)象為點(diǎn)當(dāng)拾取對(duì)象為點(diǎn)時(shí),求交的實(shí)質(zhì)就是以AB為軸線,以一個(gè)很小的浮點(diǎn)數(shù)tolerance(tolerance一般小于0.001)為半徑做一個(gè)圓柱,在這個(gè)圓柱內(nèi)離視點(diǎn)最近的點(diǎn)就是所求的交點(diǎn)。具體做法是將實(shí)體的每一個(gè)頂點(diǎn)向AB投影,并求出投影點(diǎn)在線段AB上的參數(shù)坐標(biāo)。在0到1的范圍內(nèi),參數(shù)坐標(biāo)的值越小,說明該點(diǎn)離視點(diǎn)越近。如果我們發(fā)現(xiàn)了某個(gè)實(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)拾取對(duì)象為直線或復(fù)合線復(fù)合線一般指由多個(gè)直線段相連接所構(gòu)成的單元體,在本文所述的三維圖形瀏覽器系統(tǒng)中,曲線如NURBS曲線、圓弧等都存儲(chǔ)為復(fù)合線的形式。對(duì)于線狀圖元,比較常用的方法是通過計(jì)算點(diǎn)線距離來進(jìn)行拾取,這種方法簡(jiǎn)單易懂,易于實(shí)現(xiàn)。但當(dāng)拾取曲線、復(fù)雜折線等圖元時(shí),計(jì)算量會(huì)非常大。為此提出一種新的改進(jìn)算法,其具體操作步驟如下:①以拾取點(diǎn)為中心、兩倍拾取精度(在本文中拾取精度一般為象素寬度的2~5倍)為邊長(zhǎng),繪制一個(gè)以背景色為填充色的正方形作為“測(cè)試窗口”。如圖6所示圖6測(cè)試窗口②重繪圖形對(duì)象。如果圖元進(jìn)入拾取范圍,則必然在“測(cè)試區(qū)”中留下軌跡,重繪圖形對(duì)象的目的是為了恢復(fù)可能被“測(cè)試窗口”遮蔽的圖形對(duì)象。③循環(huán)讀取“測(cè)試窗口”中象素點(diǎn)顏色。當(dāng)發(fā)現(xiàn)象素點(diǎn)顏色有別于背景色時(shí),終止讀點(diǎn),標(biāo)識(shí)拾取成功。若未發(fā)現(xiàn)有別于背景色的象素點(diǎn)時(shí),則繼續(xù)進(jìn)行下一個(gè)圖元的檢測(cè)。如圖7所示圖7測(cè)試區(qū)中的軌跡3.2基于GPU的重繪式拾取技術(shù)基本思路:重繪式拾取法是在OpenGL繪圖模式下,通過2次繪圖來拾取并顯示物體。第1次繪圖為虛擬繪圖,通過在OpenGL幀緩存中繪制一些輔助圖形來幫助選取物體。這些輔助圖形對(duì)于系統(tǒng)使用者是不可見的,因此在確定所選物體之后要將輔助圖形從幀緩存中清除掉才能進(jìn)行第2次繪圖。第2次繪圖為實(shí)際繪圖,所繪圖形為系統(tǒng)使用者看到的真實(shí)圖形。

在GPU上實(shí)現(xiàn)三維圖元拾取的方法有兩種,第一種方法與場(chǎng)景幾何無關(guān),第二種方法是場(chǎng)景幾何依賴。下面介紹第一種方法:場(chǎng)景幾何無關(guān)方法的應(yīng)用一直受到限制:它需要GPU的可編程能力,需要ShaderModel2.0和浮點(diǎn)型紋理支持;其次是因?yàn)槊看纬霭l(fā)拾取程序的時(shí)候都要在后臺(tái)繪制一張表面,等同于重復(fù)繪制了兩次場(chǎng)景,不適合頻繁連續(xù)的拾取動(dòng)作。該方法的核心是把圖元的幾何信息、指針等相關(guān)信息作為它的顏色渲染到后臺(tái)的一張RenderTarget型表面上對(duì)應(yīng)幀緩沖做一次特殊的“渲染”。在渲染后只要讀取表面上相應(yīng)像素坐標(biāo)的顏色值就可以得知它相對(duì)應(yīng)圖元的信息。整個(gè)算法分為在CPU上和在GPU上的兩部分。在CPU上C++程序的任務(wù)是建立一個(gè)后臺(tái)的表面,然后調(diào)用GPU上的程序?qū)ξ矬w進(jìn)行特殊的RTT(RalldertoTexture,渲染到紋理),再根據(jù)渲染結(jié)果讀取表面某坐標(biāo)的顏色并還原信息。具體實(shí)現(xiàn)時(shí)考慮到紋理有powoftwo和non—powoftwo之別,屏幕分辨率一般不為powoftwo,因此可以考慮采用渲染到表面(RRS),用Direct3D9中的CreateRenderTarget()創(chuàng)建一個(gè)RenderTarget型表面,CPU上的主要流程如下:鼠標(biāo)點(diǎn)擊拾取事件觸發(fā)下面流程:(1)建立一張新的臨時(shí)紋理;(2)將當(dāng)前設(shè)備屏幕的內(nèi)容存入緩沖中,將設(shè)備的渲染對(duì)象設(shè)為該臨時(shí)紋理;(3)做好渲染前的準(zhǔn)備,包括從fx文件中讀入effect;(4)對(duì)于每個(gè)幾何對(duì)象在GPU通過Shader進(jìn)行特殊渲染;(5)還原設(shè)備信息,設(shè)備的渲染對(duì)象指向幀緩沖;(6)獲取臨時(shí)紋理上拾取區(qū)域的像素;(7)將獲得的像素按定義的格式解碼。圖8說明了上述整個(gè)流程。圖8GPU拾取流程下面定義VertexShader的輸出內(nèi)容,定義了一個(gè)包括坐標(biāo)和顏色的結(jié)構(gòu)(struct)。其中,pos用于頂點(diǎn)轉(zhuǎn)換,color用于頂點(diǎn)信息存儲(chǔ)。StructVSResult{Float4pos:POSITION;Float4color:TEXCOORDO};在VertexShader中,輸入某點(diǎn)的局部坐標(biāo),把坐標(biāo)的值編碼成一個(gè)顏色的RGB值后作為輸出顏色的RGB值,同時(shí)將輸入坐標(biāo)向量左乘世界矩陣、觀察矩陣、投影矩陣后得到最終輸出的坐標(biāo)值。在PixelShader中,將物體指針信息作為顏色的Alpha值,加上VertexShader輸出的顏色,輸出為最終的渲染顏色。在單個(gè)幾何圖元中,不同頂點(diǎn)有不同的坐標(biāo),在VertexShader中,根據(jù)坐標(biāo)信息進(jìn)行頂點(diǎn)轉(zhuǎn)換,同時(shí)將坐標(biāo)信息作為顏色值存入VSResult中。主要如下:VSResultVs_main{float3pos:POSITION}{VSResultret;ret.color=float4(pos,1.of);float4worldpos=mul(float4(pos,1),worldmatrix);ret.pos=mul(worldpos,ViewProjection);returnret; }對(duì)于ret.color,前3個(gè)RGB值表示輸入的位置坐標(biāo);而第4個(gè)Alpha值用作存儲(chǔ)其他信息,暫時(shí)填入1.Of,后文將填充圖元的指針。3.3各種拾取技術(shù)比較各種拾取技術(shù)比較表如下:表2各種拾取技術(shù)比較原理優(yōu)點(diǎn)局限性O(shè)penGL的選擇機(jī)制先把場(chǎng)景畫進(jìn)幀緩沖,然后進(jìn)入選擇模式并重新繪制這個(gè)場(chǎng)景。當(dāng)退出選擇模式時(shí),OpenGL返回一個(gè)圖元(premitives)清單,圖元可能被視見體(viewingvolume)分割。每個(gè)被視見體圖元引出一資選擇命中(hit)。確切的說,圖元清單是作為一個(gè)取整數(shù)值的名字(integer-valuednames)數(shù)組和相關(guān)的數(shù)據(jù)-命中記錄(hitrecord)-對(duì)應(yīng)名字棧(namestack)的當(dāng)前內(nèi)容。當(dāng)在選擇模式下發(fā)布圖元繪制命令時(shí)向名字棧中加入名字就可建立起名字棧。當(dāng)名字清單被返回后,可以用它來確定屏幕上的哪個(gè)圖元可能被用戶選中了。此算法簡(jiǎn)單名字堆棧容量有限,不能處理大規(guī)模場(chǎng)景中的拾取。射線拾取方法獲取屏幕坐標(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),并由視點(diǎn)向此點(diǎn)引一條射線,在三維空間中對(duì)射線和物體進(jìn)行求交。對(duì)拾取對(duì)象為點(diǎn)或簡(jiǎn)單的選擇體較為方便,速度快。(1)因它假設(shè)所有的圖形變換矩陣必須可逆,經(jīng)過一系列的逆運(yùn)算可得到圖像空間某點(diǎn)的三維坐標(biāo),但實(shí)際上這些矩陣并非總是可逆;(2)對(duì)于復(fù)雜的選擇體,判斷物體是否在選擇體內(nèi)部的算法極其復(fù)雜。從而使整個(gè)處理過程耗時(shí)巨大,且如此復(fù)雜的算法也會(huì)給整個(gè)系統(tǒng)的實(shí)現(xiàn)帶來一定難度。重繪式拾取法在OpenGL繪圖模式下,通過2次繪圖來拾取并顯示物體。第1次繪圖為虛擬繪圖,通過在OpenGL幀緩存中繪制一些輔助圖形來幫助選取物體。這些輔助圖形對(duì)于系統(tǒng)使用者是不可見的,因此在確定所選物體之后要將輔助圖形從幀緩存中清除掉才能進(jìn)行第2次繪圖。第2次繪圖為實(shí)際繪圖,所繪圖形為系統(tǒng)使用者看到的真實(shí)圖形。(1)沒有采用OpenGL選擇機(jī)制。整個(gè)拾取過程都在OpenGL的繪圖模式下完成,因此不必要為每個(gè)物體命名。同時(shí),避免了在繪圖模式與選擇模式之間的切換;(2)靈活的拾取范圍,可以定義各種形態(tài)的框選,如圓形,方形;(3)算法簡(jiǎn)單,容易實(shí)現(xiàn),且容易遷移到GPU上,利用硬件加速拾取算法。

依賴于硬件,與GPU的性能息息相關(guān)4系統(tǒng)的設(shè)計(jì)及實(shí)現(xiàn)有些圖形應(yīng)用程序只繪制兩維和三維物體構(gòu)成的靜態(tài)圖形,另一些允許用戶識(shí)別屏幕上的物體并移動(dòng)、修改、刪除或用其它方法操縱這些物體。OpenGL正是設(shè)計(jì)用于支持這些交互式應(yīng)用程序的。因?yàn)槔L制在屏幕上的物體通常經(jīng)過多次旋轉(zhuǎn)、移動(dòng)和透視變換,所以確定用戶選中了三維場(chǎng)景中的哪個(gè)物體會(huì)很困難。為了解決這個(gè)問題,OpenGL提供了一個(gè)選擇機(jī)制可惟自動(dòng)告訴你哪個(gè)物體被繪制在窗口的提定區(qū)域里。本文的拾取考慮到簡(jiǎn)單地拾取三個(gè)不同的物體,分別是一個(gè)一個(gè)拾取,而不是同時(shí)拾取的過程且拾取物體是簡(jiǎn)單的選擇體,這些正好都不是OpenGL的選擇機(jī)制的各種缺點(diǎn)且OpenGL的選擇機(jī)制是OpenGL本身自帶的因素,所以采用了OpenGL的選擇機(jī)制的拾取方法,來實(shí)現(xiàn)對(duì)三個(gè)不同的物體拾取。拾取過程如下:使用OpenGL的選擇機(jī)制時(shí),首先把場(chǎng)景畫進(jìn)幀緩沖,然后進(jìn)入選擇模式并重新繪制這個(gè)場(chǎng)景。然而,一旦進(jìn)入了選擇模式,幀緩沖的內(nèi)容將保存不變,直到退出選擇模式。當(dāng)退出選擇時(shí),OpenGL返回一個(gè)圖元(premitives)清單,圖元可能被視見體(viewingvolume)分割。每個(gè)被視見體圖元引出一資選擇命中(hit)。確切的說,圖元清單是作為一個(gè)取整數(shù)值的名字(integer-valuednames)數(shù)組和相關(guān)的數(shù)據(jù)-命中記錄(hitrecord)-對(duì)應(yīng)名字棧(namestack)的當(dāng)前內(nèi)容。當(dāng)在選擇模式下發(fā)布圖元繪制命令時(shí)向名字棧中加入名字就可建立起名字棧。這樣,當(dāng)名字清單被返回后,就可以用它來確定屏幕上的哪個(gè)圖元可能被用戶選中了。除了這個(gè)選擇機(jī)制之外,OpenGL提供了一個(gè)工具例程,以便在某些情況下通過限定在視口(viewport)一個(gè)小區(qū)域內(nèi)繪制來簡(jiǎn)化選擇??梢杂眠@個(gè)例程決定哪個(gè)物體被畫在光標(biāo)附近了,這樣就能識(shí)別用戶拾取了哪個(gè)物體,也可以通過指定附加的裁剪面來界定一個(gè)選擇區(qū)域。4.1系統(tǒng)的選擇機(jī)制選擇機(jī)制分以下幾個(gè)部分來進(jìn)行:(1)進(jìn)入選擇模式之前;(2)獲取當(dāng)前選擇模式;(3)退出當(dāng)前選擇模式;(4)拾取。4.1.1進(jìn)入選擇模式之前用glSelectBuffer()指定用于返回命中記錄的數(shù)組;下面描述glSelectBuffer()和glRenderMode()。

voidglSelectBuffer(GLsizeisize,GLuint*buffer);指定用于返回選擇數(shù)據(jù)的數(shù)組。參數(shù)buffer是指向無符號(hào)整數(shù)(unsignedinteger)數(shù)組的指針,數(shù)據(jù)就存在這個(gè)數(shù)組中,size參數(shù)說明數(shù)組中最多能夠保存的值的個(gè)數(shù)。要在進(jìn)入選擇模式之前調(diào)用glSelectBuffer()4.1.2獲取當(dāng)前選擇模式以GL_SELECT為參數(shù)調(diào)用glRenderMode()進(jìn)入選擇模式;GLintglRenderMode(GLenummode);控制應(yīng)用程序是否進(jìn)入絢染(rendering)、選擇或反饋模式。mode參數(shù)可以是GL_RENDER(默認(rèn))、GL_SELECT或GL_FEEDBACK之一。應(yīng)用程序?qū)⒈3痔幱诮o定模式,直到再次以不同的參數(shù)調(diào)用glRenderMode()。在進(jìn)入選擇模式之前必須調(diào)用glSelectBuffer()指定選擇數(shù)組。類似的,進(jìn)入反饋模式之前要調(diào)用glFeedbackBuffer()指定反饋數(shù)組。如果當(dāng)前模式是GL_SELECT或GL_FEEDBACK之一,那么glRenderMode()的返回值有意義。返回值是當(dāng)前退出當(dāng)前模式時(shí),選擇命中數(shù)或放在反饋數(shù)組中的值的個(gè)數(shù)。負(fù)值意味著選擇或反饋數(shù)組溢出(overflowed)。用GL_RENDER_MODE調(diào)用glGetIntegerv()獲取當(dāng)前模式。定義用于選擇的視見體通常它與原來用于繪制場(chǎng)景的視見體不同,也可以用glPushMatrix()和glPopMatrix()來保存和恢復(fù)當(dāng)前的變換矩陣;在選擇模式下,被視見體裁剪的每個(gè)圖元引起一個(gè)選擇命中。當(dāng)前一個(gè)名字棧控制命令被執(zhí)行或glRenderMode()被調(diào)用后,OpenGL將一個(gè)命中記錄寫進(jìn)選擇數(shù)組,如果從上一次名字棧操縱或glRenderMode()調(diào)用以來有了一個(gè)命中記錄的話。這個(gè)過程中,共用同樣名字的物體-例如:由多個(gè)圖元組成的物體-不生成多個(gè)命中記錄。當(dāng)然,命中記錄不保證會(huì)被寫進(jìn)數(shù)組中直到glRenderMode()被調(diào)用。除圖元之外,glRasterPos()產(chǎn)生的有效坐標(biāo)也可以引起選擇命中。在多邊形的情況下,如果它已經(jīng)被消隱掉的話不會(huì)有命中記錄出現(xiàn)。每個(gè)命中記錄由四項(xiàng)組成,依次是:(1)當(dāng)命中出現(xiàn)時(shí)名字棧中的名字?jǐn)?shù);(2)至上次記錄的命中以來,被視見體裁剪后的圖元的所有頂點(diǎn)的窗口Z坐標(biāo)的最大;(3)被視見體裁剪后的圖元的所有頂點(diǎn)的窗口Z坐標(biāo)最小值;(4)本次命中時(shí)名字棧的內(nèi)容,最底元素最前。進(jìn)入選擇模式時(shí),OpenGL初始化一個(gè)指針指向選擇數(shù)組的起點(diǎn)。每寫入一個(gè)命中記錄,指針相應(yīng)更新。如果寫入一個(gè)命中記錄會(huì)使數(shù)組中值的個(gè)數(shù)超過glSelectBuffer()的size參數(shù)時(shí),OpenGL會(huì)寫入盡可能多的記錄并設(shè)置一個(gè)溢出標(biāo)志。當(dāng)用glRenderMode()退出選擇模式時(shí),這條命令返回被寫入的記錄的個(gè)數(shù)(包括一條部分記錄如果有的話),清除名字棧,復(fù)位溢出標(biāo)識(shí),重置棧指針。如設(shè)定溢了出標(biāo)識(shí)則返回值是-1。用glInitName()和glPushName()初始化名字棧名字棧是返回給你的選擇信息的基礎(chǔ),要建立名字棧,首先用glInitNames()初始化它,這將簡(jiǎn)單地清空棧。然后當(dāng)發(fā)布相應(yīng)的繪制命令時(shí)向其中加入整數(shù)名字。??刂泼钤试S你壓入名字(glPushName()),彈出名字(glPopName()),替換棧頂?shù)拿郑╣lLoadName())。舉個(gè)例子:Example12-1:CreatingaNameStackglInitNames();glPushName(-1);glPushMatrix();/*保存當(dāng)前的轉(zhuǎn)型的狀態(tài)*/glLoadName(1);drawSomeObject();glLoadName(2);drawAnotherObject();glLoadName(3);drawYetAnotherObject();drawJustOneMoreObject();glPopMatrix();/*恢復(fù)以前的轉(zhuǎn)型的狀態(tài)*/在這個(gè)例子中,前兩個(gè)被繪制的物體有自己的名字,第三和第四個(gè)共用一個(gè)名字。這樣,如果第三或第四個(gè)物體中的一個(gè)或全部引起一個(gè)選擇命中,只有一個(gè)命中記錄返回給你。如果處理命中記錄時(shí)不想?yún)^(qū)分各個(gè)物體的話,可以讓多個(gè)物體共享一個(gè)名字。voidglInitNames(void);清空名字棧。voidglPushName(GLuintname);將name壓入名字棧壓入名字超過棧容量時(shí)將生成一個(gè)GL_STACK_OVERFLOW錯(cuò)誤。名字棧深度因OpenGL實(shí)現(xiàn)(implementations)不同而不同,但最少要能容納64個(gè)名字??梢杂脜?shù)GL_NAME_STACK_DEPTH調(diào)用glGetIntegerv()以獲取名字棧深度。voidglPopName(void);彈出名字棧棧頂?shù)哪且粋€(gè)名字從空棧中彈出名字引發(fā)GL_STACK_UNDERFLOW錯(cuò)誤。voidglLoadName(GLuintname);用name取代名字棧棧頂?shù)哪莻€(gè)名字。如果棧是空的,剛調(diào)用過glInitName()后就是這樣,glLoadName()生成一個(gè)GL_INVALID_OPRATION錯(cuò)。為避免這種情況,如果棧初始時(shí)是空的,那么在調(diào)用glLoadName()之前至少調(diào)用一次glPushName()以在名字棧中放上點(diǎn)東西。交替發(fā)布圖元繪制命令和名字??刂泼?,這樣每個(gè)感興趣的圖元都會(huì)被指定適當(dāng)?shù)拿郑?.1.3退出選擇模式退出選擇模式并處理返回的選擇數(shù)據(jù)(命中記錄)。4.1.4拾取用選擇模式確定物體是否被拾取了,要做到這一點(diǎn),用一個(gè)與投影矩陣相關(guān)聯(lián)的拾取矩陣將繪制限制在視口的一個(gè)很小的區(qū)域里,通常是在光標(biāo)附近。然后允許某種形式的輸入,如點(diǎn)擊鼠標(biāo)的一個(gè)鍵,引發(fā)選擇模式的初始化。建立起選擇模式并使用特定的拾取矩陣,繪制在光標(biāo)附近的物體引發(fā)選擇命中。即,通常在拾取的時(shí)候確定哪個(gè)物體被畫在光標(biāo)附近了。拾取的建立幾乎與正規(guī)的選擇模式完全一樣,只有以下的主要區(qū)別:拾取通常由某個(gè)輸入設(shè)備觸發(fā)。在下面的例子中,按鼠標(biāo)左鍵運(yùn)行實(shí)現(xiàn)拾取的函數(shù)。用例程gluPickMatrix()將一個(gè)特殊的投影矩陣乘到當(dāng)前矩陣上。它要在把投影矩陣乘到棧上之前調(diào)用。voidgluPickMatrix(GLdoublex,Gldoubley,GLdoublewidth,GLdoubleheight,GLintviewport[4]);建立一個(gè)投影矩陣用于將繪制限制在視口的一個(gè)小區(qū)域里,并將這個(gè)矩陣乘到當(dāng)前矩陣棧上。拾取區(qū)域的中心是窗口坐標(biāo)(x,y)處,通常是光標(biāo)位置。width和height定義選取區(qū)域大小,用屏幕坐標(biāo)。Viewport{}表明當(dāng)前視口邊界,這可以用調(diào)用glGetIntegerv(GL_VIEWPORT,GLint*viewport);獲得。gluPickMatrix()建立的矩陣的凈結(jié)果(netresult)是將裁剪區(qū)域變換到單位立方體-1&1e;(x,y,z)&1e;1(或-w&1e;(wx,wy,wz)&1e;w)。拾取矩陣實(shí)際上提供了一個(gè)正交變換將這個(gè)單位立方體的一個(gè)子區(qū)域映射到單位立方體。因?yàn)樽儞Q是任意的,所以可以讓拾取為不同類型的領(lǐng)域工作-如,用于旋轉(zhuǎn)窗口的矩形區(qū)域。在某些情況下,會(huì)發(fā)覺用附加的裁剪平面定義拾取區(qū)域要容易些。圖9拾取流程圖4.2拾取結(jié)果截圖本系統(tǒng)中,未啟用拾取狀態(tài)的物體渲染如圖10與圖11所示,系統(tǒng)中使用物體空間的旋轉(zhuǎn)矩陣變換各個(gè)物體,因此每個(gè)物體在其局部坐標(biāo)系中旋轉(zhuǎn)。圖10對(duì)象拾取前狀態(tài)圖11對(duì)象拾取前狀態(tài)用戶可通過鼠標(biāo)對(duì)物體進(jìn)行拾取,鼠標(biāo)左鍵點(diǎn)擊待拾取的物體,物體被拾取時(shí)的效果如下:圖12第一只對(duì)象被拾取效果圖13第二只對(duì)象被拾取效果圖14第三只對(duì)象被拾取效5結(jié)論與展望5.1結(jié)論本文分析了基于CPU的射線求交拾取技術(shù)、基于GPU的重繪式拾取技術(shù)、OpenGL的選擇機(jī)制技術(shù)三種拾取的實(shí)現(xiàn)原理和優(yōu)缺點(diǎn),本文考慮到只是簡(jiǎn)單地拾取三個(gè)不同的物體,分別是一個(gè)一個(gè)拾取,而不是同時(shí)拾取的過程且拾取物體是簡(jiǎn)單的選擇體的原因,采用了OpenGL本身自帶的選擇機(jī)制拾取實(shí)現(xiàn)了簡(jiǎn)單的三個(gè)不同物體拾取,實(shí)驗(yàn)表明本文的方法是有效的。5.2展望現(xiàn)今越來越多的3D網(wǎng)游游戲出爐,對(duì)電腦的配置要求也越來越高,對(duì)最基本的對(duì)象拾取也越來越嚴(yán)格,而拾取的關(guān)鍵是用什么拾取算法。前面分析了各種算法,可以得出基于GPU的重繪式拾取技術(shù)具有明顯的優(yōu)勢(shì),是一種不錯(cuò)的拾取技術(shù)。今后也將繼續(xù)考慮如何可以使重繪式拾取技術(shù)脫離GPU也可以實(shí)現(xiàn)拾取,甚至實(shí)現(xiàn)更快、更簡(jiǎn)單地拾取,讓程序員操作起來更快,更方便,讓游戲玩家玩游戲起來更流暢,拾取各種物品或人物更快。參考文獻(xiàn)[1]MarkSegul,CarlKorobkin,RolfvanWidenfelt等.FastShadowsandLiightingEffectsusingTextureMapping.ComputerGraphics.1992,July,249-252.[2]MichaelDeering,StephanieWinnerandBicSchediwy等.TheTriangleProcessorandNormalVectoreShader.ComputerGraphics.1998,8,21-30.[3]龔堰玨,顏敏.面向?qū)ο蟮慕换ワ@示和拾取模型研究[J].系統(tǒng)仿真學(xué)報(bào),2005.[4]韋宇煒.基于OpenGL技術(shù)的三維游戲引擎開發(fā).廣東工業(yè)大學(xué),2005.

[5]姚繼權(quán),李曉豁.計(jì)算機(jī)圖形學(xué)人機(jī)交互中三維拾取方法的研究工程設(shè)計(jì)學(xué)報(bào)2006.3-20[6]Masaaki.Oka,KyoyaTsutsui,AkioOhba等.Real-ThneManipulationofTexture-MappedSurfaces.ComputerGraphicsa1997,7.[7]劉力強(qiáng),周明全.一種平行透視下的三維拾取方法[J].西南大學(xué)學(xué)報(bào),2002.[8]OpenGLSpecification.http://www.open91.ore.[9]DonaldHearn等.計(jì)算機(jī)圖形學(xué)(第三版)[M].北京:電子工業(yè)H版社,2005.[10]AngelE.OpenGL編程基礎(chǔ)[M].北京:清華大學(xué)出版社,2008.[12]3DGameDevelopmentOnJSR-184..[13]EricFreeman,HeadFirstDesignPattern[M].O’REILLY,2005.[14]openGLProgrammingGuide網(wǎng)絡(luò)版.Addison--WesleyPublishingCompany.[15]MicrosoftVisualC++6.0技術(shù)內(nèi)幕,DavidJ.Kruglinski,ScotWingo,GeorgeShepherd著.北京希望電子出版社1999年5月第1版.[16]Mason.Woo,JcakieNeider,TomDavis等著.吳斌,段海波,薛鳳武譯.OpenGL編程權(quán)威指南.北京:中國(guó)電力出版社,310-312.[17]Richards.Wright,Jr.MichaelSweet著.瀟湘工作室譯.OpenGL超級(jí)寶典.北京:人民郵電出版社,2001.251-257.[18]CatmullE.A.SubdivisionAlgorithmforComputerDisplayofCurvedSurfaces.PhDthesis.UniversityofUtah.1974

[19]喬林,費(fèi)廣正.OpenGL程序設(shè)計(jì).北京:清華大學(xué)出版社,2000.

[20]白燕斌,史惠康.OpenGL三維圖形編程指南.北京:機(jī)械工業(yè)出版社,1998.[21]彭群生,鮑虎軍,金小剛.計(jì)算機(jī)真實(shí)感圖形的算法基礎(chǔ)[M].北京:科學(xué)出版社,1999.[22]DaveShreiner著.(OpenGL參考手冊(cè)》.機(jī)械工業(yè)出版社.2001.[23]孫家廣等.計(jì)算機(jī)圖形學(xué)(第三版).北京:清華大學(xué)出版社,1998,286.357.[24]F.S.Hill,JR著.<計(jì)算機(jī)圖形學(xué)一一用OpenGL實(shí)現(xiàn)(第二二版)》.羅霄等譯.清華大學(xué)出版社.2006.[25]瀟湘工作室.OpenGL超級(jí)寶典[M].北京:人民郵電出版社,2001[26]和平鴿工作室.OpenGL高級(jí)編程與可視化系統(tǒng)開發(fā)[M].北京:中國(guó)水利水電出版社,2003.[27]孫家廣,胡事民.計(jì)算機(jī)圖形學(xué)基礎(chǔ)教程[M].北京:清華大學(xué)出版社,2005.[28]王汝傳.計(jì)算機(jī)圖形技術(shù)原理及應(yīng)用[M].北京:人民郵電出版社,1998.[29]費(fèi)廣正,蘆麗丹,陳立新.可視化OpenGL程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2001.[30]孫家廣,楊長(zhǎng)貴.計(jì)算機(jī)圖形學(xué)(第三版)[M].北京:清華大學(xué)出版社。1998.[31]HeranD,BakerMP.計(jì)算機(jī)圖形學(xué).北京:清華大學(xué)出版社,1998.[32]蔡士杰,等譯.ComputerGraphicswithOpenGL(ThirdEdition)[M].北京:電子工業(yè)出版社,2005.[33]吳斌.OpenGL編程權(quán)威指南[M].北京:中國(guó)電力出版社,2001.[34]彭群生,等.計(jì)算機(jī)真實(shí)感圖形的算法基礎(chǔ)[M].北京:北京科學(xué)出版社,2003.[35]江早.OpenGL圖形編程[M].科學(xué)出版社,2001.[36]喬林,費(fèi)廣正等.程序設(shè)計(jì)0peoGL[Ⅵ].清華大學(xué)出版杜,2000.[37]曾建超,俞志和.虛擬現(xiàn)實(shí)的技術(shù)及其應(yīng)用Ⅶ.北京:清華大學(xué)出版社,2003.[38]圈石教英.虛擬現(xiàn)實(shí)基礎(chǔ)及實(shí)用算法嗍.北京:科學(xué)出版社,2002.[39]倪明田.計(jì)算機(jī)圖形學(xué)[M].北京:北京大學(xué)出版社,1999.[40]李自力.虛擬現(xiàn)實(shí)中基于圖形與圖像的混合建模技術(shù).中國(guó)圖象圖形學(xué)報(bào).2001.1.96-100.[41]WrightRS,SweetJM.OpenGL超級(jí)寶典.北京:人民郵電出版社,2000.[42]喬林,費(fèi)廣正等.OpenGL程序設(shè)計(jì).北京:清華大學(xué)出版社,2000.1-121..[43]彭群生,鮑虎軍,金小剛.計(jì)算機(jī)真實(shí)感圖形的算法基礎(chǔ).北京:科學(xué)出版社,1999,6.227-229.致謝半年的設(shè)計(jì)時(shí)間雖然短暫,我卻從中學(xué)到了很多的東西。我由衷地感謝關(guān)懷、教誨、幫助、支持和鼓勵(lì)我完成設(shè)計(jì)的老師和同學(xué)。特別感謝我的導(dǎo)師,半年來他在學(xué)習(xí)、科研上一直對(duì)我悉心指導(dǎo),嚴(yán)格要求、熱情鼓勵(lì),為我創(chuàng)造了很多鍛煉提高的機(jī)會(huì)。老師洞察全局、高屋建瓴,為我的論文的順利完成指出了很好的方向,鄭老師淵博的知識(shí)、寬廣無私的胸懷、夜以繼日的工作態(tài)度、對(duì)事業(yè)的執(zhí)著追求、誨人不倦的教師風(fēng)范和對(duì)問題的敏銳觀察力,都將使我畢生受益。在此我謹(jǐn)向我的導(dǎo)師以及在畢業(yè)設(shè)計(jì)過程中給予我很大幫助的老師、同學(xué)們致以最誠(chéng)摯的謝意!基于C8051F單片機(jī)直流電動(dòng)機(jī)反饋控制系統(tǒng)的設(shè)計(jì)與研究基于單片機(jī)的嵌入式Web服務(wù)器的研究MOTOROLA單片機(jī)MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對(duì)良率的影響研究基于模糊控制的電阻釬焊單片機(jī)溫度控制系統(tǒng)的研制基于MCS-51系列單片機(jī)的通用控制模塊的研究基于單片機(jī)實(shí)現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機(jī)控制的二級(jí)倒立擺系統(tǒng)的研究基于增強(qiáng)型51系列單片機(jī)的TCP/IP協(xié)議棧的實(shí)現(xiàn)基于單片機(jī)的蓄電池自動(dòng)監(jiān)測(cè)系統(tǒng)基于32位嵌入式單片機(jī)系統(tǒng)的圖像采集與處理技術(shù)的研究基于單片機(jī)的作物營(yíng)養(yǎng)診斷專家系統(tǒng)的研究基于單片機(jī)的交流伺服電機(jī)運(yùn)動(dòng)控制系統(tǒng)研究與開發(fā)基于單片機(jī)的泵管內(nèi)壁硬度測(cè)試儀的研制HYPERLINK"/detail.htm?23416

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論