計算機圖形學期末考查報告2015-2016第一學期_第1頁
計算機圖形學期末考查報告2015-2016第一學期_第2頁
計算機圖形學期末考查報告2015-2016第一學期_第3頁
計算機圖形學期末考查報告2015-2016第一學期_第4頁
計算機圖形學期末考查報告2015-2016第一學期_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、x計算機圖形學期末考查報告學年學期:xxxx專業班級:xxxx 學生姓名:xxxx 學 號:xxxx 成 績: 任課老師:xxxx 提交日期:xxxx 內容與要求一、目的本學期通過課堂授課、上機練習、作業等諸多教學環節,要求學生了解計算機圖形學理論體系及其在圖形處理系統開發中的應用;掌握二維及三維圖形的幾何變換、投影變換、裁剪、消隱的基本理論和方法;理解基本圖元、曲線、曲面的生成算法;理解圖形的明暗處理、紋理映射、陰影生成、真實感圖形的生成與處理的原理。掌握OpenGL編程基礎知識及三維圖形系統開發的實用技術。期末考查將以計算機圖形學OpenGL編程為主要考查內容。 二、內容及要求(一)、總結

2、OpenGL編程基礎知識OpenGL不是一種編程語言,而是一種API(Application Programming Interface,應用程序編程接口)。 OpenGL的核心庫中包含了OpenGL多個函數,這些函數都以“g1”為前綴最基本的命令函數。 OpenGL的實用函數庫是比OpenGL核心庫更高一層的函數庫,也可以看作是對基本核心庫的擴充。它提供了四十多個函數,這些函數都以字母“glu”為前綴。GLUT代表OpenGL應用工具包(GLUT: OpenGL Utility Toolkit ),是一個和窗口系統無關的工具包。OpenGL包含200多個函數。按照功能對這些函數進行分類是大有

