計算機(jī)圖形學(xué)試驗指導(dǎo)書1_第1頁
計算機(jī)圖形學(xué)試驗指導(dǎo)書1_第2頁
計算機(jī)圖形學(xué)試驗指導(dǎo)書1_第3頁
計算機(jī)圖形學(xué)試驗指導(dǎo)書1_第4頁
計算機(jī)圖形學(xué)試驗指導(dǎo)書1_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、PAGE 計算機(jī)圖形學(xué)實 驗 指 導(dǎo) 書Ver 2.0傅由甲 盧宇 編重慶理工大學(xué)計算機(jī)科學(xué)與工程學(xué)院2008年10月 PAGE II目 錄 TOC o 1-2 h z u HYPERLINK l _Toc210449899 目 錄 PAGEREF _Toc210449899 h I HYPERLINK l _Toc210449900 1 OpenGL與三維圖形 PAGEREF _Toc210449900 h 1 HYPERLINK l _Toc210449901 1.1 OpenGL介紹 PAGEREF _Toc210449901 h 1 HYPERLINK l _Toc210449902

2、1.2 OpenGL函數(shù)的語法 PAGEREF _Toc210449902 h 3 HYPERLINK l _Toc210449903 1.3 OpenGL是狀態(tài)機(jī) PAGEREF _Toc210449903 h 4 HYPERLINK l _Toc210449904 1.4 OpenGL相關(guān)的函數(shù)庫 PAGEREF _Toc210449904 h 4 HYPERLINK l _Toc210449905 1.5 OpenGL的緩沖區(qū) PAGEREF _Toc210449905 h 4 HYPERLINK l _Toc210449906 2 Microsoft Visual C+ 6.0 MFC

3、編程基礎(chǔ) PAGEREF _Toc210449906 h 6 HYPERLINK l _Toc210449907 2.1 MFC事件驅(qū)動簡介 PAGEREF _Toc210449907 h 6 HYPERLINK l _Toc210449908 2.2 MFC事件驅(qū)動編程 PAGEREF _Toc210449908 h 6 HYPERLINK l _Toc210449909 2.3 在VC下實現(xiàn)OpenGL程序的編譯 PAGEREF _Toc210449909 h 12 HYPERLINK l _Toc210449910 實驗1 Windows操作系統(tǒng)圖形開發(fā)基礎(chǔ) PAGEREF _Toc21

4、0449910 h 13 HYPERLINK l _Toc210449911 一、實驗要求和目的 PAGEREF _Toc210449911 h 13 HYPERLINK l _Toc210449912 二、相關(guān)知識提要 PAGEREF _Toc210449912 h 13 HYPERLINK l _Toc210449913 三、實驗內(nèi)容及步驟 PAGEREF _Toc210449913 h 15 HYPERLINK l _Toc210449914 四、實驗習(xí)題 PAGEREF _Toc210449914 h 18 HYPERLINK l _Toc210449915 實驗2 基本光柵圖形生成

5、PAGEREF _Toc210449915 h 19 HYPERLINK l _Toc210449916 一、實驗要求和目的 PAGEREF _Toc210449916 h 19 HYPERLINK l _Toc210449917 二、相關(guān)知識提要 PAGEREF _Toc210449917 h 19 HYPERLINK l _Toc210449918 三、實驗內(nèi)容及題目 PAGEREF _Toc210449918 h 22 HYPERLINK l _Toc210449919 實驗3 圖形變換 PAGEREF _Toc210449919 h 24 HYPERLINK l _Toc2104499

6、20 一、實驗要求和目的 PAGEREF _Toc210449920 h 24 HYPERLINK l _Toc210449921 二、相關(guān)知識提要 PAGEREF _Toc210449921 h 24 HYPERLINK l _Toc210449922 三、實驗內(nèi)容及步驟 PAGEREF _Toc210449922 h 26 HYPERLINK l _Toc210449923 四、實驗習(xí)題 PAGEREF _Toc210449923 h 27 HYPERLINK l _Toc210449924 實驗四 交互式繪圖技術(shù) PAGEREF _Toc210449924 h 28 HYPERLINK

7、l _Toc210449925 一、實驗要求和目的 PAGEREF _Toc210449925 h 28 HYPERLINK l _Toc210449926 二、實驗內(nèi)容及步驟 PAGEREF _Toc210449926 h 28 HYPERLINK l _Toc210449927 三、實驗習(xí)題 PAGEREF _Toc210449927 h 33 HYPERLINK l _Toc210449928 實驗五 光照處理 PAGEREF _Toc210449928 h 34 HYPERLINK l _Toc210449929 一、實驗要求和目的 PAGEREF _Toc210449929 h 34

8、 HYPERLINK l _Toc210449930 二、相關(guān)知識提要 PAGEREF _Toc210449930 h 34 HYPERLINK l _Toc210449931 三、實驗內(nèi)容及步驟 PAGEREF _Toc210449931 h 37 HYPERLINK l _Toc210449932 四、實驗習(xí)題 PAGEREF _Toc210449932 h 40 HYPERLINK l _Toc210449933 實驗六 紋理映射 PAGEREF _Toc210449933 h 41 HYPERLINK l _Toc210449934 一、實驗要求和目的 PAGEREF _Toc2104

9、49934 h 41 HYPERLINK l _Toc210449935 二、相關(guān)知識提要 PAGEREF _Toc210449935 h 41 HYPERLINK l _Toc210449936 三、實驗內(nèi)容及步驟 PAGEREF _Toc210449936 h 44 HYPERLINK l _Toc210449937 四、實驗習(xí)題 PAGEREF _Toc210449937 h 45 HYPERLINK l _Toc210449938 實驗七 曲面生成 PAGEREF _Toc210449938 h 46 HYPERLINK l _Toc210449939 一、實驗要求和目的 PAGERE

