課程坐標(biāo)系統(tǒng)、基本圖元的定義與繪制_第1頁(yè)
課程坐標(biāo)系統(tǒng)、基本圖元的定義與繪制_第2頁(yè)
課程坐標(biāo)系統(tǒng)、基本圖元的定義與繪制_第3頁(yè)
課程坐標(biāo)系統(tǒng)、基本圖元的定義與繪制_第4頁(yè)
課程坐標(biāo)系統(tǒng)、基本圖元的定義與繪制_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余28頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、坐標(biāo)系統(tǒng)基本圖元的定義與繪制OpenGL中使用的坐標(biāo)系有兩種,分別為世界坐標(biāo)系和屏幕坐標(biāo)系。世界坐標(biāo)系OpenGL內(nèi)部處理時(shí)使用的三維坐標(biāo)系屏幕坐標(biāo)系在計(jì)算機(jī)屏幕上繪圖時(shí)使用的坐標(biāo)系。坐標(biāo)系統(tǒng)通常,OpenGL所使用的世界坐標(biāo)系為右手型,如下圖所示。從計(jì)算機(jī)屏幕的角度來(lái)看,x軸正方向?yàn)槠聊粡淖笙蛴?,y軸正方向?yàn)槠聊粡南孪蛏希瑉軸正方向?yàn)槠聊粡睦锵蛲?。而進(jìn)行旋轉(zhuǎn)操作時(shí)需要指定的角度的方向則由右手法則來(lái)決定,即右手握拳,大拇指直向某個(gè)坐標(biāo)軸的正方向,那么其余四指指向的方向即為該坐標(biāo)軸上的角的正方向(即角增加的方向),在上圖中用圓弧形箭頭標(biāo)出。 坐標(biāo)系統(tǒng)將世界坐標(biāo)系中的物體映射到屏幕坐標(biāo)系上的方法稱

2、為投影。投影的方式包括平行投影和透視投影兩種。 平行投影投影線相互平行,投影的結(jié)果與原物體的大小相等,因此廣泛地應(yīng)用于工程制圖等方面。 透視投影投影線相交于一點(diǎn),因此投影的結(jié)果與原物體的實(shí)際大小并不一致,而是會(huì)近大遠(yuǎn)小。因此透視投影更接近于真實(shí)世界的投影方式。坐標(biāo)系統(tǒng)任何復(fù)雜的三維模型都是由基本的幾何圖元:點(diǎn)、線段和多邊形組成的,有了這些圖元,就可以建立比較復(fù)雜的模型。因此這部分內(nèi)容是學(xué)習(xí)OpenGL編程的基礎(chǔ)。什么是基本圖元?glBegin()和glEnd():OpenGL圖元是抽象的幾何概念,不是真實(shí)世界中的物體,因此須用相關(guān)的數(shù)學(xué)模型來(lái)描述。所有的圖元都是由一系列有順序的頂點(diǎn)集合來(lái)描述的

3、。OpenGL中繪制幾何圖元,必須使用glBegin()和glEnd()這一對(duì)函數(shù),傳遞給glBegain()函數(shù)的參數(shù)唯一確定了要繪制何種幾何圖元,同時(shí),在該函數(shù)對(duì)中給出了幾何圖元的定義,函數(shù)glEnd()標(biāo)志頂點(diǎn)列表的結(jié)束。這兩個(gè)函數(shù)從程序員的角度上來(lái)看的話就是創(chuàng)建命名管道,用來(lái)接收包含在兩個(gè)函數(shù)中間代碼中給出的數(shù)據(jù)。glBegin(mode)中的mode其實(shí)是傳給OpenGL系統(tǒng)需要?jiǎng)?chuàng)建的管道類型。創(chuàng)建命名管道傳輸相應(yīng)的數(shù)據(jù)管道數(shù)據(jù)已傳送完基本圖元的繪制下面的代碼繪制了一個(gè)多邊形:glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f)

4、;glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glBegin(GL_POLYGON);glVertex2f(100.0,100.0);glVertex2f(100.0,130.0);glVertex2f(130.0,130.0);glVertex2f(140.0,115.0);glVertex2f(130.0,100.0);glEnd();glFlush();.GL_PLOYGON例子:需要指出的是,OpenGL所定義的點(diǎn)、線、多邊形等圖元與一般數(shù)學(xué)定義不太一樣,存在一定的差別。這種差別是兩個(gè)方面原因造成的,它們都導(dǎo)致最終圖形轉(zhuǎn)化為圖像時(shí)顯示不精確:其一

