




已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
計算機圖形學(xué)實驗指導(dǎo)書編者:吳學(xué)毅西安理工大學(xué)印刷包裝工學(xué)院 信息科學(xué)系2010年9月目錄上機實驗說明1【實驗環(huán)境】1【實驗要求】1【實驗項目及學(xué)時分配】1【實驗報告和考核】1【實驗大綱】見附錄A1【實驗環(huán)節(jié)詳細說明】見附錄B1實驗(一)2【實驗題目】 基本圖元繪制2【實驗?zāi)康摹?【實驗內(nèi)容】2【實驗報告要求】3實驗(二)4【實驗題目】 二維圖元的幾何變換4【實驗?zāi)康摹?【實驗內(nèi)容】4【實驗報告要求】5實驗(三)6【實驗題目】 線段、多邊形裁剪算法實現(xiàn)6【實驗?zāi)康摹?【實驗內(nèi)容】6實驗(四)7【實驗題目】 三維觀察算法實現(xiàn)7【實驗?zāi)康摹?【實驗內(nèi)容】7實驗(五)8【實驗題目】 光照模型與紋理映射實現(xiàn)8【實驗?zāi)康摹?【實驗內(nèi)容】8【實驗報告要求】8附錄A9計算機圖形學(xué)實驗教學(xué)大綱9附錄B11實驗環(huán)節(jié)詳細說明12 上機實驗說明【實驗環(huán)境】操作系統(tǒng):Microsoft Windows 2000或以上系統(tǒng)。軟件平臺:Visual C+6.0程序開發(fā)的軟件平臺及OpenGL圖形庫。【實驗要求】1、每次實驗前,熟悉實驗?zāi)康?、實驗?nèi)容及相關(guān)的基本理論知識。2、無特殊要求,原則上實驗為1人1組,必須獨立完成。3、實驗所用機器最好固定,以便更好地實現(xiàn)實驗之間的延續(xù)性和相關(guān)性,并便于檢查。4、按要求認真做好實驗過程及結(jié)果記錄?!緦嶒烅椖考皩W(xué)時分配】本實驗共計10學(xué)時,實驗項目及學(xué)時分配如下:序號實驗項目實驗類型學(xué)時要求1基本圖元繪制設(shè)計2必做2二維圖元的幾何變換驗證2必做3線段、多邊形裁剪算法實現(xiàn)驗證2必做4三維觀察算法實現(xiàn)設(shè)計2必做5光照模型與紋理映射實現(xiàn)驗證2必做【實驗報告和考核】1、實驗報告必需采用統(tǒng)一的實驗報告紙,撰寫符合一定的規(guī)范,詳見實驗報告撰寫格式及規(guī)范。2、本實驗占該課程最終評定成績的15?!緦嶒灤缶V】見附錄A【實驗環(huán)節(jié)細節(jié)說明】見附錄B實驗(一)【實驗題目】 基本圖元繪制【實驗?zāi)康摹?、通過本實驗,掌握在VC6.0環(huán)境下基于OpenGL程序開發(fā)的運行環(huán)境配置,了解基于OpenGL圖形庫的控制臺圖形程序開發(fā)框架,并對二維觀察變換中相關(guān)函數(shù)的使用及參數(shù)有所了解。2、掌握OpenGL基本圖元的繪制方法和屬性控制方法,并編程實現(xiàn)綜合使用多種圖形函數(shù)繪制復(fù)雜圖形?!緦嶒瀮?nèi)容】1. VC6.0環(huán)境下基于OpenGL程序開發(fā)的運行環(huán)境配置由于VC6.0應(yīng)用程序開發(fā)系統(tǒng)只支持OpenGL核心庫函數(shù),而在程序開發(fā)中需使用大量核心庫所不具有的函數(shù),因此,在進行圖形開發(fā)前需進行OpenGL程序開發(fā)的運行環(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基本圖元繪制該實驗將綜合利用第二章、第三章中有關(guān)基本圖元及其屬性控制的函數(shù),自我設(shè)計能夠?qū)⑾聦賵D形要素涵蓋的圖形,并編程實現(xiàn)。基本圖元:應(yīng)包括點、線段、各種多邊形;屬性控制:應(yīng)包括顏色設(shè)置、不同大小的點(如1像素點、3像素點等)、不同類型的線段(實線、點劃線等);繪制出屏幕坐標系的2個坐標軸,并利用繪制線段或多邊形方式繪制1個圓?!緦嶒瀳蟾嬉蟆?簡述VC+環(huán)境下OpenGL圖形系統(tǒng)開發(fā)的一般過程。2總結(jié)在程序設(shè)計和實現(xiàn)過程中遇到的主要問題及解決過程。3圖形坐標與世界坐標系、屏幕視口坐標系之間的關(guān)系是什么?在放大、縮小觀察圖形時應(yīng)調(diào)節(jié)那些函數(shù)的那些參數(shù)?實驗(二)【實驗題目】 二維圖元的幾何變換【實驗?zāi)康摹?、了解和掌握二維坐標系中物體坐標、觀察坐標、屏幕坐標之間的關(guān)系,能夠在合適的位置定義物體的幾何形狀,并通過定義合適的觀察坐標系在視口中顯示出物體。2、了解和掌握以坐標原點、坐標軸為中心的物體幾何變換方式,包括平移、旋轉(zhuǎn)和縮放對應(yīng)的函數(shù)。3、了解和掌握矩陣操作函數(shù)的原理和過程,并實現(xiàn)繞任意點或任意軸為參考進行平移、旋轉(zhuǎn)、縮放程序。【實驗內(nèi)容】1 了解和掌握二維坐標系中物體坐標、觀察坐標、屏幕坐標之間的關(guān)系。要求:對上一次編寫的程序中的幾何物體改變其幾何位置和大小,改變gluOrtho2D函數(shù)中的參數(shù),改變glViewport中的參數(shù),觀察所要繪制的圖形和視口的位置發(fā)生了什么變化,并思考原因。2 了解和掌握以坐標原點、坐標軸為中心的物體幾何變換方式。要求:繪制一個二維圖形,并使用以坐標原點、坐標軸為參考的物體幾何變換(包括平移、旋轉(zhuǎn)和縮放)函數(shù),對其進行相應(yīng)的幾何變換,并以不同顏色加以區(qū)分。3了解和掌握矩陣操作函數(shù)的原理和過程。要求:采用矩陣操作方式實現(xiàn)與第二步中相同的幾何變換過程。4實現(xiàn)繞任意點或任意軸為中心進行平移、旋轉(zhuǎn)、縮放程序。要求:根據(jù)課堂上所講的繞任意點或任意軸為參考進行幾何變換的原理,編寫相應(yīng)的旋轉(zhuǎn)和縮放函數(shù),并采用所實現(xiàn)的函數(shù)對所繪制的圖形實現(xiàn)繞任意點或任意軸為參考的幾何變換?!緦嶒瀳蟾嬉蟆?總結(jié)并簡述繞任意點或任意軸為中心進行幾何變換的原理。2總結(jié)在程序設(shè)計和實現(xiàn)過程中遇到的主要問題及解決過程。3用矩陣操作實現(xiàn)幾何變換有何優(yōu)點?實驗(三)【實驗題目】 線段、多邊形裁剪算法實現(xiàn)【實驗?zāi)康摹?、深入了解和掌握Cohen_Sutherland線段裁剪算法的原理和程序?qū)崿F(xiàn)過程。2、深入了解和掌握Sutherland-Hodgman多邊形裁剪算法的原理和程序?qū)崿F(xiàn)過程?!緦嶒瀮?nèi)容】1. 根據(jù)Cohen-Sutherland直線裁剪算法的原理,實現(xiàn)用矩形窗口對某線段的裁剪過程。要求:根據(jù)Cohen-Sutherland直線裁剪算法的原理,編寫實現(xiàn)該算法的各個子函數(shù),并在屏幕上畫出用于裁剪的矩形窗口,用不同的顏色和線型標注被裁剪的線段及裁剪后的結(jié)果。2. 根據(jù)Sutherland-Hodgman多邊形裁剪算法的原理,實現(xiàn)用矩形對某多邊形的裁剪過程。要求:根據(jù)Sutherland-Hodgman多邊形裁剪算法的原理,編寫實現(xiàn)該算法的各個子函數(shù),并在屏幕上畫出用于裁剪的矩形窗口,用不同的顏色和線型標注被裁剪的多邊形及裁剪后的結(jié)果。【實驗報告要求】1總結(jié)在程序設(shè)計和實現(xiàn)過程中遇到的主要問題及解決過程。2在Cohen-Sutherland直線裁剪算法中若改變9個區(qū)域的編碼方式會對裁剪結(jié)果產(chǎn)生什么影響?3在OpenGL中如何實現(xiàn)對二維圖形的裁剪?實驗(四)【實驗題目】 三維觀察算法實現(xiàn)【實驗?zāi)康摹?. 了解和掌握三維空間中幾何物體的繪制方法。2. 了解和掌握三維觀察變換的原理及OpenGL中實現(xiàn)三維觀察變換函數(shù)的參數(shù)對三維觀察的影響?!緦嶒瀮?nèi)容】1、了解和掌握三維空間中幾何物體的繪制方法。要求:了解在三維空間坐標系中三維物體的定義方法,注意多邊形內(nèi)部和外部定義,并繪制一個包含內(nèi)、外部的三維物體。2、實現(xiàn)三維觀察變換。要求:利用gluPerspective等相關(guān)三維觀察變換函數(shù),實現(xiàn)對上面所繪制的三維物體進行三維裁剪和三維觀察變換,并對函數(shù)中的參數(shù)進行改變,觀察屏幕顯示結(jié)果,進一步了解三維觀察變換的原理?!緦嶒瀳蟾嬉蟆?總結(jié)三維觀察變換相關(guān)函數(shù)中參數(shù)的不同變化對三維觀察結(jié)果的影響。2總結(jié)在程序設(shè)計和實現(xiàn)過程中遇到的主要問題及解決過程。3glMatrixMode函數(shù)對三維觀察變換有何影響?實驗(五)【實驗題目】 光照模型與紋理映射實現(xiàn)【實驗?zāi)康摹? 熟悉三維空間中光照模型的原理,掌握OpenGL中光照模型的定義方法。2 了解三維物體紋理映射的基本原理,掌握OpenGL中紋理映射的基本方法?!緦嶒瀮?nèi)容】1、 OpenGL中光照模型的定義方法的實現(xiàn)。要求:繪制一個空間三維物體,并在三維空間中定義不同的光源,涉及不同的光源類型、光的顏色,并開啟光源,觀察通過改變定義光源的不同參數(shù),得到的繪制結(jié)果有何不同。2、 OpenGL中紋理映射的實現(xiàn)。要求:畫出一個二維圖形,并采用程序生成紋理或讀入紋理圖像的方法,對所繪制的二維圖形進行紋理映射,通過改變不同的參數(shù)觀察所得到的結(jié)果有何不同?!緦嶒瀳蟾嬉蟆?總結(jié)三維空間中定義光照模型的過程,及定義光照模型相關(guān)函數(shù)中參數(shù)的不同變化對觀察結(jié)果的影響。2總結(jié)三維空間中紋理映射的過程,及紋理映射相關(guān)函數(shù)中參數(shù)的不同變化對觀察結(jié)果的影響。2總結(jié)在程序設(shè)計和實現(xiàn)過程中遇到的主要問題及解決過程。附錄A計算機圖形學(xué)實驗教學(xué)大綱一、制定實驗教學(xué)大綱的依據(jù)根據(jù)本校2008級本科指導(dǎo)性培養(yǎng)計劃和2008年6月制定的計算機圖形學(xué)課程教學(xué)大綱制定。二、本實驗課在專業(yè)人才培養(yǎng)中的地位和作用計算機圖形學(xué)是數(shù)字媒體技術(shù)專業(yè)必修的一門專業(yè)基礎(chǔ)課。通過本課程的學(xué)習,可以使學(xué)生了解計算機圖形學(xué)所研究的內(nèi)容、廣泛的應(yīng)用,掌握計算機圖形的基本生成算法、圖形幾何變換的原理及實現(xiàn)方法、二維和三維觀察、圖形表示、曲線、曲面的圖形生成技術(shù)及真實感圖形等。同時結(jié)合OpenGL圖形庫的使用,使學(xué)生掌握圖形程序開發(fā)的基本技術(shù)和方法。三、本實驗課程講授的基本實驗理論主要講授利用OpenGL圖形庫函數(shù)進行二維、三維圖形的繪制的基本方法,從而使學(xué)生能將計算機圖形學(xué)的基本理論與OpenGL圖形開發(fā)實踐有機結(jié)合起來,加深對理論的理解和應(yīng)用實踐能力。主要涉及圖形光柵化原理,及基于光柵化原理的所進行的基本圖元的生成、填充、裁剪算法、二維圖形變換、二維和三維觀察變換、光照模型和紋理映射等。1OpenGL運行環(huán)境配置及基本圖元繪制;2二維觀察變換及二維圖形幾何變換;3線段裁剪、多邊形裁剪算法;4三維觀察變換;5真實感圖形繪制中光照模型的設(shè)置和紋理映射過程。四、本實驗課學(xué)生應(yīng)達到的能力本實驗開設(shè)的目的:一方面使學(xué)生通過實驗對圖形學(xué)基本理論和算法在實踐中的應(yīng)用有一個直觀、深刻的認識,從而使學(xué)生掌握將理論應(yīng)用于實踐的方法,同時對理論的認識得到深化;另一方面,通過編程訓(xùn)練加強了學(xué)生對基于OpenGL圖形庫的基本圖形算法、二維圖形變換、二三維觀察變換、真實感圖形處理等實際編程動手能力的訓(xùn)練;為學(xué)生進一步了解和掌握包括圖形用戶界面、CAD、數(shù)字圖像處理等的原理、技術(shù)、方法打下堅實的理論和實踐基礎(chǔ)。五、學(xué)時、教學(xué)文件及形式學(xué)時:本課程總學(xué)時為48學(xué)時,其中實驗為10學(xué)時,占總學(xué)時的20%。教學(xué)文件:校編計算機圖形學(xué)實驗指導(dǎo)書;實驗報告學(xué)生自擬。要求學(xué)生實驗前預(yù)習實驗指導(dǎo)書,并理解相關(guān)算法思想及軟件實現(xiàn)過程,具體編程過程由學(xué)生獨立完成。六、實驗考核辦法與成績評定實驗課成績占本課程總成績15%,對缺少實驗成績者,本課程不予通過(對實驗成績的考核包括上機編程結(jié)果占50%,實驗報告占40%,考勤占10%)。七、儀器設(shè)備及注意事項儀器設(shè)備:有快速的較高性能微機和較大內(nèi)存與硬盤的設(shè)備注意事項:注意保護設(shè)備八、實驗項目的設(shè)置及學(xué)時分配序號實 驗 項 目學(xué)時實驗類型要求適用專業(yè)備注1基本圖元繪制2設(shè)計必修電子信息工程專業(yè)(圖文處理方向)上機2二維圖元的幾何變換2驗證必修電子信息工程專業(yè)(圖文處理方向)上機3線段、多邊形裁剪算法實現(xiàn)2驗證必修電子信息工程專業(yè)(圖文處理方向)上機4三維觀察算法實現(xiàn)2設(shè)計必修電子信息工程專業(yè)(圖文處理方向)上機5光照模型與紋理映射實現(xiàn)2驗證必修電子信息工程專業(yè)(圖文處理方向)上機制 定 人:吳學(xué)毅審 核 人:張二虎批 準 人:周世生制定日期:2008.7附錄B實驗環(huán)節(jié)詳細說明實驗(一):基本圖元繪制一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)用程序框架。其中前者是最為簡單、有效的知識驗證型程序開發(fā)框架?;诳刂婆_的OpenGL應(yīng)用程序框架與一般的C語言程序結(jié)構(gòu)一樣,只是其中在定義圖形窗口、初始化操作和圖形數(shù)據(jù)處理與顯示時,須使用相應(yīng)的OpenGL函數(shù)。下面就基于控制臺的應(yīng)用程序框架開發(fā)過程簡述如下:1由于VC6.0應(yīng)用程序開發(fā)系統(tǒng)只支持OpenGL核心庫函數(shù),而在程序開發(fā)中需使用大量核心庫所不具有的函數(shù),因此,在進行圖形開發(fā)前需進行OpenGL程序開發(fā)的運行環(huán)境配置。在此需將有關(guān)的函數(shù)庫文件拷貝到指定的文件目錄下即可。過程如下:將OpenGL開發(fā)庫子目錄下INCLUDE所有文件拷貝到VC所在子目錄的includegl目錄下。將OpenGL開發(fā)庫子目錄下LIB所有文件拷貝到VC所在子目錄的lib目錄下。將OpenGL開發(fā)庫子目錄下DLL所有文件拷貝到windows所在子目錄的system32目錄下。2.在創(chuàng)建新工程的Project標簽中應(yīng)選擇“Win32 Console Application”,并選擇適當?shù)谋4婀こ痰奈募A路徑。3在如圖1所示的創(chuàng)建向?qū)ы撁孢x擇A “Hello,World!”application.選項。點擊Finish按鈕完成工程的創(chuàng)建。點擊工具欄中的“Execute Program”按鈕進行工程的編譯、鏈接和運行,并出現(xiàn)Hell,World! Press any key to continue的運行結(jié)果。圖1 工程創(chuàng)建向?qū)?.在工程創(chuàng)建完畢需添加OpenGL庫。選擇“Project Setting”對話框,如圖2所示。在對話框中選擇“Link”標簽,在“Object/library modules”編輯框中加入“”。opengl32.lib glu32.lib glaux.lib圖2 工程設(shè)置對話框界面5在系統(tǒng)自動生成的*.cpp文件中,刪去原文件內(nèi)容,寫入自己的程序代碼。注意:1由于實驗室的機器對C、D盤進行了寫保護,因此,若機器中C、D盤中無相應(yīng)的OpenGL庫文件。則在每次上機時,需重新進行上述步驟1的庫文件配置操作。二、OpenGL控制臺應(yīng)用程序框架OpenGL在Win32控制臺下程序框架仍以main函數(shù)作為程序運行的入口,整個程序由3大部分組成。第1部分為應(yīng)包含的頭文件,其中主要是包含glut.h文件,該頭文件包含了OpenGL運行所需要調(diào)用核心庫和實用庫中的相關(guān)頭文件。第2部分為OpenGL繪制圖形所需的相關(guān)函數(shù)的聲明和定義,其中主要涉及:設(shè)置OpenGL運行初始環(huán)境,如myInit函數(shù)。繪制所要顯示的圖形,如myDisplay。響應(yīng)窗口變化,如myReshape。以上3部分得主要程序結(jié)構(gòu)在所有的win32控制臺程序框架中均相似,但每部分在不同的應(yīng)用中有所不同,要根據(jù)實際的繪圖需求來具體寫相關(guān)代碼。第3部分為main函數(shù)的框架,在初級的應(yīng)用中main函數(shù)調(diào)用的函數(shù)基本不變,主要是其中的一些參數(shù)可根據(jù)實際需要進行變動。/第1部分-在此給出了OpenGL運行所需要的3個頭文件#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運行初始環(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è)置窗口縮放時的視口變換/第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è)置標題myInit(); /繪制狀態(tài)初始化glutReshapeFunc(myReshape); /當窗口發(fā)生變化時,調(diào)用myReshape重新定義窗口屬性glutDisplayFunc(myDisplay); /調(diào)用myDisplay在窗口中繪制圖形glutMainLoop(); /循環(huán)繪制圖形和響應(yīng)事件處理三、基本圖元繪制該部分可參考以下程序完成基本圖元的繪制和屬性的控制,但要求不能完全照搬,可在歷屆的基礎(chǔ)上進行適當?shù)男薷摹?include stdafx.h#include GL/glut.hvoid myInit(void);void myReshape(GLsizei w,GLsizei h);void myDisplay(void);void myInit(void) /設(shè)置OpenGL運行初始環(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); /藍色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); /藍色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); /藍色/繪制相連三角形glBegin(GL_TRIANGLE_STRIP);glVertex2i(-20,30); glVertex2i(-50,-10); glVertex2i(-60,35);glVertex2i(-80,45);glEnd();/繪制相連的四邊形的頂點glColor3f(0.0,0.0,1.0); /藍色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(); /強制繪制/此處根據(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è)置為原點位于左下角,寬度為w,高度為hglMatrixMode(GL_PROJECTION); /設(shè)置當前投影矩陣堆棧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();繪制屏幕坐標系的2個坐標軸可在myDisplay函數(shù)中,按繪制線段的方式指定2個坐標軸的2對頂點坐標,如(0,0)與(10,0)為x軸,(0,0)與(0,10)為y軸。對于利用線段或多邊形繪制函數(shù)繪制1個圓,主要的問題是如何計算構(gòu)成圓周上各個頂點的坐標值??衫脠A的極坐標方程:來計算圓周上各點的坐標。其中N為將圓周等分的份數(shù),n為每次循環(huán)的計數(shù)。注意的問題:在程序編譯、鏈接、運行均無錯誤的情況下,經(jīng)常會出現(xiàn)看不到所繪制的圖形的情況,引起該情況的主要可能原因如下:1 在使用glVertex函數(shù)指定頂點坐標時,函數(shù)的指定參數(shù)類型與實際給定的參數(shù)類型不符,如glVertex2f(20,30);2 在圖形繪制函數(shù)如沒有Display中沒有調(diào)用glFlush(); 進行強制繪制。3 在使用glVertex函數(shù)指定頂點坐標值超出glOrtho或glOrtho2D所定義的裁剪體范圍。實驗(二):二維圖元的幾何變換本實驗包含4個環(huán)節(jié):一、了解和掌握二維坐標系中物體坐標、觀察坐標、屏幕坐標之間的關(guān)系。在實驗一所繪制的基本圖元的基礎(chǔ)上,通過改變glVertex函數(shù)所指定的頂點位置來理解頂點對幾何物體位置和大小的影響;通過改變glBegin的參數(shù)來理解不同基本圖元繪制參數(shù)與頂點坐標對物體形狀的影響;通過改變glOrtho2D函數(shù)中的參數(shù)來理解裁剪體范圍、是如何指定的及其對顯示的場景范圍的影響;通過改變glViewport中的參數(shù),觀察所要繪制的圖形和視口的位置發(fā)生了什么變化,并思考原因。二、 了解和掌握以坐標原點、坐標軸為中心的物體幾何變換方式。理解在OpenGL中幾何變換的2重含義,一種是從對所繪制物體本身的幾何變換,一種可以從對坐標系的幾何變換來理解,其中后者是最根本的方式。在OpenGL的圖形繪制中,模型視圖矩陣對圖形繪制的頂點坐標會產(chǎn)生影響,在使用幾何變換函數(shù)(包括平移、旋轉(zhuǎn)和縮放)對圖形進行變換時,實質(zhì)上是改變了模型視圖矩陣的內(nèi)容,并將模型視圖矩陣乘物體指定的頂點坐標,所得結(jié)果為施加幾何變換后物體的真正坐標。glMatrixMode(GL_MODELVIEW) 函數(shù)指定了當前使用的矩陣為模型視圖矩陣。glLoadIdentity()函數(shù)可將模型視圖矩陣變?yōu)閱挝魂?,從而可以還原坐標系。繪制一個二維圖形,并使用以坐標原點、坐標軸為中心的物體幾何變換(包括平移、旋轉(zhuǎn)和縮放)函數(shù),對其進行相應(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();/用藍色繪制矩形區(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();/用綠色繪制坐標原點返回到初始位置繞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è)置為原點位于左下角,寬度為w,高度為hglMatrixMode(GL_PROJECTION); /設(shè)置當前投影矩陣堆棧glLoadIdentity();/建立裁剪體 gluOrtho2D(-200,400,-200,400); glMatrixMode(GL_MODELVIEW); /設(shè)置模型觀察矩陣堆棧glLoadIdentity();三、了解和掌握矩陣操作函數(shù)的原理和過程。使用矩陣的堆棧操作方式同樣可以完成對圖形的幾何變換,且是一種簡潔、高效的方式??蓞⒖既缦麓a完成采用矩陣操作方式實現(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);四、實現(xiàn)繞任意點或任意軸為中心進行平移、旋轉(zhuǎn)、縮放程序。繞任意軸進行旋轉(zhuǎn)變換和以任意點為參考點進行縮放的自定義函數(shù)實現(xiàn)。其中wcPt3D為一個三維點類,其定義如下:class wcPt3D pulic: GLfloat x,y,z;/三維點的坐標值;l 繞任意軸進行三維旋轉(zhuǎn)變換在如下的繞任意軸進行旋轉(zhuǎn)變換的函數(shù)實現(xiàn)中,參數(shù)P1、P2為指定的旋轉(zhuǎn)軸,theta為旋轉(zhuǎn)角度。void rotate3D(wcPt3D p1,wcPt3D p2,GLfloat theta)/* 計算P2P1向量的x、y、z分量 */GLfloat vx=(p2.x-p1.x);GLfloat vy=(p2.y-p1.y);GLfloat vz=(p2.z-p1.z);/* 按5.52式中順序進行逆平移-旋轉(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平移到坐標原點l 以任意點為參考點進行三維縮放變換在如下的以任意點為參考點進行三維縮放變換的實現(xiàn)中,參數(shù)fixedPt為某參考點,sx、sy、sz為縮放因子。void scale3D(GLfloat sx,GLfloat sy,GLfloat sz,wcPt3D fixedPt)/*按5.50式中順序進行逆平移-縮放-平移的變換 */* 將參考點移回到原始位置*/glTranslatef(fixedPt.x,fixedPt.y,fixedPt.z);glScalef(sx,sy,sz); /以原點為參考點進行縮放變換glTranslatef(-fixedPt.x,-fixedPt.y,-fixedPt.z); /將參考點移至坐標原點實驗(三):線段、多邊形裁剪算法實現(xiàn)本節(jié)是兩個驗證性實驗,通過對代碼的閱讀,理解相應(yīng)的算法是如何通過代碼來實現(xiàn)。一、 根據(jù)Cohen-Sutherland直線裁剪算法的原理,實現(xiàn)用矩形對某線段的裁剪過程。根據(jù)Cohen-Sutherland直線裁剪算法的原理,編寫實現(xiàn)該算法的各個子函數(shù),并在屏幕上畫出用于裁剪的矩形窗口,用不同的顏色和線型標注被裁剪的線段及裁剪后的結(jié)果。其算法實現(xiàn)如下:/ Cohen_Sutherland_console.cpp : Defines the entry point for the console application.#include #include / Header File For The Glut Library/*根據(jù)兩個端點的編碼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ù)點(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的各個元素初始化為0for(i=0;i4;i+)codei=0;if(xxw_max)code2=1;if(yyw_max)code1=1;else if(yyw_min)code0=1;/*根據(jù)兩個端點的編碼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)點是否在窗口內(nèi),若在窗口內(nèi),則將(x1,y1)與(x2,y2)進行交換,使得(x1,y1)點始終為被裁剪的線段的起點。*/int swap_if_needed(int code1, int code2)int i,flag1,flag2,tmp; flag1=1;/*若code1有1位為1,則flag1=0,表明端點1在窗外;若code1的每一位均為0,則flag1=1,表明端點1在窗內(nèi)。*/for(i=0;i4;i+)if(code1i=1)flag1=0;break;/對第二個端點的判別與端點1相同flag2=1;for(i=0;i4;i+) if(code2i=1)flag2=0;break;/端點1、2均在窗外,返回0if(flag1=0)&(flag2=0)return 0;/若端點1在窗內(nèi),端點2在窗外,則需交換兩個端點if(flag1=1)&(flag2=0)for(i=0;i4;i+)tmp=code1i;code1i=code2i;code2i=tmp;return 1;return 0;/*此為裁剪函數(shù)的主入口,上述4個輔助函數(shù)均在此處調(diào)用。函數(shù)參數(shù)(x1,y1)、(x2,y2)為兩個端點坐標,后四個參數(shù)為裁剪窗口的坐標。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); /給第一個端點編碼encode(x2,y2,code2,xw_min,xw_max,yw_min,yw_max); /給第二個端點編碼/若線段在窗口內(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 土方供應(yīng)合同范本
- 公館購房合同范本
- 加入商場合作合同范本
- 農(nóng)村柴火售賣合同范本
- 借用單位合同范本
- 個人頂賬房合同范本
- 單位裁員解聘合同范本
- 分體空調(diào)保養(yǎng)合同范本
- 勞務(wù)大工小工合同范本
- 公司貨物出口合同范本
- 依圖科技業(yè)務(wù)概述
- 支氣管鏡室工作制度
- 紫精丹_圣惠卷九十五_方劑加減變化匯總
- 船模制作教程(課堂PPT)課件(PPT 85頁)
- 防腐檢查培訓(xùn)教材ppt課件
- 天藍色商務(wù)發(fā)展歷程時間軸PPT模板課件
- 第5章液相傳質(zhì)步驟動力學(xué)
- GJB 國軍標標準對應(yīng)名稱解析
- 肺炎鏈球菌肺炎醫(yī)學(xué)PPT課件
- 小學(xué)英語微課ppt
- 小學(xué)交通安全主題班會:《一盔一帶 安全出行》
評論
0/150
提交評論