10、F _Toc210449939 h 46 HYPERLINK l _Toc210449940 二、相關(guān)知識提要 PAGEREF _Toc210449940 h 46 HYPERLINK l _Toc210449941 三、實驗內(nèi)容及步驟 PAGEREF _Toc210449941 h 49 HYPERLINK l _Toc210449942 四、實驗習(xí)題 PAGEREF _Toc210449942 h 54 HYPERLINK l _Toc210449943 實驗八 綜合實驗(供優(yōu)秀學(xué)生選做) PAGEREF _Toc210449943 h 55 HYPERLINK l _Toc2104499

11、44 一、實驗要求和目的 PAGEREF _Toc210449944 h 55 HYPERLINK l _Toc210449945 二、實驗內(nèi)容 PAGEREF _Toc210449945 h 55 HYPERLINK l _Toc210449946 三、實驗步驟 PAGEREF _Toc210449946 h 55 PAGE 861 OpenGL與三維圖形1.1 OpenGL介紹我們生活在一個充滿三維物體的三維世界中,為了使計算機(jī)能精確地再現(xiàn)這些物體,必須能在三維空間描繪這些物體。最近幾年計算機(jī)圖形學(xué)的發(fā)展使得三維表現(xiàn)技術(shù)得以形成,這些三維表現(xiàn)技術(shù)使我們能夠再現(xiàn)三維世界中的物體,能夠用三維形

12、體來表示復(fù)雜的信息,這種技術(shù)就是可視化(Visualization) 技術(shù)。OpenGL已被認(rèn)為是高性能圖形和交互式視景處理的標(biāo)準(zhǔn),目前包括ATT公司UNIX軟件實驗室、IBM公司、DEC公司、SUN公司、HP公司、Microsoft公司和SGI公司在內(nèi)的幾家在計算機(jī)市場占領(lǐng)導(dǎo)地位的大公司都采用了OpenGL圖形標(biāo)準(zhǔn)。值得一提的是,由于Microsoft公司在Windows NT、Windows97及后續(xù)版本中提供OpenGL圖形標(biāo)準(zhǔn),OpenGL在微機(jī)中廣泛應(yīng)用,人們可以在微機(jī)上實現(xiàn)三維圖形應(yīng)用,如CAD設(shè)計、仿真模擬、三維游戲等。OpenGL實際上是一種圖形與硬件的接口。它包括了100多個

13、圖形函數(shù),開發(fā)者可以用這些函數(shù)來建立三維模型和進(jìn)行三維實時交互。為了實現(xiàn)一個完整功能的圖形處理系統(tǒng),設(shè)計一個與OpenGL相關(guān)的系統(tǒng)結(jié)構(gòu)為:其最底層是圖形硬件,第二層為操作系統(tǒng),第三層為窗口系統(tǒng),第四層為OpenGL,第五層為應(yīng)用軟件。由于許多在計算機(jī)界具有領(lǐng)導(dǎo)地位的計算機(jī)公司紛紛采用OpenGL作為三維圖形應(yīng)用程序設(shè)計界面,OpenGL應(yīng)用程序具有廣泛的移植性。因此,OpenGL已成為目前的三維圖形開發(fā)標(biāo)準(zhǔn),是從事三維圖形開發(fā)工作的技術(shù)人員所必須掌握的開發(fā)工具。OpenGL作為一個與硬件獨立的圖形接口,它不提供與硬件密切相關(guān)的設(shè)備操作函數(shù),同時,它也不提供描述類似于飛機(jī)、汽車、分子形狀等復(fù)雜

14、形體的圖形操作函數(shù)。用戶必須從點、線、面等最基本的圖形單元開始構(gòu)造自己的三維模型。OpenGL提供了以下的對三維物體的繪制方式:線框繪圖方式(wireframe)-這種方式僅繪制三維物體的網(wǎng)格輪廓線;深度優(yōu)先線框繪圖方式(depth_cued)-用線框方式繪圖,增加模擬人眼看物體一樣的效果,遠(yuǎn)處的物體比近處的物體要暗些;反走樣線框繪圖方式(antialiased)-用線框方式繪圖,繪圖時采用反走樣技術(shù)以減少圖形線條的參差不齊;平面消隱繪圖方式(flat_shade)-對模型的隱藏面進(jìn)行消隱,對模型的平面單元按光照程度進(jìn)行著色但不進(jìn)行光滑處理;光滑消隱繪圖方式(smooth_shade)-對模型

15、進(jìn)行消隱按光照渲染著色的過程中再進(jìn)行光滑處理,這種方式更接近于現(xiàn)實;加陰影和紋理的繪圖方式(shadows,textures)-在模型表面貼上紋理甚至于加上光照陰影,使得三維景觀象照片一樣;運(yùn)動模糊的繪圖方式(motion-blured)-模擬物體運(yùn)動時人眼觀察所感覺的動感現(xiàn)象;大氣環(huán)境效果(atmosphere-effects)-在三維景觀中加入如霧等大氣環(huán)境效果,使人身臨其境;深度域效果(depth-of-effects)-類似于照相機(jī)鏡頭效果,模型在聚焦點處清晰,反之則模糊。整個OpenGL的基本工作流程如下圖幾何頂點數(shù)據(jù)顯示列表評價器逐個頂點操作和圖元組裝紋理映射光柵化片元操作幀緩沖區(qū)

16、像素數(shù)據(jù)像素操作圖1-1 OpenGL基本工作流程其中幾何頂點數(shù)據(jù)包括模型的頂點集、線集、多邊形集,這些數(shù)據(jù)經(jīng)過流程圖的上部,包括運(yùn)算器、逐個頂點操作等;像素數(shù)據(jù)包括像素集、影像集、位圖集等,像素數(shù)據(jù)的處理方式與幾何頂點數(shù)據(jù)的處理方式是不同的,但它們都經(jīng)過光柵化、逐個片元(Fragment)處理直至把最后的光柵數(shù)據(jù)寫入幀緩沖器。在OpenGL中的所有數(shù)據(jù)包括幾何頂點數(shù)據(jù)和像素數(shù)據(jù)都可以被存儲在顯示列表中或者立即可以得到處理。OpenGL要求把所有的幾何圖形單元都用頂點來描述,這樣運(yùn)算器和逐個頂點計算操作都可以針對每個頂點進(jìn)行計算和操作,然后進(jìn)行光柵化形成圖形片元;對于像素數(shù)據(jù),像素操作結(jié)果被存