5、,OpenGL中的點(diǎn)坐標(biāo)是由浮點(diǎn)數(shù)表示的,精確性受限于計(jì)算機(jī)的浮點(diǎn)精度。其二,由于位圖本身的原因?qū)е曼c(diǎn)在顯示器上的表示最小單位為像素,無(wú)論像素顆粒多么小均無(wú)法小到與數(shù)學(xué)中的點(diǎn)一樣,只能作近似表示。因?yàn)樽鲞^(guò)近似,所以就會(huì)出現(xiàn)我們所說(shuō)的“走樣”。從幾何空間到顯示器函數(shù)函數(shù)意義glColor*()設(shè)置當(dāng)前顏色glIndex*() 設(shè)置當(dāng)前顏色表glNormal*()設(shè)置法向坐標(biāo)glEvalCoord*()產(chǎn)生坐標(biāo)glCallList(),glCallLists()顯示列表glTexCoord*()設(shè)置紋理坐標(biāo) glEdgeFlag*() 控制邊界繪制glMaterial*()設(shè)置材質(zhì)其它可包含在gl

6、Begin()和glEnd()中的函數(shù):點(diǎn)的定義:用浮點(diǎn)值表示的點(diǎn)稱為頂點(diǎn)(Vertex)。 所有頂點(diǎn)在 OpenGL內(nèi)部計(jì)算時(shí)都使用三維坐標(biāo)(x,y,z)來(lái)處理,用二維坐標(biāo)(x,y)定義的點(diǎn)在OpenGL中默認(rèn)z值為0。頂點(diǎn)坐標(biāo)也可以用齊次坐標(biāo)(x,y,z,w)來(lái)表示,如果w不為0.0,這些齊次坐標(biāo)表示的頂點(diǎn)即為三維空間點(diǎn)(x/w,y/w,z/w),一般來(lái)說(shuō),w缺省為1.0。定義點(diǎn)的正則表達(dá)式:glVertex234sifdV(TYPE cords);例如:glVertex2f(2.0f,3.0f);/二維坐標(biāo)定義頂點(diǎn);點(diǎn)線的定義在OpenGL中,線代表線段(Line Segment),它由

7、一系列頂點(diǎn)順次連結(jié)而成。線的表示有三種:1、單一線段2、首尾相連的條狀線段3、相互分離的線段組線段的多種形式:OpenGL能指定線的寬度并繪制不同的虛點(diǎn)線,如點(diǎn)線、虛線等。相應(yīng)的函數(shù)形式如下:1、void glLineWidth(GLfloat width); /定義線寬2、void glLineStipple(GLint factor,GLushort pattern);/設(shè)置當(dāng)前線為虛點(diǎn)模式線glLineStipple(GLint factor, GLushort pattern);參數(shù)pattern是一系列的16位二進(jìn)制數(shù)(0或1),它重復(fù)地賦給所指定的線,從低位開(kāi)始,每一個(gè)二進(jìn)制位代表

8、一個(gè)象素, 1表示用當(dāng)前顏色繪制一個(gè)象素(或比例因子指定的個(gè)數(shù)),0表示當(dāng)前不繪制,只移動(dòng)一個(gè)象素位(或比例因子指定的個(gè)數(shù))。參數(shù)factor是個(gè)比例因子,它用來(lái)拉伸pattern中的元素,即重復(fù)繪制1或移動(dòng)0,比如,factor為2,則碰到1時(shí)就連續(xù)繪制2次,碰到0時(shí)連續(xù)移動(dòng)2個(gè)單元。factor的大小范圍限制在1到255之間。虛點(diǎn)模式虛點(diǎn)模式使用:在繪制虛點(diǎn)線之前必須先啟動(dòng)虛點(diǎn)模式,即調(diào)用 函數(shù)glEnable(GL_LINE_STIPPLE);結(jié)束時(shí),調(diào)用glDisable(GL_LINE_STIPPLE)關(guān)閉。下面代碼繪制了一個(gè)點(diǎn)線:glLineStipple (1, 0 x1C47)