3、幫助的:(1)圖元函數。這些函數定義了可在屏幕上生成圖像的元素。有兩種類型的圖元:幾何圖元(例如多邊形),它們可采用2個、3個或者4個維度來定義;以及圖像圖元,比如位圖。(2)屬性函數。這些函數控制圖元的外觀。這些函數定義了顏色、線條類型、材料性質(material property、光源以及材質。(3)觀視函數。這些函數決定了照相機的屬性。OpenGL提供了一個虛擬照相機,可相對于圖元函數定義的對象來定位它和調整它的方向。還可對照相機的鏡頭進行控制,使其產生廣角與遠距拍攝效果。(4)視窗函數。這些函數不是OpenGL核心的一部分。但是,由于它們對于交互式應用程序的重要性,所以使用單獨的庫(比

4、如GLUT)來容納它們。我們可利用這些函數來控制屏幕上的窗口顯示,并可通過它們來使用鼠標及鍵盤。(5)控制函數。這些函數允許我們啟用各種OpenGL特性。還可利用它們來了解一個特定實現具有的能力。 按照使用功能,GLUT中的函數可以分為以下幾類:1.初始化和創建窗口(1)函數如下:void glutInit(ant argc,char*argv);功能:該函數用于初始化GLUT庫。(2)函數如下: Void glutInitDisplayMode(unsigned int mode);功能:該函數為即將創建的窗口指定一種顯示模式,如RGBA或顏色索引,單緩存或雙緩存。另外,還可以指定該窗口相關

5、的深度、模板或累積緩存。(3)函數如下:Void glutInitWindowSize(int width,int height);功能:該函數為即將創建的窗口指定一個初始的大小。(4)函數如下:Void glutInitWindowPosition(int x,int y);功能:該函數為即將創建的窗口指定一個初始的位置。(5)函數如下:Void glutCreateWindow(char*name);功能:該命令用于創建一個允許使用的OpenGL窗口,并將其視為當前窗口。 2.處理窗口和愉入(1)函數如下:void glutDisplayFunc(void(*func)(void);功能:

6、該函數用于繪制當前窗口。(2)函數如下:Void glutReshapeFunc(void(*func)(int width,int height);功能:該函數指定了當窗口的尺寸被縮放或移動時所調用的函數。(3)函數如下:Void glutKeyboardFunc(void(*func)(unsigned int key,int x,int y);功能:該函數指定了當按下一個生成ASCII字符的鍵時,調用的函數。(4)函數如下:Void glutMouseFunc(void(*fonc)(int button,int state,int x,int y);功能:該函數指定了當按下或釋放一個鼠

7、標鍵時,調用的函數。(5)函數如下:Void glutSpecialFunc(void(*func)(unsigned int key,int x,int y);功能:該函數指定了當按下一個非ASCII字符的鍵(如Shift鍵)時,調用的函數。(6)函數如下:Void glutMotionFunc(void(*func)(int x,int y);功能:該函數指定了當按下鼠標在窗口內移動時,調用的函數。3. 繪制三維物體(1) 函數如下:Void glutWireCone(GLdouble base,GLdouble height,GLint slices,GLint stacks);Void

8、 glutSolidCone(GLdou6le base,GLdouble height,GLint slices,GLint stacks);功能:繪制一個線框的或實心的圓錐體。圓錐的底面位于原點(0,0,0),圓錐的頂點位于Z軸之上。(2)函數如下:Void glutWireCube(GLdouble size);Void glutSolidCube(GLdouble size);功能:繪制一個邊長為size的線框的或實心立方體,立方體的中心位于原點。(3) 函數如下:Void glut WireDodecahedron(Void);Void glutSolidDodecahedron(V

9、oid);功能:繪制一個線框的或實心的正十二面體。(4) 函數如下:Void glut WireIcosahedron(Void);Void glutSolidIcosahedron(Void);功能:繪制一個線框的或實心的正二十面體。(5)函數如下:Void glut WireOctahedran(Void);Void glutSolidOctahedron(Void);功能:繪制一個線框的或實心的正八面體。(6)函數如下:Void glut WireSphere(GLdouble radius,GLint slices,GLint stacks);Void glutSolidSphere(

10、GLdouble radius,GLint slices,GLint stacks);功能:繪制一個線框的或實心的球體。(7) 函數如下:Void glut WireTetrahedron(void);Void glutSolidTetrahedron(void);功能:繪制一個線框的或實心的正四面體。(8)函數如下:Void glutWireTorus(GLdouble innerRadius,GLdouble outerRadius,GLint slices,GLint stacks);Void glutSolidTorus(GLdnuble innerRadius,GLdouble ou

11、terRadius,GLint slices,GLint stacks);功能:繪制一個線框的或實心的圓環體。(9)函數如下:Void glut WireTeapot(GLdouble Size);Void glutSolidTeapot(GLdouble Size);功能:繪制一個以半徑為size的線框的或實心茶壺。4.管理后臺處理當沒有其他的待處理的事件時,用戶可以用函數glutIdleFun。指定執行另一個函數。函數如下:void glutIdIeFunc(void(*func)(void);功能:該函數的參數中指定了一個函數名func,當其他的事情處于掛起時,就可以執行函數func。5

12、.運行程序在完成了所有的設置之后,最后要做的事情就是開始執行所有的命令了,這時調用運行程序的函數。函數如下:void glutMainLoop(void);功能:這個函數開始啟動主GLUT處理循環。OpenGL是圖形硬件的軟件接口,其中包括了大約250個不同的函數。作為一種應用程序編程接口(API ), OpenGL的庫函數遵循C語言的調用規定。在以后的示例中,程序都是以C語言編寫的。一個實用的OpenGL程序從規模上說比較龐大,但基本結構是非常簡單的。一般包括以下幾個部分:(1)定義繪制對象。通常對象繪制于指定的窗口之上。首先必須定義窗口在屏幕上的位置及窗口的大小等屬性,然后在窗口上建立坐標

13、系,定義圖形在窗口中的生成位置。(2)初始化。即初始化OpenGL中的狀態變量,為下一步圖形顯示做準備工作。包括定義投影類型、定義光照模型及紋理映射等。(3)渲染屏幕圖像。按照顯示的方位角度等要求繪制并顯示圖形,將物體的數學描述及狀態變量如顏色紋理等變換為屏幕像素。OpenGL函數命名與數據類型 OpenGL函數都遵循一個命名的約定,函數的頭幾個字母會說明該函數來自哪個庫,后面部分包含一個根命令,代表該函數相應的OpenGL命令,后綴中的數字和字母表示該函數需要的參數類型與個數。比如對于glColor3f命令,g1前綴代表該函數來自g1庫,其根命令為Color,代表對顏色的設定,后綴3f表示該

14、函數需要3個浮點型的參數。同樣地,OpenGL中對常量的定義,都是以大寫字母GL開頭,并且所有的字母都大寫,在單詞之間以下劃線進行分隔,例如GL_ COLOR BUFFER BIT等。有一些OpenGL函數的后綴中帶有一個字母V,這表示該命令帶有一個指向矢量或數組值的指針作為參數。許多函數都有矢量和非矢量兩種參數形式。OpenGL中還提供了一些更具描述性的名稱。如GLenum用于枚舉變量,GLbitfield用于包含二進制位字段的變量,GLboolean變量用于表示真或假的條件。OpenGL數據類型也可同樣用于對數組和指針的定義。比如10個GLint的變量數組只需定義為:GLint ints1

15、0;對于指向GLfloat變量的指針可以定義為:GLfloat*floats;庫和頭文件 所有的OpenGL核心庫的函數、類型和宏的原型都包括在頭文件gl.h中,實用函數庫glu函數的原型則位于另一個頭文件glu.h中,這些文件通常要放在編程環境include路徑中某個特殊目錄下。窗口坐標設置 在所有的窗口操作中,當執行初始化打開窗口、移動窗口或改變窗口的大小尺寸操作時,都會調用到GLUT中的一個子程序:函數如下:Void glutReshapeFunc(void(*func)(int width,int height);它所包含的兩個變量width和height,指定了窗口新的寬度和高度。只

16、要窗口的大小發生改變,glutReshapeFunc()就可以收到新的寬度與高度。我們就可以利用這些信息,定義OpenGL函數在窗口上坐標系及作圖區域。對于二維的坐標系,最常用的方法是調用函數glutReshapeFunc(myreshape),其中reshape()是用戶自己定義的函數。(2) 、闡述三維表面數據結構(以立方體為例) 假設要表示的形體T可以放在一個充分大的實體C內,C的邊長為2n,形體TC,它的八叉樹可以用以下遞歸的方法來定義:八叉樹的每個節點與C的一個子立方體對應,樹根與C本身相對應,如果T=C,那么T的八叉樹僅有樹根,如果T不等于 C,則C等分為八個子立方體,每個子立方體

17、與樹根的一個子節點相對應。只要某個子立方體不是完全空白或完全為T所占據,就要被八等分,從而對應的節點也就有了八個子節點。這樣遞歸判斷、分割一直要進行到節點所對應的立方體或是完全空白,或者是完全為T占據,或是其大小已是預先定義的體素大小,并且對它與T之交作一定的“舍入”,使體素或認為是空白的,或認為是T占據的。如此所生成的八叉樹上的節點可以分為三類:一是灰節點,對應的立方體部分地為T所占據;二是白節點,對應的立方體中無T的內容;三是黑節點,對應的立方體全為T所占據。后兩類又稱為葉節點。 與四叉樹結構相類似的八叉樹結構可以沿用四叉樹的有關方法。根據存儲方式的不同,八叉樹可以分為常規的、線形的、一對

18、八的八叉樹等等。 1)規則的八叉樹 八叉樹的存儲結構是用一個有九個字段的記錄來表示樹中的每個結點,其中一個字段用來秒蘇該結點的特性,其余的八段用來作為存放指向其八個子結點的指針。但是規則八叉樹的缺陷較多,最大的問題就是指針占用了很大的空間。因此雖然其易于理解掌握,但存儲代價太大。 2)線形八叉樹 線形八叉樹注重考慮的是如何提高空間利用率,用某一預先確定的次序遍歷八叉樹,將八叉樹轉換成一貫線形表,表的每個元素與一個結點相對應。線形八叉樹不僅節省存儲空間,對某些運算也比較方便,但是不夠靈活。 3)一對八式的八叉樹 在一對八式的八叉樹中,一個非葉結點有八個子結點,如果一個記錄與一個結點對應,那么在這

19、個記錄中描述的是這個結點的八個子結點的特征值,而指針給出的則是該八個子結點所對應記錄的存放處,而且還隱含地假設了這些子結點記錄存放的次序。也就是說,即使某個記錄是不必要的,那么相應的存儲位置也必須空閑在那里,以保證不會錯誤地存取到其它同層結點的記錄。很顯然,當它不是完全八叉樹的時候,存儲空間會有一定的浪費。為了克服這種缺陷,一是增加計算量,即在存取相應結點記錄之前,首先檢查它的父結點記錄,看一下之前有幾個葉結點,從而可以知道應該如何存取所需結點記錄。這種方法可以減小存儲需求,但會增加計算量;另一個是在記錄中增加一定的信息,使計算工作適當減少或者更方便。例如在原記錄中增加三個字節,一分為八,每個

20、字節點對應三位,代表它的子結點在指針指向區域中的偏移。(三)、總結OpenGL顏色、紋理、光源設置方法以及鼠標和鍵盤響應函數的用法顏色:從視覺的角度看,顏色由其色彩(hue )、飽和度(saturation)和亮度( lightness)決定。顏色模型:RGB顏色模型、CMY顏色模型、HSV顏色模型。在執行程序之初,必須先設置顏色的顯示方式。OpenGL中提供了兩種顏色模式:RGBA模式和顏色索引模式。顏色的顯示方式一旦確定下來,就不能再進行更改。對于創建RGBA模式或顏色索引模式的窗口,使用命令:glutInitDisplayMode(GLU_ RGB);或:glutInitDisplayM

21、ode(GLUT_INDEX);在RGBA模式下,可使用glColor*()函數指定當前顏色。Void glColor3b s i f d ub us ui(TYPE R,TYPE G,TYPE B);Void glColor4b s i f d ub us ui(TYPE R,TYPE G,TYPE B,TYPE A);Void glColor3b s i f d ub us ui(const TYPE*v);Void glColor4b s i f d ub us ui(const TYPE*v);功能: 用RGBA模式指定當前顏色。在顏色索引模式中,可使用如下函數來設置當前的顏色索引:V

22、oid glIndexs i f d(TYPE C);Void glIndexs i f d(TYPE C);著色模式:OpenGL中的函數glShadeModel()用于指定不同的著色模式。Void glShadeModel(Glrnum mode);紋理:我們可使用函數g1TexImage1D()和函數g1TexImage3D(),建立一維、二維、三維紋理映射。幾何對象上的點與紋理單元之間的映射是通過函數g1TexCoord*()完成的:可通過設置矩陣模式和使用處理模型一觀視矩陣與投影矩陣的相同技術來更改紋理矩陣:glMatrixMode(GL_ TEXTURE);盡管函數glTexCoo

23、rd*()和glTexImage*()是紋理映射中的必備例程,但還必須設置一些額外的所需參數。這里還有其他可選參數,它們為如何將紋理應用到對象表面提供了更多的控制。可以通過g1TexParameter*)設置這些參數。二維紋理的典型用法可能類似于以下形式:對表面應用紋理:通過函數glTexEnv*()設置。置換(replace)模式是最重要模式,在該模式中,只通過紋理顏色確定從幀緩存中可看到的顏色。我們可通過函數glTexEnv*()設置這些模式。默認的調諧模式與執行以下函數等價:glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);OpenGL要求紋理大小(小于任何邊界)是2的冪。我們可以使用GLU函數gluScaleImage()將圖像映射成紋理映射可接受的大小,還可以通過函數glCopyTexImage2D()從幀緩存圖像獲取紋理映射。我們使用GLU函數gluQquadricTexture()來啟動紋理坐標的自動生成:紋理對象:光源設置方法:定義光源:定義材質:控制陰影計算:若確實需要

溫馨提示

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

評論

0/150

提交評論