17、儲在紋理組裝用的內(nèi)存中,再象幾何頂點操作一樣光柵化形成圖形片元。整個流程操作的最后,圖形片元都要進(jìn)行一系列的逐個片元操作,這樣最后的像素值被送入幀緩沖器實現(xiàn)圖形的顯示。在OpenGL中進(jìn)行主要的圖形操作直至在計算機(jī)屏幕上渲染繪制出三維圖形景觀的基本步驟為:根據(jù)基本圖形單元建立景物模型,并且對所建立的模型進(jìn)行數(shù)學(xué)描述(OpenGL中把點、線、多邊形、圖像和位圖都作為基本圖形單元);把景物模型放在三維空間中的合適的位置,并且設(shè)置視點(viewpoint)以觀察所感興趣的景觀;計算模型中所有物體的色彩,其中的色彩根據(jù)應(yīng)用要求來確定,同時確定光照條件、紋理粘貼方式等;把景物模型的數(shù)學(xué)描述及其色彩信息轉(zhuǎn)

18、換至計算機(jī)屏幕上的像素,這個過程也就是光柵化(rasterization)。在這些步驟的執(zhí)行過程中,OpenGL可能執(zhí)行其他的一些操作,例如自動消隱處理等。另外,景物光柵化之后被送入幀緩沖器之前還可以根據(jù)需要對像素數(shù)據(jù)進(jìn)行操作。OpenGL能夠?qū)φ麄€三維模型進(jìn)行渲染著色,從而繪制出與客觀世界十分類似的三維景象。另外OpenGL還可以進(jìn)行三維交互、動作模擬等。具體的功能主要有以下這些內(nèi)容。(1)模型繪制OpenGL能夠繪制點、線和多邊形。應(yīng)用這些基本的形體,可以構(gòu)造出幾乎所有的三維模型。OpenGL通常用模型的多邊形的頂點來描述三維模型。(2)模型觀察在建立了三維景物模型后,就需要用OpenGL

19、描述如何觀察所建立的三維模型。觀察三維模型是通過一系列的坐標(biāo)變換進(jìn)行的。模型的坐標(biāo)變換使觀察者能夠在視點位置觀察與視點相適應(yīng)的三維模型景觀。在整個三維模型的觀察過程中,投影變換的類型決定觀察三維模型的觀察方式,不同的投影變換得到的三維模型的景象也是不同的。最后的視窗變換則對模型的景象進(jìn)行裁剪縮放,即決定整個三維模型在屏幕上的圖像。(3)顏色模式的指定OpenGL應(yīng)用了一些專門的函數(shù)來指定三維模型的顏色。程序開發(fā)者可以選擇二個顏色模式,即RGBA模式和顏色表模式。在RGBA模式中,顏色直接由RGB值來指定;在顏色表模式中,顏色值則由顏色表中的一個顏色索引值來指定。開發(fā)者還可以選擇平面著色和光滑著

20、色二種著色方式對整個三維景觀進(jìn)行著色。(4)光照應(yīng)用用OpenGL繪制的三維模型必須加上光照才能更加與客觀物體相似。OpenGL提供了管理四種光(自發(fā)光、環(huán)境光、鏡面光和漫反射光)的方法,另外還可以指定模型表面的反射特性。(5)圖像效果增強(qiáng)OpenGL提供了一系列的增強(qiáng)三維景觀的圖像效果的函數(shù),這些函數(shù)通過反走樣、混合和霧化來增強(qiáng)圖像的效果。反走樣用于改善圖像中線段圖形的鋸齒而更平滑,混合用于處理模型的半透明效果,霧使得影像從視點到遠(yuǎn)處逐漸褪色,更接近于真實。(6)位圖和圖像處理OpenGL還提供了專門對位圖和圖像進(jìn)行操作的函數(shù)。(7)紋理映射三維景物因缺少景物的具體細(xì)節(jié)而顯得不夠真實,為了更

21、加逼真地表現(xiàn)三維景物,OpenGL提供了紋理映射的功能。OpenGL提供的一系列紋理映射函數(shù)使得開發(fā)者可以十分方便地把真實圖像貼到景物的多邊形上,從而可以在視窗內(nèi)繪制逼真的三維景觀。(8)實時動畫為了獲得平滑的動畫效果,需要先在內(nèi)存中生成下一幅圖像,然后把已經(jīng)生成的圖像從內(nèi)存拷貝到屏幕上,這就是OpenGL的雙存技術(shù)(double buffer)。OpenGL提供了雙緩存技術(shù)的一系列函數(shù)。(9)交互技術(shù)目前有許多圖形應(yīng)用需要人機(jī)交互,OpenGL提供了方便的三維圖形人機(jī)交互接口,用戶可以選擇修改三維景觀中的物體。1.2 OpenGL函數(shù)的語法OpenGL函數(shù)以“gl”為前綴,并把組成函數(shù)名的每

22、個單詞的首字母進(jìn)行大寫(glClearColor())。類似地,OpenGL還定義了以前綴GL_開頭的常量,所有單詞使用大寫形式,并以下劃線分割(例如GL_COLOR_BUFFER_BIT)。此外,有些函數(shù),同一函數(shù)有多個不同版本,如glColor3f(),glColor3ub(),glColor3bv()等都用于設(shè)置當(dāng)前繪圖顏色,其中“3”表示函數(shù)接受3個參數(shù),“f”表示參數(shù)類型為浮點數(shù),“ub”表示參數(shù)類型為8位無符號整數(shù),“bv”表示參數(shù)是含3個元素的數(shù)組,數(shù)組中每個元素為8位無符號整數(shù)。OpenGL為同一函數(shù)定義不同參數(shù)類型的版本主要為了方便用戶根據(jù)自己的數(shù)據(jù)格式向OpenGL傳遞參數(shù)