9、;/* 虛點(diǎn)線 */glEnable(GL_LINE_STIPPLE);glColor3f(0.0,1.0,0.0);glBegin(GL_LINES); glVertex2f(x1,y1); glVertex2f(x2,y2); glEnd(); glDisable(GL_LINE_STIPPLE)虛點(diǎn)模式多邊形的種類:多邊形一般分為凸多邊形和凹多邊形,凸多邊形的含義是多邊形任意兩定點(diǎn)的連線位于多邊形內(nèi)部,反之則為凹多邊形,如下圖:多邊形OpenGL中的多邊形OpenGL定義的多邊形是由一系列線段依次連結(jié)而成的封閉區(qū)域,多邊形可以是平面多邊形,即所有頂點(diǎn)在一個(gè)平面上,也可以是空間多邊形。 O

10、penGL規(guī)定多邊形中的線段不能交叉,區(qū)域內(nèi)不能有空洞,也即多邊形必須是凸多邊形,否則不能被OpenGL函數(shù)接受。繪制凹多邊形的問(wèn)題實(shí)際應(yīng)用中,往往需要繪制一些凹多邊形,通常解決的辦法是對(duì)它們進(jìn)行分割,用多個(gè)三角形來(lái)替代。顯然,繪制這些三角形時(shí),有些邊不應(yīng)該進(jìn)行繪制,否則,多邊形內(nèi)部就會(huì)出現(xiàn)多余的線框。OpenGL提供的解決辦法是通過(guò)設(shè)置邊標(biāo)志命令glEdgeFlag()來(lái)控制某些邊產(chǎn)生繪制,而另外一些邊不產(chǎn)生繪制,這也稱為邊界標(biāo)志線或非邊界線。這個(gè)命令的定義如下:void glEdgeFlag(GLboolean flag);void glEdgeFlag(PGLboolean pflag)

11、;多邊形多邊形的繪制模式包含有:全填充式、輪廓點(diǎn)式、輪廓線式、圖案填充式及指定正反面等。下面分別介紹相應(yīng)的OpenGL函數(shù)形式。多邊形模式設(shè)置函數(shù)原型:void glPolygonMode(GLenum face,GLenum mode);設(shè)置圖案填充式多邊形函數(shù)原型:void glPolygonStipple(const GLubyte *mask);多邊形的繪制glPolygonMode(GLenum face,GLenum mode);參數(shù)face為GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;參數(shù)mode為GL_POINT、GL_LINE或GL_FILL,分別表

12、示繪制輪廓點(diǎn)式多邊形、輪廓線式多邊形或全填充式多邊形。在OpenGL中,多邊形分為正面和反面,對(duì)這兩個(gè)面都可以進(jìn)行操作,在缺省狀況下,OpenGL對(duì)多邊形正反面是以相同的方式繪制的,要改變繪制狀態(tài),必須調(diào)用PolygonMode()函數(shù)。glPolygonStipple(const GLubyte *mask);參數(shù)mask是一個(gè)指向32x32位圖的指針。與虛點(diǎn)線繪制的道理一樣,某位為1時(shí)繪制,為0時(shí)什么也不繪。注意,在調(diào)用這個(gè)函數(shù)前,必須先啟動(dòng)glEnable(GL_POLYGON_STIPPLE);不用時(shí)用glDisable(GL_POLYGON_STIPPLE)關(guān)閉。多邊形的繪制指定多邊

