




已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書編者:吳學(xué)毅西安理工大學(xué)印刷包裝工學(xué)院 信息科學(xué)系2010年9月目錄上機(jī)實(shí)驗(yàn)說明1【實(shí)驗(yàn)環(huán)境】1【實(shí)驗(yàn)要求】1【實(shí)驗(yàn)項(xiàng)目及學(xué)時(shí)分配】1【實(shí)驗(yàn)報(bào)告和考核】1【實(shí)驗(yàn)大綱】見附錄A1【實(shí)驗(yàn)環(huán)節(jié)詳細(xì)說明】見附錄B1實(shí)驗(yàn)(一)2【實(shí)驗(yàn)題目】 基本圖元繪制2【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】2【實(shí)驗(yàn)報(bào)告要求】3實(shí)驗(yàn)(二)4【實(shí)驗(yàn)題目】 二維圖元的幾何變換4【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】4【實(shí)驗(yàn)報(bào)告要求】5實(shí)驗(yàn)(三)6【實(shí)驗(yàn)題目】 線段、多邊形裁剪算法實(shí)現(xiàn)6【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】6實(shí)驗(yàn)(四)7【實(shí)驗(yàn)題目】 三維觀察算法實(shí)現(xiàn)7【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】7實(shí)驗(yàn)(五)8【實(shí)驗(yàn)題目】 光照模型與紋理映射實(shí)現(xiàn)8【實(shí)驗(yàn)?zāi)康摹?【實(shí)驗(yàn)內(nèi)容】8【實(shí)驗(yàn)報(bào)告要求】8附錄A9計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)教學(xué)大綱9附錄B11實(shí)驗(yàn)環(huán)節(jié)詳細(xì)說明12 上機(jī)實(shí)驗(yàn)說明【實(shí)驗(yàn)環(huán)境】操作系統(tǒng):Microsoft Windows 2000或以上系統(tǒng)。軟件平臺:Visual C+6.0程序開發(fā)的軟件平臺及OpenGL圖形庫。【實(shí)驗(yàn)要求】1、每次實(shí)驗(yàn)前,熟悉實(shí)驗(yàn)?zāi)康摹?shí)驗(yàn)內(nèi)容及相關(guān)的基本理論知識。2、無特殊要求,原則上實(shí)驗(yàn)為1人1組,必須獨(dú)立完成。3、實(shí)驗(yàn)所用機(jī)器最好固定,以便更好地實(shí)現(xiàn)實(shí)驗(yàn)之間的延續(xù)性和相關(guān)性,并便于檢查。4、按要求認(rèn)真做好實(shí)驗(yàn)過程及結(jié)果記錄?!緦?shí)驗(yàn)項(xiàng)目及學(xué)時(shí)分配】本實(shí)驗(yàn)共計(jì)10學(xué)時(shí),實(shí)驗(yàn)項(xiàng)目及學(xué)時(shí)分配如下:序號實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)類型學(xué)時(shí)要求1基本圖元繪制設(shè)計(jì)2必做2二維圖元的幾何變換驗(yàn)證2必做3線段、多邊形裁剪算法實(shí)現(xiàn)驗(yàn)證2必做4三維觀察算法實(shí)現(xiàn)設(shè)計(jì)2必做5光照模型與紋理映射實(shí)現(xiàn)驗(yàn)證2必做【實(shí)驗(yàn)報(bào)告和考核】1、實(shí)驗(yàn)報(bào)告必需采用統(tǒng)一的實(shí)驗(yàn)報(bào)告紙,撰寫符合一定的規(guī)范,詳見實(shí)驗(yàn)報(bào)告撰寫格式及規(guī)范。2、本實(shí)驗(yàn)占該課程最終評定成績的15?!緦?shí)驗(yàn)大綱】見附錄A【實(shí)驗(yàn)環(huán)節(jié)細(xì)節(jié)說明】見附錄B實(shí)驗(yàn)(一)【實(shí)驗(yàn)題目】 基本圖元繪制【實(shí)驗(yàn)?zāi)康摹?、通過本實(shí)驗(yàn),掌握在VC6.0環(huán)境下基于OpenGL程序開發(fā)的運(yùn)行環(huán)境配置,了解基于OpenGL圖形庫的控制臺圖形程序開發(fā)框架,并對二維觀察變換中相關(guān)函數(shù)的使用及參數(shù)有所了解。2、掌握OpenGL基本圖元的繪制方法和屬性控制方法,并編程實(shí)現(xiàn)綜合使用多種圖形函數(shù)繪制復(fù)雜圖形。【實(shí)驗(yàn)內(nèi)容】1. VC6.0環(huán)境下基于OpenGL程序開發(fā)的運(yùn)行環(huán)境配置由于VC6.0應(yīng)用程序開發(fā)系統(tǒng)只支持OpenGL核心庫函數(shù),而在程序開發(fā)中需使用大量核心庫所不具有的函數(shù),因此,在進(jìn)行圖形開發(fā)前需進(jìn)行OpenGL程序開發(fā)的運(yùn)行環(huán)境配置。在此需將有關(guān)的函數(shù)庫文件拷貝到指定的文件目錄下即可。過程如下:將OpenGL開發(fā)庫子目錄下INCLUDE所有文件拷貝到VC所在子目錄的includegl目錄下。將OpenGL開發(fā)庫子目錄下LIB所有文件拷貝到VC所在子目錄的lib目錄下。將OpenGL開發(fā)庫子目錄下DLL所有文件拷貝到windows所在子目錄的system32目錄下。2OpenGL控制臺應(yīng)用程序框架OpenGL控制臺應(yīng)用程序框架及各函數(shù)的作用、參數(shù)情況說明見教材2.2.1節(jié) OpenGL控制臺應(yīng)用程序框架。3基本圖元繪制該實(shí)驗(yàn)將綜合利用第二章、第三章中有關(guān)基本圖元及其屬性控制的函數(shù),自我設(shè)計(jì)能夠?qū)⑾聦賵D形要素涵蓋的圖形,并編程實(shí)現(xiàn)?;緢D元:應(yīng)包括點(diǎn)、線段、各種多邊形;屬性控制:應(yīng)包括顏色設(shè)置、不同大小的點(diǎn)(如1像素點(diǎn)、3像素點(diǎn)等)、不同類型的線段(實(shí)線、點(diǎn)劃線等);繪制出屏幕坐標(biāo)系的2個(gè)坐標(biāo)軸,并利用繪制線段或多邊形方式繪制1個(gè)圓。【實(shí)驗(yàn)報(bào)告要求】1簡述VC+環(huán)境下OpenGL圖形系統(tǒng)開發(fā)的一般過程。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過程中遇到的主要問題及解決過程。3圖形坐標(biāo)與世界坐標(biāo)系、屏幕視口坐標(biāo)系之間的關(guān)系是什么?在放大、縮小觀察圖形時(shí)應(yīng)調(diào)節(jié)那些函數(shù)的那些參數(shù)?實(shí)驗(yàn)(二)【實(shí)驗(yàn)題目】 二維圖元的幾何變換【實(shí)驗(yàn)?zāi)康摹?、了解和掌握二維坐標(biāo)系中物體坐標(biāo)、觀察坐標(biāo)、屏幕坐標(biāo)之間的關(guān)系,能夠在合適的位置定義物體的幾何形狀,并通過定義合適的觀察坐標(biāo)系在視口中顯示出物體。2、了解和掌握以坐標(biāo)原點(diǎn)、坐標(biāo)軸為中心的物體幾何變換方式,包括平移、旋轉(zhuǎn)和縮放對應(yīng)的函數(shù)。3、了解和掌握矩陣操作函數(shù)的原理和過程,并實(shí)現(xiàn)繞任意點(diǎn)或任意軸為參考進(jìn)行平移、旋轉(zhuǎn)、縮放程序?!緦?shí)驗(yàn)內(nèi)容】1 了解和掌握二維坐標(biāo)系中物體坐標(biāo)、觀察坐標(biāo)、屏幕坐標(biāo)之間的關(guān)系。要求:對上一次編寫的程序中的幾何物體改變其幾何位置和大小,改變gluOrtho2D函數(shù)中的參數(shù),改變glViewport中的參數(shù),觀察所要繪制的圖形和視口的位置發(fā)生了什么變化,并思考原因。2 了解和掌握以坐標(biāo)原點(diǎn)、坐標(biāo)軸為中心的物體幾何變換方式。要求:繪制一個(gè)二維圖形,并使用以坐標(biāo)原點(diǎn)、坐標(biāo)軸為參考的物體幾何變換(包括平移、旋轉(zhuǎn)和縮放)函數(shù),對其進(jìn)行相應(yīng)的幾何變換,并以不同顏色加以區(qū)分。3了解和掌握矩陣操作函數(shù)的原理和過程。要求:采用矩陣操作方式實(shí)現(xiàn)與第二步中相同的幾何變換過程。4實(shí)現(xiàn)繞任意點(diǎn)或任意軸為中心進(jìn)行平移、旋轉(zhuǎn)、縮放程序。要求:根據(jù)課堂上所講的繞任意點(diǎn)或任意軸為參考進(jìn)行幾何變換的原理,編寫相應(yīng)的旋轉(zhuǎn)和縮放函數(shù),并采用所實(shí)現(xiàn)的函數(shù)對所繪制的圖形實(shí)現(xiàn)繞任意點(diǎn)或任意軸為參考的幾何變換?!緦?shí)驗(yàn)報(bào)告要求】1總結(jié)并簡述繞任意點(diǎn)或任意軸為中心進(jìn)行幾何變換的原理。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過程中遇到的主要問題及解決過程。3用矩陣操作實(shí)現(xiàn)幾何變換有何優(yōu)點(diǎn)?實(shí)驗(yàn)(三)【實(shí)驗(yàn)題目】 線段、多邊形裁剪算法實(shí)現(xiàn)【實(shí)驗(yàn)?zāi)康摹?、深入了解和掌握Cohen_Sutherland線段裁剪算法的原理和程序?qū)崿F(xiàn)過程。2、深入了解和掌握Sutherland-Hodgman多邊形裁剪算法的原理和程序?qū)崿F(xiàn)過程?!緦?shí)驗(yàn)內(nèi)容】1. 根據(jù)Cohen-Sutherland直線裁剪算法的原理,實(shí)現(xiàn)用矩形窗口對某線段的裁剪過程。要求:根據(jù)Cohen-Sutherland直線裁剪算法的原理,編寫實(shí)現(xiàn)該算法的各個(gè)子函數(shù),并在屏幕上畫出用于裁剪的矩形窗口,用不同的顏色和線型標(biāo)注被裁剪的線段及裁剪后的結(jié)果。2. 根據(jù)Sutherland-Hodgman多邊形裁剪算法的原理,實(shí)現(xiàn)用矩形對某多邊形的裁剪過程。要求:根據(jù)Sutherland-Hodgman多邊形裁剪算法的原理,編寫實(shí)現(xiàn)該算法的各個(gè)子函數(shù),并在屏幕上畫出用于裁剪的矩形窗口,用不同的顏色和線型標(biāo)注被裁剪的多邊形及裁剪后的結(jié)果。【實(shí)驗(yàn)報(bào)告要求】1總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過程中遇到的主要問題及解決過程。2在Cohen-Sutherland直線裁剪算法中若改變9個(gè)區(qū)域的編碼方式會對裁剪結(jié)果產(chǎn)生什么影響?3在OpenGL中如何實(shí)現(xiàn)對二維圖形的裁剪?實(shí)驗(yàn)(四)【實(shí)驗(yàn)題目】 三維觀察算法實(shí)現(xiàn)【實(shí)驗(yàn)?zāi)康摹?. 了解和掌握三維空間中幾何物體的繪制方法。2. 了解和掌握三維觀察變換的原理及OpenGL中實(shí)現(xiàn)三維觀察變換函數(shù)的參數(shù)對三維觀察的影響?!緦?shí)驗(yàn)內(nèi)容】1、了解和掌握三維空間中幾何物體的繪制方法。要求:了解在三維空間坐標(biāo)系中三維物體的定義方法,注意多邊形內(nèi)部和外部定義,并繪制一個(gè)包含內(nèi)、外部的三維物體。2、實(shí)現(xiàn)三維觀察變換。要求:利用gluPerspective等相關(guān)三維觀察變換函數(shù),實(shí)現(xiàn)對上面所繪制的三維物體進(jìn)行三維裁剪和三維觀察變換,并對函數(shù)中的參數(shù)進(jìn)行改變,觀察屏幕顯示結(jié)果,進(jìn)一步了解三維觀察變換的原理。【實(shí)驗(yàn)報(bào)告要求】1總結(jié)三維觀察變換相關(guān)函數(shù)中參數(shù)的不同變化對三維觀察結(jié)果的影響。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過程中遇到的主要問題及解決過程。3glMatrixMode函數(shù)對三維觀察變換有何影響?實(shí)驗(yàn)(五)【實(shí)驗(yàn)題目】 光照模型與紋理映射實(shí)現(xiàn)【實(shí)驗(yàn)?zāi)康摹? 熟悉三維空間中光照模型的原理,掌握OpenGL中光照模型的定義方法。2 了解三維物體紋理映射的基本原理,掌握OpenGL中紋理映射的基本方法?!緦?shí)驗(yàn)內(nèi)容】1、 OpenGL中光照模型的定義方法的實(shí)現(xiàn)。要求:繪制一個(gè)空間三維物體,并在三維空間中定義不同的光源,涉及不同的光源類型、光的顏色,并開啟光源,觀察通過改變定義光源的不同參數(shù),得到的繪制結(jié)果有何不同。2、 OpenGL中紋理映射的實(shí)現(xiàn)。要求:畫出一個(gè)二維圖形,并采用程序生成紋理或讀入紋理圖像的方法,對所繪制的二維圖形進(jìn)行紋理映射,通過改變不同的參數(shù)觀察所得到的結(jié)果有何不同?!緦?shí)驗(yàn)報(bào)告要求】1總結(jié)三維空間中定義光照模型的過程,及定義光照模型相關(guān)函數(shù)中參數(shù)的不同變化對觀察結(jié)果的影響。2總結(jié)三維空間中紋理映射的過程,及紋理映射相關(guān)函數(shù)中參數(shù)的不同變化對觀察結(jié)果的影響。2總結(jié)在程序設(shè)計(jì)和實(shí)現(xiàn)過程中遇到的主要問題及解決過程。附錄A計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)教學(xué)大綱一、制定實(shí)驗(yàn)教學(xué)大綱的依據(jù)根據(jù)本校2008級本科指導(dǎo)性培養(yǎng)計(jì)劃和2008年6月制定的計(jì)算機(jī)圖形學(xué)課程教學(xué)大綱制定。二、本實(shí)驗(yàn)課在專業(yè)人才培養(yǎng)中的地位和作用計(jì)算機(jī)圖形學(xué)是數(shù)字媒體技術(shù)專業(yè)必修的一門專業(yè)基礎(chǔ)課。通過本課程的學(xué)習(xí),可以使學(xué)生了解計(jì)算機(jī)圖形學(xué)所研究的內(nèi)容、廣泛的應(yīng)用,掌握計(jì)算機(jī)圖形的基本生成算法、圖形幾何變換的原理及實(shí)現(xiàn)方法、二維和三維觀察、圖形表示、曲線、曲面的圖形生成技術(shù)及真實(shí)感圖形等。同時(shí)結(jié)合OpenGL圖形庫的使用,使學(xué)生掌握圖形程序開發(fā)的基本技術(shù)和方法。三、本實(shí)驗(yàn)課程講授的基本實(shí)驗(yàn)理論主要講授利用OpenGL圖形庫函數(shù)進(jìn)行二維、三維圖形的繪制的基本方法,從而使學(xué)生能將計(jì)算機(jī)圖形學(xué)的基本理論與OpenGL圖形開發(fā)實(shí)踐有機(jī)結(jié)合起來,加深對理論的理解和應(yīng)用實(shí)踐能力。主要涉及圖形光柵化原理,及基于光柵化原理的所進(jìn)行的基本圖元的生成、填充、裁剪算法、二維圖形變換、二維和三維觀察變換、光照模型和紋理映射等。1OpenGL運(yùn)行環(huán)境配置及基本圖元繪制;2二維觀察變換及二維圖形幾何變換;3線段裁剪、多邊形裁剪算法;4三維觀察變換;5真實(shí)感圖形繪制中光照模型的設(shè)置和紋理映射過程。四、本實(shí)驗(yàn)課學(xué)生應(yīng)達(dá)到的能力本實(shí)驗(yàn)開設(shè)的目的:一方面使學(xué)生通過實(shí)驗(yàn)對圖形學(xué)基本理論和算法在實(shí)踐中的應(yīng)用有一個(gè)直觀、深刻的認(rèn)識,從而使學(xué)生掌握將理論應(yīng)用于實(shí)踐的方法,同時(shí)對理論的認(rèn)識得到深化;另一方面,通過編程訓(xùn)練加強(qiáng)了學(xué)生對基于OpenGL圖形庫的基本圖形算法、二維圖形變換、二三維觀察變換、真實(shí)感圖形處理等實(shí)際編程動(dòng)手能力的訓(xùn)練;為學(xué)生進(jìn)一步了解和掌握包括圖形用戶界面、CAD、數(shù)字圖像處理等的原理、技術(shù)、方法打下堅(jiān)實(shí)的理論和實(shí)踐基礎(chǔ)。五、學(xué)時(shí)、教學(xué)文件及形式學(xué)時(shí):本課程總學(xué)時(shí)為48學(xué)時(shí),其中實(shí)驗(yàn)為10學(xué)時(shí),占總學(xué)時(shí)的20%。教學(xué)文件:校編計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)指導(dǎo)書;實(shí)驗(yàn)報(bào)告學(xué)生自擬。要求學(xué)生實(shí)驗(yàn)前預(yù)習(xí)實(shí)驗(yàn)指導(dǎo)書,并理解相關(guān)算法思想及軟件實(shí)現(xiàn)過程,具體編程過程由學(xué)生獨(dú)立完成。六、實(shí)驗(yàn)考核辦法與成績評定實(shí)驗(yàn)課成績占本課程總成績15%,對缺少實(shí)驗(yàn)成績者,本課程不予通過(對實(shí)驗(yàn)成績的考核包括上機(jī)編程結(jié)果占50%,實(shí)驗(yàn)報(bào)告占40%,考勤占10%)。七、儀器設(shè)備及注意事項(xiàng)儀器設(shè)備:有快速的較高性能微機(jī)和較大內(nèi)存與硬盤的設(shè)備注意事項(xiàng):注意保護(hù)設(shè)備八、實(shí)驗(yàn)項(xiàng)目的設(shè)置及學(xué)時(shí)分配序號實(shí) 驗(yàn) 項(xiàng) 目學(xué)時(shí)實(shí)驗(yàn)類型要求適用專業(yè)備注1基本圖元繪制2設(shè)計(jì)必修電子信息工程專業(yè)(圖文處理方向)上機(jī)2二維圖元的幾何變換2驗(yàn)證必修電子信息工程專業(yè)(圖文處理方向)上機(jī)3線段、多邊形裁剪算法實(shí)現(xiàn)2驗(yàn)證必修電子信息工程專業(yè)(圖文處理方向)上機(jī)4三維觀察算法實(shí)現(xiàn)2設(shè)計(jì)必修電子信息工程專業(yè)(圖文處理方向)上機(jī)5光照模型與紋理映射實(shí)現(xiàn)2驗(yàn)證必修電子信息工程專業(yè)(圖文處理方向)上機(jī)制 定 人:吳學(xué)毅審 核 人:張二虎批 準(zhǔn) 人:周世生制定日期:2008.7附錄B實(shí)驗(yàn)環(huán)節(jié)詳細(xì)說明實(shí)驗(yàn)(一):基本圖元繪制一VC6.0環(huán)境下基于Win32控制臺的OpenGL程序創(chuàng)建過程在Visual C+ 6.0環(huán)境下有兩種OpenGL程序開發(fā)框架:(1)基于控制臺的應(yīng)用程序框架;(2)MFC環(huán)境下單文檔、多文檔、對話框應(yīng)用程序框架。其中前者是最為簡單、有效的知識驗(yàn)證型程序開發(fā)框架?;诳刂婆_的OpenGL應(yīng)用程序框架與一般的C語言程序結(jié)構(gòu)一樣,只是其中在定義圖形窗口、初始化操作和圖形數(shù)據(jù)處理與顯示時(shí),須使用相應(yīng)的OpenGL函數(shù)。下面就基于控制臺的應(yīng)用程序框架開發(fā)過程簡述如下:1由于VC6.0應(yīng)用程序開發(fā)系統(tǒng)只支持OpenGL核心庫函數(shù),而在程序開發(fā)中需使用大量核心庫所不具有的函數(shù),因此,在進(jìn)行圖形開發(fā)前需進(jìn)行OpenGL程序開發(fā)的運(yùn)行環(huán)境配置。在此需將有關(guān)的函數(shù)庫文件拷貝到指定的文件目錄下即可。過程如下:將OpenGL開發(fā)庫子目錄下INCLUDE所有文件拷貝到VC所在子目錄的includegl目錄下。將OpenGL開發(fā)庫子目錄下LIB所有文件拷貝到VC所在子目錄的lib目錄下。將OpenGL開發(fā)庫子目錄下DLL所有文件拷貝到windows所在子目錄的system32目錄下。2.在創(chuàng)建新工程的Project標(biāo)簽中應(yīng)選擇“Win32 Console Application”,并選擇適當(dāng)?shù)谋4婀こ痰奈募A路徑。3在如圖1所示的創(chuàng)建向?qū)ы撁孢x擇A “Hello,World!”application.選項(xiàng)。點(diǎn)擊Finish按鈕完成工程的創(chuàng)建。點(diǎn)擊工具欄中的“Execute Program”按鈕進(jìn)行工程的編譯、鏈接和運(yùn)行,并出現(xiàn)Hell,World! Press any key to continue的運(yùn)行結(jié)果。圖1 工程創(chuàng)建向?qū)?.在工程創(chuàng)建完畢需添加OpenGL庫。選擇“Project Setting”對話框,如圖2所示。在對話框中選擇“Link”標(biāo)簽,在“Object/library modules”編輯框中加入“”。opengl32.lib glu32.lib glaux.lib圖2 工程設(shè)置對話框界面5在系統(tǒng)自動(dòng)生成的*.cpp文件中,刪去原文件內(nèi)容,寫入自己的程序代碼。注意:1由于實(shí)驗(yàn)室的機(jī)器對C、D盤進(jìn)行了寫保護(hù),因此,若機(jī)器中C、D盤中無相應(yīng)的OpenGL庫文件。則在每次上機(jī)時(shí),需重新進(jìn)行上述步驟1的庫文件配置操作。二、OpenGL控制臺應(yīng)用程序框架OpenGL在Win32控制臺下程序框架仍以main函數(shù)作為程序運(yùn)行的入口,整個(gè)程序由3大部分組成。第1部分為應(yīng)包含的頭文件,其中主要是包含glut.h文件,該頭文件包含了OpenGL運(yùn)行所需要調(diào)用核心庫和實(shí)用庫中的相關(guān)頭文件。第2部分為OpenGL繪制圖形所需的相關(guān)函數(shù)的聲明和定義,其中主要涉及:設(shè)置OpenGL運(yùn)行初始環(huán)境,如myInit函數(shù)。繪制所要顯示的圖形,如myDisplay。響應(yīng)窗口變化,如myReshape。以上3部分得主要程序結(jié)構(gòu)在所有的win32控制臺程序框架中均相似,但每部分在不同的應(yīng)用中有所不同,要根據(jù)實(shí)際的繪圖需求來具體寫相關(guān)代碼。第3部分為main函數(shù)的框架,在初級的應(yīng)用中main函數(shù)調(diào)用的函數(shù)基本不變,主要是其中的一些參數(shù)可根據(jù)實(shí)際需要進(jìn)行變動(dòng)。/第1部分-在此給出了OpenGL運(yùn)行所需要的3個(gè)頭文件#include stdafx.h#include windows.h#include GL/glut.h/第2部分OpenGL函數(shù)聲明void myInit(void);void myReshape(GLsizei w,GLsizei h);void myDisplay(void);/OpenGL相關(guān)函數(shù)的定義void myInit(void) /設(shè)置OpenGL運(yùn)行初始環(huán)境glClearColor(1.0,1.0,1.0,0.0); /清除背景顏色為白色glShadeModel(GL_FLAT); /設(shè)置圖形繪制模式void myDisplay(void) /繪制所要顯示的圖形glClear(GL_COLOR_BUFFER_BIT); /清除顏色緩沖區(qū)glColor4f(0.2,0.6,1.0,1.0); /設(shè)置圖形繪制顏色glutWireTeapot(0.5); /繪制線框茶壺glFlush(); /完成繪制void myReshape(GLsizei w,GLsizei h) /響應(yīng)窗口變化glViewport(0,0,w,h); /設(shè)置窗口縮放時(shí)的視口變換/第3部分mian函數(shù)框架int main(int argc, char* argv) /初始化顯示模式,并將窗口顯示模式定義為單緩沖區(qū)、RGBA顏色glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,150); /設(shè)置顯示窗口左上角位置glutInitWindowSize(200,350); /設(shè)置顯示窗口寬度和高度glutCreateWindow(控制臺OpenGL框架); /創(chuàng)建窗口并設(shè)置標(biāo)題myInit(); /繪制狀態(tài)初始化glutReshapeFunc(myReshape); /當(dāng)窗口發(fā)生變化時(shí),調(diào)用myReshape重新定義窗口屬性glutDisplayFunc(myDisplay); /調(diào)用myDisplay在窗口中繪制圖形glutMainLoop(); /循環(huán)繪制圖形和響應(yīng)事件處理三、基本圖元繪制該部分可參考以下程序完成基本圖元的繪制和屬性的控制,但要求不能完全照搬,可在歷屆的基礎(chǔ)上進(jìn)行適當(dāng)?shù)男薷摹?include stdafx.h#include GL/glut.hvoid myInit(void);void myReshape(GLsizei w,GLsizei h);void myDisplay(void);void myInit(void) /設(shè)置OpenGL運(yùn)行初始環(huán)境glClearColor(1.0,1.0,1.0,0.0); /清除背景顏色為白色glShadeModel(GL_SMOOTH); /設(shè)置圖形繪制模式void myDisplay(void) /繪制所要顯示的圖形glClear(GL_COLOR_BUFFER_BIT); /清除顏色緩沖區(qū)glColor4f(0.2,0.6,1.0,1.0); /設(shè)置圖形繪制顏色/繪制線段glBegin(GL_LINES);glVertex2i(40,60); glVertex2i(-30,36);glEnd();/繪制折線glBegin(GL_LINE_STRIP);glColor3f(1.0,1.0,0.0); glVertex2f(10.0,-80.0); glVertex2f(30.0,-20.0); /黃色glColor3f(0.0,1.0,0.0); glVertex2f(40.0,-80.0); glVertex2f(45.0,-20.0); /綠色 glColor3f(0.0,0.0,1.0); glVertex2f(50.0,-80.0); glVertex2f(70.0,-10.0); /藍(lán)色glEnd();/繪制封閉線glBegin(GL_LINE_LOOP);glColor3f(1.0,0.0,0.0); /紅色glVertex2f(-10.0,-30.0); glVertex2f(-30.0,-20.0);glColor3f(0.0,1.0,0.0); /綠色glVertex2f(-40.0,-30.0); glVertex2f(-45.0,-20.0);glColor3f(0.0,0.0,1.0); /藍(lán)色glVertex2f(-50.0,-30.0); glVertex2f(-70.0,-10.0); glEnd();glColor3f(0.0,1.0,0.0); /綠色/繪制三角形glBegin(GL_TRIANGLES);glVertex2i(20,70); glVertex2i(50,80); glVertex2i(60,55);glEnd();glColor3f(0.0,0.0,1.0); /藍(lán)色/繪制相連三角形glBegin(GL_TRIANGLE_STRIP);glVertex2i(-20,30); glVertex2i(-50,-10); glVertex2i(-60,35);glVertex2i(-80,45);glEnd();/繪制相連的四邊形的頂點(diǎn)glColor3f(0.0,0.0,1.0); /藍(lán)色glPointSize(3.0);glBegin(GL_POINTS);glVertex2i(20,30); glVertex2i(50,-10); glVertex2i(60,35);glVertex2i(80,45); glVertex2i(85,60); glVertex2i(90,55);glEnd();glColor3f(1.0,0.0,0.0); /紅色glBegin(GL_QUAD_STRIP);glVertex2i(20,30); glVertex2i(50,-10); glVertex2i(60,35);glVertex2i(80,45); glVertex2i(85,60); glVertex2i(90,55);glEnd();glFlush(); /強(qiáng)制繪制/此處根據(jù)窗口的變化設(shè)置視口和裁剪窗口void myReshape(GLsizei w,GLsizei h) GLfloat nR=100.0f; if (h=0) /防止被0除 h=1; glViewport(0,0,w,h); /將視口區(qū)設(shè)置為原點(diǎn)位于左下角,寬度為w,高度為hglMatrixMode(GL_PROJECTION); /設(shè)置當(dāng)前投影矩陣堆棧glLoadIdentity();/建立裁剪體if (w=h)glOrtho(-nR,nR,-nR*h/w,nR*h/w,-nR,nR); elseglOrtho(-nR*w/h,nR*w/h,-nR,nR,-nR,nR); glMatrixMode(GL_MODELVIEW); /設(shè)置模型觀察矩陣堆棧glLoadIdentity();繪制屏幕坐標(biāo)系的2個(gè)坐標(biāo)軸可在myDisplay函數(shù)中,按繪制線段的方式指定2個(gè)坐標(biāo)軸的2對頂點(diǎn)坐標(biāo),如(0,0)與(10,0)為x軸,(0,0)與(0,10)為y軸。對于利用線段或多邊形繪制函數(shù)繪制1個(gè)圓,主要的問題是如何計(jì)算構(gòu)成圓周上各個(gè)頂點(diǎn)的坐標(biāo)值??衫脠A的極坐標(biāo)方程:來計(jì)算圓周上各點(diǎn)的坐標(biāo)。其中N為將圓周等分的份數(shù),n為每次循環(huán)的計(jì)數(shù)。注意的問題:在程序編譯、鏈接、運(yùn)行均無錯(cuò)誤的情況下,經(jīng)常會出現(xiàn)看不到所繪制的圖形的情況,引起該情況的主要可能原因如下:1 在使用glVertex函數(shù)指定頂點(diǎn)坐標(biāo)時(shí),函數(shù)的指定參數(shù)類型與實(shí)際給定的參數(shù)類型不符,如glVertex2f(20,30);2 在圖形繪制函數(shù)如沒有Display中沒有調(diào)用glFlush(); 進(jìn)行強(qiáng)制繪制。3 在使用glVertex函數(shù)指定頂點(diǎn)坐標(biāo)值超出glOrtho或glOrtho2D所定義的裁剪體范圍。實(shí)驗(yàn)(二):二維圖元的幾何變換本實(shí)驗(yàn)包含4個(gè)環(huán)節(jié):一、了解和掌握二維坐標(biāo)系中物體坐標(biāo)、觀察坐標(biāo)、屏幕坐標(biāo)之間的關(guān)系。在實(shí)驗(yàn)一所繪制的基本圖元的基礎(chǔ)上,通過改變glVertex函數(shù)所指定的頂點(diǎn)位置來理解頂點(diǎn)對幾何物體位置和大小的影響;通過改變glBegin的參數(shù)來理解不同基本圖元繪制參數(shù)與頂點(diǎn)坐標(biāo)對物體形狀的影響;通過改變glOrtho2D函數(shù)中的參數(shù)來理解裁剪體范圍、是如何指定的及其對顯示的場景范圍的影響;通過改變glViewport中的參數(shù),觀察所要繪制的圖形和視口的位置發(fā)生了什么變化,并思考原因。二、 了解和掌握以坐標(biāo)原點(diǎn)、坐標(biāo)軸為中心的物體幾何變換方式。理解在OpenGL中幾何變換的2重含義,一種是從對所繪制物體本身的幾何變換,一種可以從對坐標(biāo)系的幾何變換來理解,其中后者是最根本的方式。在OpenGL的圖形繪制中,模型視圖矩陣對圖形繪制的頂點(diǎn)坐標(biāo)會產(chǎn)生影響,在使用幾何變換函數(shù)(包括平移、旋轉(zhuǎn)和縮放)對圖形進(jìn)行變換時(shí),實(shí)質(zhì)上是改變了模型視圖矩陣的內(nèi)容,并將模型視圖矩陣乘物體指定的頂點(diǎn)坐標(biāo),所得結(jié)果為施加幾何變換后物體的真正坐標(biāo)。glMatrixMode(GL_MODELVIEW) 函數(shù)指定了當(dāng)前使用的矩陣為模型視圖矩陣。glLoadIdentity()函數(shù)可將模型視圖矩陣變?yōu)閱挝魂嚕瑥亩梢赃€原坐標(biāo)系。繪制一個(gè)二維圖形,并使用以坐標(biāo)原點(diǎn)、坐標(biāo)軸為中心的物體幾何變換(包括平移、旋轉(zhuǎn)和縮放)函數(shù),對其進(jìn)行相應(yīng)的幾何變換,并以不同顏色加以區(qū)分,可參考以下代碼:#include stdafx.h#include windows.h#include #include #include GLsizei winWidth=600,winHeight=600; /Initial display-window sizestatic void init(void)glClearColor(1.0,1.0,1.0,0.0); /set display window color to whitevoid displayFcn(void)glClear(GL_COLOR_BUFFER_BIT); /Clear display window/使用glLoadIdentity函數(shù)的幾何變換glMatrixMode(GL_MODELVIEW);glLoadIdentity();glColor3f(0.0,0.0,1.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();/用藍(lán)色繪制矩形區(qū)域glColor3f(0.0,0.0,1.0); glRecti(50,100,200,150);glColor3f(1.0,0.0,0.0); /用紅色繪制向右上角平移的矩形區(qū)域glTranslatef(100.0,180.0,0.0);glRecti(50,100,200,150);glColor3f(1.0,0.0,0.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();/用綠色繪制坐標(biāo)原點(diǎn)返回到初始位置繞z軸旋轉(zhuǎn)45的矩形區(qū)域glColor3f(0.0,1.0,0.0); glLoadIdentity();glRotatef(45.0,0.0,0.0,1.0);glRecti(50,100,200,150);glColor3f(0.0,1.0,0.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();glColor3f(1.0,1.0,0.0); /用黃色繪制 在x軸方向縮小-0.5的矩形區(qū)域 glLoadIdentity();glScalef(-0.5,1.0,1.0);glRecti(50,100,200,150);glColor3f(1.0,1.0,0.0);glBegin(GL_LINES);glVertex3f(0.0,0.0,0.0);glVertex3f(100.0,0.0,0.0);glVertex3f(0.0,0.0,0.0);glVertex3f(0.0,100.0,0.0);glEnd();glFlush();void winReshapeFcn(int newWidth, int newHeight) / Set Viewport to window dimensions if (newHeight=0) /防止被0除newHeight=1; glViewport(0,0,newWidth,newHeight); /將視口區(qū)設(shè)置為原點(diǎn)位于左下角,寬度為w,高度為hglMatrixMode(GL_PROJECTION); /設(shè)置當(dāng)前投影矩陣堆棧glLoadIdentity();/建立裁剪體 gluOrtho2D(-200,400,-200,400); glMatrixMode(GL_MODELVIEW); /設(shè)置模型觀察矩陣堆棧glLoadIdentity();三、了解和掌握矩陣操作函數(shù)的原理和過程。使用矩陣的堆棧操作方式同樣可以完成對圖形的幾何變換,且是一種簡潔、高效的方式??蓞⒖既缦麓a完成采用矩陣操作方式實(shí)現(xiàn)與第二步中相同的幾何變換過程。glMatrixMode(GL_MODELVIEW); glColor3f(0.0,0.0,1.0);glRecti(50,100,200,150);glPushMatrix();glColor3f(1.0,0.0,0.0);glTranslatef(100.0,150.0,0.0);glRecti(50,100,200,150);glPopMatrix();glPushMatrix();glColor3f(0.0,1.0,0.0);glRotatef(90.0,0.0,0.0,1.0);glRecti(50,100,200,150);glPopMatrix();glColor3f(1.0,1.0,0.0);glScalef(-0.5,1.0,1.0); glRecti(50,100,200,150);四、實(shí)現(xiàn)繞任意點(diǎn)或任意軸為中心進(jìn)行平移、旋轉(zhuǎn)、縮放程序。繞任意軸進(jìn)行旋轉(zhuǎn)變換和以任意點(diǎn)為參考點(diǎn)進(jìn)行縮放的自定義函數(shù)實(shí)現(xiàn)。其中wcPt3D為一個(gè)三維點(diǎn)類,其定義如下:class wcPt3D pulic: GLfloat x,y,z;/三維點(diǎn)的坐標(biāo)值;l 繞任意軸進(jìn)行三維旋轉(zhuǎn)變換在如下的繞任意軸進(jìn)行旋轉(zhuǎn)變換的函數(shù)實(shí)現(xiàn)中,參數(shù)P1、P2為指定的旋轉(zhuǎn)軸,theta為旋轉(zhuǎn)角度。void rotate3D(wcPt3D p1,wcPt3D p2,GLfloat theta)/* 計(jì)算P2P1向量的x、y、z分量 */GLfloat vx=(p2.x-p1.x);GLfloat vy=(p2.y-p1.y);GLfloat vz=(p2.z-p1.z);/* 按5.52式中順序進(jìn)行逆平移-旋轉(zhuǎn)-平移的變換 */glTranslatef(p1.x,p1.y,p1.z); /將 p1平移回原始位置glRotatef(theta,vx,vy,vz); /繞(vx,vy,vz)向量旋轉(zhuǎn)theta角glTranslatef(-p1.x,-p1.y,-p1.z); /將p1平移到坐標(biāo)原點(diǎn)l 以任意點(diǎn)為參考點(diǎn)進(jìn)行三維縮放變換在如下的以任意點(diǎn)為參考點(diǎn)進(jìn)行三維縮放變換的實(shí)現(xiàn)中,參數(shù)fixedPt為某參考點(diǎn),sx、sy、sz為縮放因子。void scale3D(GLfloat sx,GLfloat sy,GLfloat sz,wcPt3D fixedPt)/*按5.50式中順序進(jìn)行逆平移-縮放-平移的變換 */* 將參考點(diǎn)移回到原始位置*/glTranslatef(fixedPt.x,fixedPt.y,fixedPt.z);glScalef(sx,sy,sz); /以原點(diǎn)為參考點(diǎn)進(jìn)行縮放變換glTranslatef(-fixedPt.x,-fixedPt.y,-fixedPt.z); /將參考點(diǎn)移至坐標(biāo)原點(diǎn)實(shí)驗(yàn)(三):線段、多邊形裁剪算法實(shí)現(xiàn)本節(jié)是兩個(gè)驗(yàn)證性實(shí)驗(yàn),通過對代碼的閱讀,理解相應(yīng)的算法是如何通過代碼來實(shí)現(xiàn)。一、 根據(jù)Cohen-Sutherland直線裁剪算法的原理,實(shí)現(xiàn)用矩形對某線段的裁剪過程。根據(jù)Cohen-Sutherland直線裁剪算法的原理,編寫實(shí)現(xiàn)該算法的各個(gè)子函數(shù),并在屏幕上畫出用于裁剪的矩形窗口,用不同的顏色和線型標(biāo)注被裁剪的線段及裁剪后的結(jié)果。其算法實(shí)現(xiàn)如下:/ Cohen_Sutherland_console.cpp : Defines the entry point for the console application.#include #include / Header File For The Glut Library/*根據(jù)兩個(gè)端點(diǎn)的編碼code1、code2,判斷線段是否在窗口內(nèi),若flag返回0則表明該線段不在窗口內(nèi),返回1則表明該線段在窗口內(nèi)。*/int accept(int code1, int code2)int i,flag;flag=1;for(i=0;i4;i+)if(code1i=1)|(code2i)=1) /若code的某位不為0,則表明該線段不在窗口內(nèi)flag=0;break;return flag;/根據(jù)點(diǎn)(x,y)所在區(qū)域,賦予code數(shù)組各位相應(yīng)的編碼void encode(int x, int y, int code, int xw_min, int xw_max, int yw_min, int yw_max)int i;/將code的各個(gè)元素初始化為0for(i=0;i4;i+)codei=0;if(xxw_max)code2=1;if(yyw_max)code1=1;else if(yyw_min)code0=1;/*根據(jù)兩個(gè)端點(diǎn)的編碼code1、code2,判斷線段是否在窗口外,若flag返回1則表明該線段在窗口某邊框的同一外側(cè),返回0則表明該線段不會在窗口的同一側(cè)。*/int reject(int code1, int code2)int i,flag;flag=0;for(i=0;i4;i+)if(code1i=1)&(code2i=1) /code的某位同為1,則表明線段在窗口同一側(cè)flag=1;break;return flag;/*判斷(x1,y1)點(diǎn)是否在窗口內(nèi),若在窗口內(nèi),則將(x1,y1)與(x2,y2)進(jìn)行交換,使得(x1,y1)點(diǎn)始終為被裁剪的線段的起點(diǎn)。*/int swap_if_needed(int code1, int code2)int i,flag1,flag2,tmp; flag1=1;/*若code1有1位為1,則flag1=0,表明端點(diǎn)1在窗外;若code1的每一位均為0,則flag1=1,表明端點(diǎn)1在窗內(nèi)。*/for(i=0;i4;i+)if(code1i=1)flag1=0;break;/對第二個(gè)端點(diǎn)的判別與端點(diǎn)1相同flag2=1;for(i=0;i4;i+) if(code2i=1)flag2=0;break;/端點(diǎn)1、2均在窗外,返回0if(flag1=0)&(flag2=0)return 0;/若端點(diǎn)1在窗內(nèi),端點(diǎn)2在窗外,則需交換兩個(gè)端點(diǎn)if(flag1=1)&(flag2=0)for(i=0;i4;i+)tmp=code1i;code1i=code2i;code2i=tmp;return 1;return 0;/*此為裁剪函數(shù)的主入口,上述4個(gè)輔助函數(shù)均在此處調(diào)用。函數(shù)參數(shù)(x1,y1)、(x2,y2)為兩個(gè)端點(diǎn)坐標(biāo),后四個(gè)參數(shù)為裁剪窗口的坐標(biāo)。done表示裁剪是否結(jié)束,值為0表示裁剪尚未結(jié)束。display表示是否需要顯示,為1表示需要顯示。*/void clip_line(float x1, float y1, float x2, float y2, int xw_min, int xw_max, int yw_min, int yw_max)int code14,code24,done,display;float m;float x11,y11,x22,y22,mark;done = 0;display = 0;while (done = 0)x11 = x1;x22 = x2;y11 = y1;y22 = y2;encode(x1,y1,code1,xw_min,xw_max,yw_min,yw_max); /給第一個(gè)端點(diǎn)編碼encode(x2,y2,code2,xw_min,xw_max,yw_min,yw_max); /給第二個(gè)端點(diǎn)編碼/若線段在窗口內(nèi)部,則裁剪結(jié)束并顯示該線段if (accept(code1,code2)done = 1;display = 1;break;/若線
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年樂理考試的總結(jié)與歸納全過程中的反思方法試題及答案
- 動(dòng)力電池技術(shù)的現(xiàn)狀與未來發(fā)展試題及答案
- 2025年土木工程師考試過程中如何調(diào)整狀態(tài)試題及答案
- 2025年農(nóng)業(yè)電商參與者分析試題及答案
- 農(nóng)產(chǎn)品電商商業(yè)模式試題及答案
- 健康領(lǐng)域考試試題及答案
- 共贏思維商務(wù)英語考試試題及答案
- 下水道養(yǎng)護(hù)試題及答案
- 農(nóng)業(yè)電商渠道選擇與管理試題及答案
- 2025年化學(xué)多樣性探討試題及答案
- 單叉固定式液壓升降臺設(shè)計(jì)
- 《美國消費(fèi)品安全改進(jìn)法》的普通合格證書、紡織品服裝類產(chǎn)
- GB∕T 40740-2021 堆焊工藝評定試驗(yàn)
- 2022年新高考湖南化學(xué)高考真題(word版含答案)
- Product Monitoring產(chǎn)品監(jiān)視與測量程序(中英文)
- T∕CADERM 3035-2020 嚴(yán)重創(chuàng)傷院內(nèi)救治流程和規(guī)范
- SB∕T 10170-2007 腐乳
- 門店清潔衛(wèi)生標(biāo)準(zhǔn)
- 水利水電工程畢業(yè)設(shè)計(jì)---水閘設(shè)計(jì)
- 聯(lián)想集團(tuán)財(cái)務(wù)風(fēng)險(xiǎn)分析及對策論文財(cái)務(wù)管理專業(yè)
- 工會會計(jì)報(bào)表完整版(內(nèi)有6張表)
評論
0/150
提交評論