23、。表1-1列出用于指定數(shù)據(jù)類型的后綴字母,以供參考:后綴數(shù)據(jù)類型對應(yīng)典型C語言O(shè)penGL類型定義b8位整數(shù)signed charGLbytes16位整數(shù)shortGLshorti32位整數(shù)int或longGLint, GLsizeif32位浮點數(shù)floatGLfloat, GLclampfd64位浮點數(shù)doubleGLdouble, GLclampdub8位無符號整數(shù)unsigned charGLubyte, GLbooleanus16位無符號整數(shù)unsigned shortGLushortui32位無符號整數(shù)unsigned int或unsigned longGLuint, GLenum,

24、 GLbitfield1.3 OpenGL是狀態(tài)機(jī)OpenGL是個狀態(tài)機(jī)。設(shè)置它的各種狀態(tài)(或模式),則這些狀態(tài)一直生效,直到它們被修改。OpenGL所維護(hù)的狀態(tài)變量很多,例如顏色,控制當(dāng)前視圖和投影變換,直線和多邊形點畫模式,多邊形繪圖模式,像素包裝約定,光照位置和特征,被繪制物體的材料屬性等。許多表示模式的狀態(tài)變量可以用glEnable()和glDisable()函數(shù)進(jìn)行啟用和禁用。每個狀態(tài)變量(或模式)都有一個默認(rèn)值。任何時候,都可以向系統(tǒng)查詢每個狀態(tài)變量的當(dāng)前值。使用6個函數(shù)之一完成這個任務(wù):glGetBooleanv(),glGetDoublev(),glGetFloatv(),gl

25、GetIntegerv(),glGetPointerv(),glIsEnabled()。所選擇的具體函數(shù)取決于希望返回的結(jié)果的數(shù)據(jù)類型。有些狀態(tài)變量還有更為特定的查詢函數(shù),可以查閱OpenGL編程指南等參考書,在此不在詳述。1.4 OpenGL相關(guān)的函數(shù)庫OpenGL提供了一組功能強(qiáng)大但又比較原始的渲染函數(shù),所有高層繪圖操作必須根據(jù)這些函數(shù)完成。同樣,OpenGL程序必須使用窗口系統(tǒng)的底層機(jī)制。有一些函數(shù)庫可以用來幫助簡化任務(wù),它們是:OpenGL工具函數(shù)庫(GLU)包含了一些函數(shù),它們利用低層OpenGL函數(shù)來執(zhí)行諸如為特定視圖定向和投影設(shè)置矩陣、多邊形分格化以及表面渲染等任務(wù)。所有Open

26、GL實現(xiàn)都把這個函數(shù)庫作為它的一部分。GLU函數(shù)都使用前綴glu。所有的窗口系統(tǒng)都提供一個函數(shù)庫,對該窗口系統(tǒng)的功能進(jìn)行擴(kuò)展,以支持OpenGL渲染。對于Microsoft Windows,WGL函數(shù)提供了Windows到OpenGL的接口。所有的WGL函數(shù)都使用前綴wgl。OpenGL實用工具包(GLUT)是Mark Kilgard所編寫的一個獨立于窗口系統(tǒng)的工具包,其目的是隱藏不同窗口系統(tǒng)API的復(fù)雜性。GLUT函數(shù)使用前綴glut。1.5 OpenGL的緩沖區(qū)OpenGL需要用到4個緩沖區(qū)進(jìn)行圖形顯示,它們分別是:顏色緩存、深度緩存、模板緩存和累積緩存。這里我們只介紹顏色緩存和深度緩存的

27、基本概念,更多內(nèi)容請參閱OpenGL編程指南。1.5.1顏色緩存顏色緩存由紅、綠、藍(lán)、alpha位等位平面(bitplane)組成的,有前緩存(front buffer)、后緩存(back buffer)、左前(front_left)和右前(front_right)緩存、左后(back_left)和右后(back_right)緩存。左前緩存是必須的顏色緩存。前緩存是可見緩存,后緩存是不可見緩存。前后緩存技術(shù)可以實現(xiàn)動畫操作。與顏色緩存相關(guān)的主要函數(shù)有:清除顏色緩存:glClear(GL_COLOR_BUFFER_BIT),用于清除當(dāng)前顯示緩沖區(qū)內(nèi)容,為開始新的繪制做好準(zhǔn)備。設(shè)置清除顏色:glC

28、learColor(red,green,blue,alpha),用當(dāng)前顏色(red,green,blue,alpha)清除當(dāng)前顯示緩沖區(qū)內(nèi)容,為開始新的繪制做好準(zhǔn)備。屏蔽顏色緩存:glColorMask(),分別設(shè)置紅、綠、藍(lán)和alpha的可寫屬性。選擇顏色緩存:glDrawBuffer(),對雙緩存中的一個進(jìn)行選擇。交換顏色緩存:swapBuffer(),交換前后緩存中的顏色,以實現(xiàn)動畫。1.5.2 深度緩存深度緩存也叫Z-buffer,它記錄每個像素點所對應(yīng)的物體點到視點的距離,由此決定表面的可見性。在進(jìn)行消隱的時候,OpenGL必須知道各物體間的相對位置關(guān)系,從而模擬出物體相互遮擋的效果

29、,因此,需要進(jìn)行深度測試。而深度測試的結(jié)果就生成了深度緩存。與深度緩存相關(guān)的OpenGL操作主要有:清除深度緩存:glClear(GL_DEPTH_BUFFER_BIT),用于清除當(dāng)前顯示緩沖區(qū)內(nèi)容,為開始新的繪制做好準(zhǔn)備。設(shè)置清除值:glClearDepth(1.0),1.0為最大深度。屏蔽深度緩存:glDepthMask(GL_TRUE),表示可以寫深度緩存;glDepthMask(GL_FALSE),表示禁止寫深度緩存。啟動和關(guān)閉深度測試:glEnableGL_DEPTH_TEST),表示開啟深度測試;glDisable(GL_DEPTH_TEST),表示禁止深度測試。確定測試條件:gl