13、形的正反面函數(shù)原型:void glFrontFace(GLenum mode);在正常情況下,OpenGL中的多邊形的正面和反面是由繪制的多邊形的頂點(diǎn)順序決定的,逆時(shí)針繪制的面是多邊形的正面,但是,在OpenGL中使用該函數(shù)可以自定義多邊形的正面。該函數(shù)的參數(shù)mode指定了正面的方向。它可以是CL_CCW和CL_CW,分別指定逆時(shí)針和順時(shí)針?lè)较驗(yàn)槎噙呅蔚恼较颉6噙呅蔚睦L制概念:法向量是幾何圖元的重要屬性之一。幾何對(duì)象的法向量是垂直與曲面切面的單位向量,它定義了幾何對(duì)象的空間方向,特別定義了它相對(duì)于光源的方向,決定了在該點(diǎn)上可接受多少光照。OpenGL本身沒(méi)有提供計(jì)算法向量的函數(shù)(計(jì)算法向量的

14、任務(wù)由程序員自己去完成),但它提供了賦予當(dāng)前頂點(diǎn)法向的函數(shù)。法向量的計(jì)算及指定平面法向的計(jì)算方法基本原理:在一個(gè)平面內(nèi),有兩條相交的線段,假設(shè)其中一條為矢量W,另一條為矢量V,平面法向?yàn)镹,則平面法向就等于兩個(gè)矢量的叉積(遵循右手定則),即NWxV。令W=(a1, a2, a3),V=(b1, b2, b3),則:WxV=(a2b3-a3b2, a3b1-a1b3, a1b2-a2b1)。法向量的計(jì)算及指定例子:一個(gè)三角形平面三個(gè)頂點(diǎn)分別為P0、P1、P2,相應(yīng)兩個(gè)向量為W、V,則三角平面法向的計(jì)算方式如下列代碼所示:void getNormal(GLfloat gx3,GLfloat gy3

15、,GLfloat gz3,GLfloat *ddnv)GLfloat w0,w1,w2,v0,v1,v2,nr,nx,ny,nz;w0=gx0-gx1; w1=gy0-gy1;w2=gz0-gz1;v0=gx2-gx1; v1=gy2-gy1;v2=gz2-gz1;nx=(w1*v2-w2*v1);ny=(w2*v0-w0*v2);nz=(w0*v1-w1*v0);nr=sqrt(nx*nx+ny*ny+nz*nz); /向量單位化。ddnv0=nx/nr; ddnv1=ny/nr;ddnv2=nz/nr; 以上函數(shù)的輸出參數(shù)為指針ddnv,它指向法向的三個(gè)分量,并且程序中已經(jīng)將法向單位化(或

16、歸一化)了。法向量的計(jì)算及指定曲面法向量的計(jì)算對(duì)于曲面各頂點(diǎn)的法向計(jì)算有很多種,如根據(jù)函數(shù)表達(dá)式求偏導(dǎo)的方法等。但是,在大多數(shù)情況,OpenGL中的多邊形并不是由曲面方程建立起來(lái)的,而是由模型數(shù)組構(gòu)成,這時(shí)候求取法向量的辦法是將曲面細(xì)分成多個(gè)小多邊形,然后選取小多邊形上相鄰的三個(gè)點(diǎn)v1、v2、v3(當(dāng)然三個(gè)點(diǎn)不能在同一直線上),按照平面法向量的求取方法就可以了。法向量的計(jì)算及指定法向量的定義OpenGL法向量定義函數(shù)為: void glNormal3bsifd(TYPE nx,TYPE ny,TYPE nz);void glNormal3bsifd(const TYPE *v);非向量形式定義

17、法向采用第一種方式,即在函數(shù)中分別給出法向三個(gè)分量值nx、ny和nz;向量形式定義采用第二種,即將v設(shè)置為一個(gè)指向擁有三個(gè)元素的指針,例如v3=nx,ny,nz。法向量的計(jì)算及指定定義顯示列表前面所舉出的例子都是瞬時(shí)給出函數(shù)命令,OpenGL瞬時(shí)執(zhí)行相應(yīng)的命令,這種繪圖方式叫做立即或瞬時(shí)方式(immediate mode)。OpenGL顯示列表(Display List)是由一組預(yù)先存儲(chǔ)起來(lái)的留待以后調(diào)用的OpenGL函數(shù)語(yǔ)句組成的,當(dāng)調(diào)用顯示列表時(shí)就依次執(zhí)行表中所列出的函數(shù)語(yǔ)句。顯示列表可以用在以下場(chǎng)合:1)矩陣操作大部分矩陣操作需要OpenGL計(jì)算逆矩陣,矩陣及其逆矩陣都可以保存在顯示列表

18、中。顯示列表2)光柵位圖和圖像程序定義的光柵數(shù)據(jù)不一定是適合硬件處理的理想格式。當(dāng)編譯組織一個(gè)顯示列表時(shí),OpenGL可能把數(shù)據(jù)轉(zhuǎn)換成硬件能夠接受的數(shù)據(jù),這可以有效地提高畫位圖的速度。(這是一種借助編譯器的優(yōu)化)3)光、材質(zhì)和光照模型當(dāng)用一個(gè)比較復(fù)雜的光照環(huán)境繪制場(chǎng)景時(shí),因?yàn)椴馁|(zhì)計(jì)算可能比較慢。若把材質(zhì)定義放在顯示列表中,則每次改換材質(zhì)時(shí)就不必重新計(jì)算了,因此能更快地繪制光照?qǐng)鼍?。顯示列表4)紋理因?yàn)橛布募y理格式可能與OpenGL格式不一致,若把紋理定義放在顯示列表中,則在編譯顯示列表時(shí)就能對(duì)格式進(jìn)行轉(zhuǎn)換,而不是在執(zhí)行中進(jìn)行,這樣就能大大提高效率。(借助編譯器的優(yōu)化方法)5)多邊形的圖案填充

19、模式,即可將定義的圖案放在顯示列表中OpenGL提供類似于繪制圖元的結(jié)構(gòu)即類似于glBegin()與glEnd()的形式創(chuàng)建顯示列表,其相應(yīng)的函數(shù)為:void glNewList(GLuint list,GLenum mode);void glEndList(void);顯示列表glNewList()函數(shù)說(shuō)明一個(gè)顯示列表的開(kāi)始,其后的OpenGL函數(shù)存入顯示列表中,直至調(diào)用結(jié)束表的函數(shù)glEndList(void)。glNewList()函數(shù)中的參數(shù)list是一個(gè)正整數(shù),它標(biāo)志唯一的顯示列表;參數(shù)mode的可能值有 PILE和 PILE_AND_EXECUTE;若要使列表中函數(shù)語(yǔ)句只存入而不執(zhí)

20、行,則用 PILE;若要使列表中的函數(shù)語(yǔ)句存入表中且按瞬時(shí)方式執(zhí)行一次,則 PILE_AND_EXECUTE。顯示列表注意:并不是所有的OpenGL函數(shù)都可以在顯示列表中存儲(chǔ)且通過(guò)顯示列表執(zhí)行。一般來(lái)說(shuō),用于傳遞參數(shù)或返回?cái)?shù)值的函數(shù)語(yǔ)句不能存入顯示列表,因?yàn)檫@張表有可能在參數(shù)的作用域之外被調(diào)用;如果在定義顯示列表時(shí)調(diào)用了這樣的函數(shù),則它們將按瞬時(shí)方式執(zhí)行并且不保存在顯示列表中,有時(shí)在調(diào)用執(zhí)行顯示列表函數(shù)時(shí)會(huì)產(chǎn)生錯(cuò)誤。以下列出的是不能存入顯示列表的OpenGL函數(shù): glDeleteLists() glIsEnable()glFeedbackBuffer() glIsList()glFinish

21、() glPixelStore()glGenLists() glRenderMode()glGet*()glSelectBuffer()顯示列表在建立顯示列表以后就可以調(diào)用執(zhí)行顯示列表的函數(shù)來(lái)執(zhí)行它,并且允許在程序中多次執(zhí)行同一顯示列表,同時(shí)也可以與其它函數(shù)的瞬時(shí)方式混合使用。顯示列表執(zhí)行的函數(shù)形式如下:void glCallList(GLuint list);參數(shù)list指定被執(zhí)行的顯示列表。顯示列表中的函數(shù)語(yǔ)句按它們被存放的順序依次執(zhí)行;若list沒(méi)有定義,則不會(huì)產(chǎn)生任何事情。顯示列表管理顯示列表在實(shí)際應(yīng)用中,一般調(diào)用函數(shù)glGenList()來(lái)創(chuàng)建多個(gè)顯示列表,這樣可以避免意外刪除,產(chǎn)生一個(gè)沒(méi)有用過(guò)的顯示列表。此外,在管理顯示列表的過(guò)程中,還可調(diào)用函數(shù)glDeleteLists()來(lái)刪除一個(gè)或一個(gè)范圍內(nèi)的顯示列表。1)GLuint glGenList(GLsizei range)該函數(shù)分配range個(gè)相鄰的未被占用的顯示列表索引。這個(gè)函數(shù)返回的是一個(gè)正整數(shù)索引值,它是一組連續(xù)空索引的第一個(gè)值。返回的索引都標(biāo)志為空且已被占用,以后再調(diào)用這個(gè)函數(shù)時(shí)不再返回這些索引。若申請(qǐng)索引的指定數(shù)目不能滿足或range為0則函數(shù)返回0。顯示列表2)GLboolean glIsList(GLuint list)該函數(shù)詢問(wèn)顯示列

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論