30、DepthFunc(),根據(jù)函數(shù)參數(shù)確定測試方式,具體的參數(shù)說明請參考實驗五。確定深度范圍:glDepthRange(GLclampd zNear, GLclampd zFar),參數(shù)zNear和zFar分別說明視景體的前景和后景面向窗口坐標(biāo)映射的規(guī)格化坐標(biāo),便于后續(xù)使用。2 Microsoft Visual C+ 6.0 MFC編程基礎(chǔ)2.1 MFC事件驅(qū)動簡介用OpenGL編寫的程序結(jié)構(gòu)類似于用其他語言編寫的程序。實際上,OpenGL是一個豐富的三維圖形函數(shù)庫,編寫OpenGL程序并非難事,只需在基本C語言中調(diào)用這些函數(shù),用法同Turbo C、VC+等類似。微軟基礎(chǔ)類庫(Microsoft

31、 foundation class,MFC)是微軟為Windows程序員提供的一個面向?qū)ο蟮腤indows編程接口,它大大簡化了Windows編程工作,使開發(fā)人員不必從頭設(shè)計創(chuàng)建和管理一個標(biāo)準(zhǔn)Windows應(yīng)用程序所需的程序,節(jié)省了時間;同時它提供了大量代碼,指導(dǎo)用戶編程時實現(xiàn)某些技術(shù)和功能。在事件驅(qū)動編程方面,通過MFC的核心消息映射機(jī)制,定義一個消息與處理函數(shù)的對照表,實現(xiàn)消息處理的分離編程。每當(dāng)產(chǎn)生一個事件,便可通過這個對照表找到相應(yīng)的消息處理函數(shù),執(zhí)行這個函數(shù)完成相應(yīng)功能;相應(yīng)的,程序員只需利用VC集成開發(fā)環(huán)境提供的工具指定當(dāng)鼠標(biāo)在哪個GUI對象上操作時執(zhí)行哪個函數(shù)即可,MFC事件驅(qū)動

32、編程模式如圖2.1所示。2.1 MFC中事件驅(qū)動編程模式為了提高交互式繪圖性能,為以后二維/三維開發(fā)打下基礎(chǔ),考慮到Microsoft Visual C+ 的MFC開發(fā)環(huán)境提供了GDI工具及相對較好的交互式繪圖環(huán)境,所以,本書采用該環(huán)境進(jìn)行二維/三維圖形的實驗。2.2 MFC事件驅(qū)動編程2.2.1 建立MFC工程步驟一:打開Microsoft Visual C+ 6.0 應(yīng)用程序。在菜單中選擇“文件”“新建”打開建立用戶應(yīng)用程序?qū)υ捒?,在對話框的“工程”頁面左邊選擇MFC AppWizardexe;在右邊“位置”編輯框中鍵入要建的項目存放位置,例如D盤根目錄;在右邊“工程”編輯框中鍵入要建的項

33、目的名稱,例如MFCTest,這時我們會看到“位置”編輯框中信息變?yōu)椤癉:MFCTest”,表示我們的項目文件都將存放在這個目錄中。如圖2.2所示。圖2.2:建立MFC應(yīng)用程序步驟二:我們點擊“確定”按鈕進(jìn)行下一步設(shè)置。在“MFC AppWizard Step 1”對話框中有“S單個文檔”、“M多個文檔”“D基本對話框”三個選項?!癝單個文檔”表示用戶程序一次只能打開一個文檔窗口;“M多個文檔”表示用戶程序除了一個文檔主窗口外,還可以打開若干個顯示不同文檔的小窗口,即子窗口;“D基本對話框”表示用戶程序的界面是對話框形式的。這里我們選擇“S單個文檔”,然后,單擊“下一個”按鈕。如圖2.3所示。

34、圖2.3:MFC AppWizard Step 1步驟三:“MFC AppWizard Step 2 of 6”對話框是關(guān)于所建立的程序是否用到數(shù)據(jù)庫,我們選擇“否”,然后,單擊“下一個”按鈕。步驟四:“MFC AppWizard Step 3 of 6”對話框是關(guān)于所建立的程序是否用到復(fù)合文檔,我們選擇“否”,然后,單擊“下一個”按鈕。步驟五:“MFC AppWizard Step 4 of 6”對話框是關(guān)于所建立的程序的特點及是否支持打印及預(yù)覽,我們選擇其默認(rèn)設(shè)置,單擊“下一個”按鈕。步驟六:“MFC AppWizard Step 5 of 6”對話框是關(guān)于所建立的程序的風(fēng)格等的設(shè)置,我們

35、選擇其默認(rèn)設(shè)置,單擊“下一步”按鈕。步驟七:“MFC AppWizard Step 6 of 6”對話框我們看到VC開發(fā)環(huán)境已經(jīng)為我們的用戶程序生成了四個類,包括它們的類名、頭文件(.h)、實現(xiàn)文件(.cpp)及基類。單擊“完成”按鈕,完成MFC應(yīng)用程序框架的建立。如圖2.4所示。圖2.4:MFC AppWizard Step 6 of 6完成了MFC應(yīng)用程序框架后我們看到MFC用戶程序開發(fā)環(huán)境,如圖2.5所示。圖2.5:MFC用戶程序開發(fā)環(huán)境開發(fā)環(huán)境的左邊是項目工作區(qū),有三頁,依次為類視圖(ClassView)、資源視圖(ResourceView)及文件視圖(FileView),分別對應(yīng)生成

36、的類、項目資源及相應(yīng)文件。開發(fā)環(huán)境右邊文檔區(qū)中則顯示相應(yīng)類的具體代碼。2.2.2 編譯和運(yùn)行MFC用戶程序項目現(xiàn)在開發(fā)環(huán)境已為我們搭建好了框架,我們只需對其進(jìn)行編譯和連接就可以得到一個用戶程序的框架。步驟一:在前面打開MFCTest項目中,選擇菜單的“編譯”(Build)“全部重建”(Rebuild All),對剛才生成的應(yīng)用程序框架進(jìn)行編譯和連接。成功后在開發(fā)環(huán)境的輸出欄里看到“MFCTest.exe - 0 error(s), 0 warning(s)”提示。步驟二:選擇菜單的“編譯”“執(zhí)行MFCTest.exe”,可看到生成的MFC應(yīng)用程序框架。如圖2.6所示。圖2.6:MFCTest應(yīng)

37、用程序框架2.2.3 關(guān)閉和打開用戶程序項目要關(guān)閉MFCTest項目,只需選擇菜單的“文件”“關(guān)閉工作區(qū)”(Close Workspace);反之,要打開一個已存在的用戶程序項目 選擇菜單項“文件”“打開工作區(qū)”(Open Workspace),在彈出的文件對話框中找到要打開的項目名稱,這里是D:MFCTestMFCTest.dsw。如圖2.7所示。圖2.7:打開MFCTest項目2.2.4 在MFC中建立新類的方法右鍵單擊項目工作區(qū)的類視圖頁面的項目名稱,在右鍵菜單中選擇“New Class”,彈出如圖2.8所示“新類(New Class)”對話框:圖2.8 建立新類在Class type中

38、選擇新建類的類型,其中“Generic Class”表示新建一般類,這也是本書實驗中建類時經(jīng)常用到的選項。在Name欄中鍵入類名,按照VC約定,新類以”C”作為前綴,表示建立的是一個類,VC將新建的類按頭文件(*.h)和實現(xiàn)文件(*.cpp)分開保存,并以去掉“C”前綴的類名作為文件名。如果建立的類是一個派生類,則在“Bass class”欄中選擇基類。最后點“OK”鍵完成類的建立。2.2.5 在MFC中添加類成員變量和成員函數(shù)的方法右鍵單擊項目工作區(qū)的類視圖頁面中需添加成員的類名,在右鍵菜單中選擇“Add Member Function”,添加成員函數(shù),或者“Add Member Varia

39、ble”添加成員變量,根據(jù)約定,類的成員變量名一律以”m_”為前綴,以便和臨時變量或全局變量區(qū)別。2.2.6 在MFC中添加菜單項方法步驟一:切換到項目左邊工作區(qū)的資源視圖頁(ResourceView),雙擊“Menu”文件夾下的IDR_MAINFRAME,則項目右邊出現(xiàn)菜單欄。如圖2.9所示。預(yù)留菜項單菜單欄圖2.9 菜單編輯界面步驟二:雙擊菜單欄上的預(yù)留菜單項,彈出菜單項屬性對話框。在其標(biāo)題欄中輸入菜單項標(biāo)題,如“茶壺”,在ID欄中給菜單項取一個ID號,如圖2.10所示。如果沒有取,系統(tǒng)自動命名該菜單項ID,如果對自動命名的ID不滿意(大多數(shù)情況),可以再次打開屬性對話框,給菜單項取一個自

40、己滿意的ID。2.10 菜單項屬性對話框2.2.7 在MFC中添加消息響應(yīng)的方法按照MFC規(guī)定,對于窗口類,如視圖類,對話框類等可以添加事件響應(yīng)處理函數(shù)。方法如下:切換到項目左邊工作區(qū)的類視圖頁(ClassView),鼠標(biāo)右擊需添加事件響應(yīng)的窗口類,在彈出的下拉列表中選擇“Add Windows Message Handler”,彈出“New Windows Message and Event Handlers for class *”對話框,如圖2.11所示。該對話框左邊框中以“WM_”開頭列出所有可供響應(yīng)的事件消息,右上角框中列出項目中已作處理的響應(yīng)事件消息,右下角則列出某個事件消息是哪個

41、類或?qū)ο蟮?。?dāng)我們要處理某個事件時,如“鼠標(biāo)左鍵按下”,我們在彈出的對話框中左邊雙擊 “WM_LBUTTONDOWN”,將其添加到右邊的“Existing message/Event handlers:”列表框中,如圖2.11所示,然后選擇“Add and Edit”,則VC會自動添加該事件的處理函數(shù),并將界面切換到處理函數(shù)位置,供程序員編寫相應(yīng)的處理代碼。2.11 消息/事件處理對話框2.3 在VC下實現(xiàn)OpenGL程序的編譯OpenGL包括*.h庫,*.lib庫和*.dll庫三部分。一般情況下,Windows操作系統(tǒng)已包含OpenGL的核心庫。設(shè)VC安裝在C:Program Files下,

42、則在VC+6.0中*.h核心庫存放在“C:Program FilesMicrosoft Visual StudioVC98IncludeGL”中;*.lib核心庫存放在“C:Program FilesMicrosoft Visual StudioVC98Lib”中;*.dll核心庫存放在“C:WINDOWSsystem32”中。對于OpenGL的其它函數(shù)庫,可放在與核心庫相同的文件夾下。具有OpenGL所需的函數(shù)庫后,在VC+6的“Project”菜單下,選擇“Setting”項,彈出“Project Setting”對話框,選擇“Link”項,在“Libaray”欄目中加入OpenGL提供的

43、函數(shù)庫:“opengl32.lib glu32.lib glaux.lib”。最后,在調(diào)用OpenGL函數(shù)的C+文件中將函數(shù)所在頭文件包含進(jìn)來,就可以使用OpenGL了。實驗1 Windows操作系統(tǒng)圖形開發(fā)基礎(chǔ)一、實驗要求和目的掌握Windows圖形環(huán)境及圖形程序開發(fā)方法;掌握MFC應(yīng)用程序中OpenGL程序開發(fā)基本方法;掌握VC+程序設(shè)計方法。二、相關(guān)知識提要1GDI工具的使用(1)GDI工具主要指MFC中各種GDI(圖形設(shè)備接口)函數(shù),包含了可用于繪制點、線、矩形、多邊形、橢圓、位圖以及文本的功能函數(shù)。VC中對其進(jìn)行封裝,形成GDI對象類,并派生出以下各類:CBitmap、CBrush、

44、CPen、CFont、CPalette、CRgn。(2)在MFC類庫中,CPen類封裝了GDI的畫筆工具,CBrush類封裝了GDI的畫刷工具。在定義畫筆和畫刷工具時,都要調(diào)用構(gòu)造函數(shù)創(chuàng)建默認(rèn)的畫筆(黑色,實線,寬度為一個像素)和畫刷(將封閉圖形內(nèi)部填充為白色)。繪圖時使用畫筆和畫刷步驟如下: 創(chuàng)建CPen類對象或CBrush類對象; 調(diào)用合適的成員函數(shù)初始化畫筆或畫刷; 將畫筆或畫刷對象選入當(dāng)前設(shè)備文本對象,并保存原先的畫筆或畫刷對象; 調(diào)用繪圖函數(shù)繪制圖形; 將原先的畫筆或畫刷對象選入設(shè)備文本對象,以便恢復(fù)原來狀態(tài)。(3)顏色的數(shù)據(jù)類型是COLORREF,表示RGB值是一個32位整數(shù),由R

45、GB(紅,綠,藍(lán))的形式指定,每個分量值從0到255,0最低,255最高。3種顏色分量結(jié)合起來產(chǎn)生實際顏色。指定RGB值可以用手工(如0 x00FF0000是純藍(lán)),也可以用宏RGB()指定,如RGB(255, 0, 0)為紅色。(4)GDI定義畫筆風(fēng)格與含義如表S1.1:表S1.1 畫筆風(fēng)格與含義畫筆風(fēng)格含義畫筆風(fēng)格含義PS_DASH劃線,即虛線PS_INSIDEFRAME在邊界區(qū)域內(nèi)實線PS_DASHDOT點劃線PS_NULL空畫筆PS_DASHDOTDOT雙點劃線PS_SOLID實線PS_DOT點線(5)CBrush的成員函數(shù)CreateSolidBrush用顏色來初始化填充畫刷,函數(shù)原

46、型如下:BOOL CreateSolidBrush(COLORREF crColor);此外,還可調(diào)用成員函數(shù)CreateHatchBrush用某種影線來初始化填充畫刷。函數(shù)原型為:BOOL CreateHatchBrush(int nIndex, COLORREF crColor);其中參數(shù)nIndex用于指定影線模式,其值如表S1.2,crColor用于指定畫刷顏色。表S1.2 畫刷影線模式及含義陰影模式含義陰影模式含義HS_BDIAGONAL反斜線HS_FDIAGONAL斜線HS_CROSS十字線HS_HORIZONAL水平線HS_DIAGCROSS斜十字線HS_VERTICAL豎線(6

47、)除了使用定制的畫筆和畫刷外,MFC中也庫存了一部分繪圖工具,使用時只需調(diào)用CDC成員函數(shù)SelectStockObject即可,函數(shù)原型是:virtual CGdiObject *SelectStockObject(int nIndex);如果調(diào)用成功,返回指向CGdiObject對象的指針(實際指向的對象是CPen或CBrush對象),否則返回NULL。nIndex是所要選入的庫存對象,對于畫筆和畫刷,值如表S1.3。表S1.3 GDI庫存對象含義宏代碼庫存對象宏代碼庫存對象BLACK_BRUSH黑色畫刷NULL_BRUSH空畫刷(內(nèi)部不填充)DKGRAY_BRUSH深灰色畫刷WHITE_

48、BRUSH白色畫刷GRAY_BRUSH灰色畫刷BLACK_PEN黑色畫筆HOLLOW_BRUSH透明窗口畫刷NULL_PEN空畫筆(什么也不畫)LTGRAY_BRUSH淺灰色畫刷WHITE_PEN白色畫筆2Windows下開發(fā)OpenGL程序的基本方法(1)在MFC單文檔應(yīng)用程序中,視圖類用來顯示圖形,需要修改該類的成員函數(shù)代碼實現(xiàn)OpenGL繪圖,主要過程如下: 改造OnCreate函數(shù)開發(fā)OpenGL繪圖程序時,需要設(shè)置像素格式。像素格式告訴OpenGL繪制風(fēng)格、顏色模式、顏色位數(shù)和深度位數(shù)等重要信息。Windows平臺下OpenGL提供了專門函數(shù)進(jìn)行處理??梢栽贠nCreate函數(shù)中定義

49、像素格式,并創(chuàng)建一個OpenGL操作所必須的繪圖上下文RC(rendering context)。使用PIXELFORMATDESCRIPTOR結(jié)構(gòu)指定像素格式,使用wglCreateContext()函數(shù)創(chuàng)建繪圖上下文RC。 改造OnSize函數(shù)當(dāng)視圖發(fā)生變化時,應(yīng)及時將新的客戶區(qū)尺寸通知OpenGL,才能夠正確在窗口客戶區(qū)域顯示三維場景的二維影像,通過命令glViewport完成該工作。 改造OnDestroy函數(shù)在OnDestory成員中用wglMakeCurrent()和wglDeleteContext()斷開OnCreate成員中RC與設(shè)備描述表DC的連接,并釋放RC所占資源。 改造

50、OnDraw函數(shù)在OnDraw函數(shù)完成每次屏幕的繪制。(2)在每次繪制場景前,先要清除OpenGL顯示緩存中的信息,以免影響繪圖效果。用glClearColor設(shè)置屏幕背景顏色;用glClear清除顯示緩存。這兩個函數(shù)為:void glClearColor(red, green, blue,alpha); /背景的RGBA信息void glClear(mask); /清除標(biāo)志緩沖區(qū)mask參數(shù)如表S1.4所示:表S1.4 OpenGL緩沖區(qū)代碼及含義緩沖區(qū)名稱緩沖區(qū)名稱顏色緩沖區(qū)GL_COLOR_BUFFER_BIT累加緩沖區(qū)GL_ACCUM_BUFFER_BIT深度緩沖區(qū)GL_DEPTH_B

51、UFFER_BIT模板緩沖區(qū)GL_STENCIL_BUFFER_BIT三、實驗內(nèi)容及步驟1創(chuàng)建My2D項目和My3D項目建立兩個單文檔MFC項目,一個為My2D,另一個為My3D。My2D項目用于二維GDI繪圖;My3D項目用于三維OpenGL繪圖。2用GDI工具繪制不同顏色、線型和線寬的直線在My2D項目中 在CMy2DView類中添加DrawLine函數(shù)如下:void CMy2DView:DrawLine(CDC *pDC, CPoint startPoint, CPoint endPoint, COLORREF color, int width, unsigned short type/

52、*畫筆風(fēng)格*/)CPen *pOldPen;CPen newPen; /創(chuàng)建一個新畫筆newPen.CreatePen(type, width, color); /設(shè)置畫筆屬性并初始化畫筆pOldPen = pDC-SelectObject(&newPen); /將新畫筆選進(jìn)當(dāng)前設(shè)備,并保存原畫筆pDC-MoveTo(startPoint.x, startPoint.y); /將畫筆移到直線起點pDC-LineTo(endPoint.x, endPoint.y); /將畫筆移到直線終點,實現(xiàn)繪制pDC-SelectObject(pOldPen); /將原畫筆選進(jìn)當(dāng)前設(shè)備,恢復(fù)原來狀態(tài) 在CMy

53、2DView類中的OnDraw函數(shù)中調(diào)用DrawLine函數(shù)(粗體為添加部分),畫一條從(300, 200)到(600, 100),寬度為2,顏色為紅色的虛線。void CMy2DView:OnDraw(CDC* pDC)CMy2DDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);DrawLine(pDC, CPoint(300,200), CPoint(600, 100), RGB(255, 0, 0), 2, PS_DASH);3用GDI工具繪制不同顏色的填充矩形 在CMy2DView類中添加DrawSolidRectangle函數(shù)如下:void C

54、My2DView:DrawSolidRectangle(CDC *pDC, int left, int top, int right, int down, COLORREF filledcolor) CBrush* pOldBrush = NULL; CBrush SolidBrush; SolidBrush.CreateSolidBrush(filledcolor); /設(shè)置畫刷顏色,并初始化一個實畫刷 pOldBrush = (CBrush*)pDC-SelectObject(&SolidBrush); pDC-Rectangle(left, top, right, down);/繪制矩形

55、,參數(shù)分別為左上角點及右下角點x,y坐標(biāo) pDC-SelectObject(pOldBrush); 在CMy2DView類中的OnDraw函數(shù)中調(diào)用DrawSolidRectangle函數(shù)(粗體為添加部分),繪制從左上角(10, 20)到右下角(300, 500),顏色為綠色的矩形。void CMy2DView:OnDraw(CDC* pDC)CMy2DDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);DrawSolidRectangle(pDC, 10, 20, 300, 500, RGB(0, 255, 0);4創(chuàng)建OpenGL繪圖環(huán)境在My3D項目

56、中 在CMy3DView頭文件中添加包含文件: #include 。 在CMy3DView中添加成員變量HGLRC m_hRC,CDC* m_pDC。 在CMy3DView中添加成員函數(shù)InitOpenGL如下:BOOL CMy3DView:InitOpenGL()static PIXELFORMATDESCRIPTOR pfd = sizeof(PIXELFORMATDESCRIPTOR), / pfd大小1, / 結(jié)構(gòu)版本號PFD_DRAW_TO_WINDOW | / 支持窗口PFD_SUPPORT_OPENGL | / 支持OpenGLPFD_DOUBLEBUFFER,/雙緩存PFD_T

57、YPE_RGBA, / RGBA顏色模式24, / 24位顏色深度0, 0, 0, 0, 0, 0, / color bits ignored0, / no alpha buffer0, / shift bit ignored0, / 不使用累積緩存0, 0, 0, 0, / accum bits ignored32, / 32位Z緩沖0, / 不使用模板緩存0, / no auxiliary bufferPFD_MAIN_PLANE, / 選擇主層面0, / 保留0, 0, 0 / layer masks ignored;/得到客戶區(qū)設(shè)備上下文m_pDC = new CClientDC(th

58、is);if(m_pDC = NULL)MessageBox(獲得設(shè)備上下文失敗!);return false;int pixelFormat = :ChoosePixelFormat(m_pDC-GetSafeHdc(), &pfd);BOOL success = :SetPixelFormat(m_pDC-GetSafeHdc(), pixelFormat, &pfd);if (!success)return FALSE;/創(chuàng)建繪圖上下文RCm_hRC = :wglCreateContext (m_pDC-GetSafeHdc();if(m_hRC = 0)MessageBox(繪圖上下文

59、RC創(chuàng)建失敗!);return FALSE;if(:wglMakeCurrent (m_pDC-GetSafeHdc (), m_hRC)=FALSE)MessageBox(關(guān)聯(lián)當(dāng)前RC失敗!);return FALSE;glShadeModel(GL_SMOOTH);/ 啟用光順渲染glClearColor(0.0f, 0.0f, 0.0f, 0.0f);/ 黑色背景return TRUE; 在CMy3DView中添加OnCreate消息響應(yīng)函數(shù),并在其中調(diào)用InitOpenGL()函數(shù)。 在CMy3DView中添加OnSize消息響應(yīng)函數(shù)如下:void CMy3DView:OnSize(U

60、INT nType, int cx, int cy) C3DView:OnSize(nType, cx, cy);if ( 0 = cx | 0 = cy ) return;/ select the full client area:glViewport(0, 0, cx, cy); 在CMy3DView中添加OnDestroy消息響應(yīng)函數(shù)如下:void CMy3DView:OnDestroy() CView:OnDestroy();:wglMakeCurrent (NULL, NULL);:wglDeleteContext(m_hRC);if(m_pDC)/釋放DCdelete m_pDC;

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論