freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

計(jì)算機(jī)圖形學(xué)ppt課件(編輯修改稿)

2025-05-31 12:18 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 lVertex2f(, )。 ? glVertex2f(, )。 ? glVertex2f(, )。 ? glVertex2f(, )。 ? glEnd()。 ? glBegin(GL_POLYGON)。 // 按順時(shí)針繪制一個(gè)正方形,在右上方 ? glVertex2f(, )。 ? glVertex2f(, )。 ? glVertex2f(, )。 ? glVertex2f(, )。 ? glEnd()。 ? glFlush()。 ? } ? 將 glFrontFace(GL_CCW)修改為 glFrontFace(GL_CW),觀察結(jié)果變化 40 ? OpenGL支持兩種顏色模式: 一種是 RGBA,一種是顏色索引模式 。 無論哪種顏色模式,計(jì)算機(jī)都必須為每一個(gè)像素保存一些數(shù)據(jù)。不同的是,RGBA模式中,數(shù)據(jù)直接就代表了顏色;而顏色索引模式中,數(shù)據(jù)代表的是一個(gè)索引,要得到真正的顏色,還必須去查索引表。 ? 1. RGBA顏色 RGBA模式中,每一個(gè)像素會(huì)保存以下數(shù)據(jù): R值(紅色分量)、 G值(綠色分量)、 B值(藍(lán)色分量)和 A值( alpha分量)。其中紅、綠、藍(lán)三種顏色相組合,就可以得到我們所需要的各種顏色,而 alpha不直接影響顏色,它將留待以后介紹。 在 RGBA模式下選擇顏色是十分簡(jiǎn)單的事情,只需要一個(gè)函數(shù)就可以搞定。 glColor*系列函數(shù)可以用于設(shè)置顏色,其中三個(gè)參數(shù)的版本可以指定 R、 G、 B的值,而 A值采用默認(rèn);四個(gè)參數(shù)的版本可以分別指定 R、 G、 B、 A的值。例如: void glColor3f(GLfloat red, GLfloat green, GLfloat blue)。 void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)。 41 ?將浮點(diǎn)數(shù)作為參數(shù),其中 ,而 示將該種顏色用到最多。例如: glColor3f(, , )。 表示不使用綠、藍(lán)色,而將紅色使用最多,于是得到最純凈的紅色。 glColor3f(, , )。 表示使用綠、藍(lán)色到最多,而不使用紅色?;旌系男Ч褪菧\藍(lán)色。 glColor3f(, , )。 表示各種顏色使用一半,效果為灰色。 注意:浮點(diǎn)數(shù)可以精確到小數(shù)點(diǎn)后若干位,這并不表示計(jì)算機(jī)就可以顯示如此多種顏色。實(shí)際上,計(jì)算機(jī)可以顯示的顏色種數(shù)將由硬件決定。如果 OpenGL找不到精確的顏色,會(huì)進(jìn)行類似“四舍五入”的處理。 ? 可以通過改變下面代碼中 glColor3f的參數(shù)值,繪制不同顏色的矩形。 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT)。 ? glColor3f(, , )。 ? glRectf(, , , )。 ? glFlush()。 ? } ? 注意: glColor系列函數(shù),在參數(shù)類型不同時(shí),表示“最大”顏色的值也不同。 采用 f和 d做后綴的函數(shù),以 。 采用 b做后綴的函數(shù),以 127表示最大的使用。 采用 ub做后綴的函數(shù),以 255表示最大的使用。 采用 s做后綴的函數(shù),以 32767表示最大的使用。 采用 us做后綴的函數(shù),以 65535表示最大的使用。 43 ? 索引顏色 在索引顏色模式中, OpenGL需要一個(gè)顏色表。這個(gè)表就相當(dāng)于畫家的調(diào)色板:雖然可以調(diào)出很多種顏色,但同時(shí)存在于調(diào)色板上的顏色種數(shù)將不會(huì)超過調(diào)色板的格數(shù)。試將顏色表的每一項(xiàng)想象成調(diào)色板上的一個(gè)格子:它保存了一種顏色。 ? 在使用索引顏色模式畫圖時(shí), “把第 i種顏色設(shè)置為某某”,其實(shí)就相當(dāng)于將調(diào)色板的第 i格調(diào)為某某顏色。“需要第 k種顏色來畫圖”,那么就用畫筆去蘸一下第 k格調(diào)色板。 顏色表的大小是很有限的,一般在 256~4096之間,且總是 2的整數(shù)次冪。在使用索引顏色方式進(jìn)行繪圖時(shí),總是先設(shè)置顏色表,然后選擇顏色。 44 ? 、選擇顏色 使用 glIndex*系列函數(shù)可以在顏色表中選擇顏色。 ? 其中最常用的是 glIndexi,它的參數(shù)是一個(gè)整形。 void glIndexi(GLint c)。 ? 、設(shè)置顏色表 OpenGL 并直接沒有提供設(shè)置顏色表的方法,因此設(shè)置顏色表需要使用操作系統(tǒng)的支持。我們所用的 Windows和其他大多數(shù)圖形操作系統(tǒng)都具有這個(gè)功能,但所使用的函數(shù)卻不相同。 ? 另一個(gè) OpenGL工具包: aux,是 VisualStudio自帶的,不必另外安裝,但它已經(jīng)過時(shí)。 45 ? include ? include GL/ ? include GL/ ? pragma ment (lib, ) ? pragma ment (lib, ) ? include ? const GLdouble Pi = 。 ? void myDisplay(void) ? { ? int i。 ? for(i=0。 i8。 ++i) ? auxSetOneColor(i, (float)(iamp。0x04), (float)(iamp。0x02), (float)(iamp。0x01))。 ? glShadeModel(GL_FLAT)。 ? glClear(GL_COLOR_BUFFER_BIT)。 ? glBegin(GL_TRIANGLE_FAN)。 ? glVertex2f(, )。 ? for(i=0。 i=8。 ++i) ? { ? glIndexi(i)。 ? glVertex2f(cos(i*Pi/4), sin(i*Pi/4))。 ? } ? glEnd()。 ? glFlush()。 ? } ? int main(void) ? { ? auxInitDisplayMode(AUX_SINGLE|AUX_INDEX)。 ? auxInitPosition(0, 0, 400, 400)。 ? auxInitWindow(simple)。 ? myDisplay()。 ? Sleep(10 * 1000)。 ? return 0。 ? } ? 首先,使用auxSetOneColor設(shè)置顏色表中的一格。循環(huán)八次就可以設(shè)置八格。然后在循環(huán)中用 glVertex設(shè)置頂點(diǎn),同時(shí)用glIndexi改變頂點(diǎn)代表的顏色。 最終得到的效果是八個(gè)相同形狀、不同顏色的三角形。 46 ? 索引顏色的主要優(yōu)勢(shì)是占用空間?。總€(gè)像素不必單獨(dú)保存自己的顏色,只用很少的二進(jìn)制位就可以代表其顏色在顏色表中的位置),花費(fèi)系統(tǒng)資源少,圖形運(yùn)算速度快,但它編程稍稍顯得不是那么方便,并且畫面效果也會(huì)比 RGB顏色差一些。 ? 目前的 PC機(jī)性能已經(jīng)足夠在各種場(chǎng)合下使用 RGB顏色,因此 PC程序開發(fā)中,使用索引顏色已經(jīng)不是主流。當(dāng)然,一些小型設(shè)備例如 GBA、手機(jī)等,索引顏色還是有它的用武之地。 47 ? 三維變換 ? 如果要觀察一個(gè)物體,我們可以: ? 從不同的位置去觀察它。(視圖變換) ? 移動(dòng)或者旋轉(zhuǎn)它,當(dāng)然了,如果它只是計(jì)算機(jī)里面的物體,我們還可以放大或縮小它。(模型變換) ? 如果把物體畫下來,我們可以選擇:是否需要一種“近大遠(yuǎn)小”的透視效果。另外,我們可能只希望看到物體的一部分,而不是全部(剪裁)。(投影變換) ? 我們可能希望把整個(gè)看到的圖形畫下來,但它只占據(jù)紙張的一部分,而不是全部。(視口變換) ? 這些,都可以在 OpenGL中實(shí)現(xiàn)。 ? OpenGL變換實(shí)際上是通過矩陣乘法來實(shí)現(xiàn)。無論是移動(dòng)、旋轉(zhuǎn)還是縮放大小,都是通過在當(dāng)前矩陣的基礎(chǔ)上乘以一個(gè)新的矩陣來達(dá)到目的。 48 ? 模型變換和視圖變換 從“相對(duì)移動(dòng)”的觀點(diǎn)來看,改變觀察點(diǎn)的位置與方向和改變物體本身的位置與方向具有等效性。在 OpenGL中,實(shí)現(xiàn)這兩種功能甚至使用的是同樣的函數(shù)。 ? 由于模型和視圖的變換都通過矩陣運(yùn)算來實(shí)現(xiàn),在進(jìn)行變換前,應(yīng)先設(shè)置當(dāng)前操作的矩陣為“模型視圖矩陣”。設(shè)置的方法是以 GL_MODELVIEW為參數(shù)調(diào)用glMatrixMode函數(shù),像這樣: glMatrixMode(GL_MODELVIEW)。 ? 通常,我們需要在進(jìn)行變換前把當(dāng)前矩陣設(shè)置為單位矩陣。這也只需要一行代碼: glLoadIdentity()。 49 ? 進(jìn)行模型和視圖變換,主要涉及到三個(gè)函數(shù): ? glTranslate*,把當(dāng)前矩陣和一個(gè)表示移動(dòng)物體的矩陣相乘。三個(gè)參數(shù)分別表示了在三個(gè)坐標(biāo)上的位移值。 ? glRotate*,把當(dāng)前矩陣和一個(gè)表示旋轉(zhuǎn)物體的矩陣相乘。物體將繞著 (0,0,0)到 (x,y,z)的直線以逆時(shí)針旋轉(zhuǎn),參數(shù) angle表示旋轉(zhuǎn)的角度。 ? glScale*,把當(dāng)前矩陣和一個(gè)表示縮放物體的矩陣相乘。 x,y,z分別表示在該方向上的縮放比例。 50 ? 假設(shè)當(dāng)前矩陣為單位矩陣,然后先乘以一個(gè)表示旋轉(zhuǎn)的矩陣 R,再乘以一個(gè)表示移動(dòng)的矩陣 T,最后得到的矩陣再乘上每一個(gè)頂點(diǎn)的坐標(biāo)矩陣 v。所以,經(jīng)過變換得到的頂點(diǎn)坐標(biāo)就是 ((RT)v)。由于矩陣乘法的結(jié)合率, ((RT)v) = (R(Tv)),換句話說,實(shí)際上是先進(jìn)行移動(dòng),然后進(jìn)行旋轉(zhuǎn)。 ? 即:實(shí)際變換的順序與代碼中寫的順序是相反的。 ? 由于“先移動(dòng)后旋轉(zhuǎn)”和“先旋轉(zhuǎn)后移動(dòng)”得到的結(jié)果很可能不同,初學(xué)的時(shí)候需要特別注意這一點(diǎn)。 ? 個(gè)人理解:平移、旋轉(zhuǎn)都是針對(duì)坐標(biāo)系而言的! 51 ? 如果要改變觀察點(diǎn)的位置,除了配合使用glRotate*和 glTranslate*函數(shù)以外,還可以使用這個(gè)函數(shù): gluLookAt。 ? 前三個(gè)參數(shù)表示了觀察點(diǎn)的位置, ? 中間三個(gè)參數(shù)表示了觀察目標(biāo)的位置, ? 最后三個(gè)參數(shù)代表從 (0,0,0)到 (x,y,z)的直線,它表示了觀察者認(rèn)為的“上”方向。 52 ? 投影變換 投影變換就是定義一個(gè)可視空間,可視空間以外的物體不會(huì)被繪制到屏幕上。 ? OpenGL支持兩種類型的投影變換,即透視投影和正投影。 ? 投影也是使用矩陣來實(shí)現(xiàn)的。如果需要操作投影矩陣,需要以 GL_PROJECTION為參數(shù)調(diào)用 glMatrixMode函數(shù)。 glMatrixMode(GL_PROJECTION)。 通常,需要在進(jìn)行變換前把當(dāng)前矩陣設(shè)置為單位矩陣。 glLoadIdentity()。 53 ? 透視投影所產(chǎn)生的結(jié)果類似于照片,有近大遠(yuǎn)小的效果,比如在火車頭內(nèi)向前照一個(gè)鐵軌的照片,兩條鐵軌似乎在遠(yuǎn)處相交了。 使用 glFrustum函數(shù)可以將當(dāng)前的可視空間設(shè)置為透視投影空間。其參數(shù)的意義如下圖: 54 ? 也可以使用更常用的 gluPerspective函數(shù)。其參數(shù)的意義如下圖: 55 ? 正投影相當(dāng)于在無限遠(yuǎn)處觀察得到的結(jié)果,它只是一種理想狀態(tài)。但對(duì)于計(jì)算機(jī)來說,使用正投影有可能獲得更好的運(yùn)行速度。 使用 glOrtho函數(shù)可以將當(dāng)前的可視空間設(shè)置為正投影空間。其參數(shù)的意義如下圖: ? 如果繪制的圖形空間本身就是二維的,可以使用 gluOrtho2D。他的使用類似于 glOrgho 56 ? 視口變換 當(dāng)一切工作已經(jīng)就緒,只需要把像素繪制到屏幕上了。這時(shí)候還剩最后一個(gè)問題:應(yīng)該把像素繪制到窗口的哪個(gè)區(qū)域呢? ? 通常情況下,默認(rèn)是完整的填充整個(gè)窗口,但我們完全可以只填充一半。(即:把整個(gè)圖象填充到一半的窗口內(nèi)) ? 使用 glViewport來定義視口。其中前兩個(gè)參數(shù)定義了視口的左下腳( 0,0表示最左下方),后兩個(gè)參數(shù)分別是寬度和高度。 57 ? 操作矩陣堆棧 可以把堆棧想象成一疊盤子。 ? 開始的時(shí)候一個(gè)盤子也沒有,可以一個(gè)一個(gè)往上放,也可以一個(gè)一個(gè)取下來。每次取下的,都是最后一次被放上去的盤子。 ? 通常,在計(jì)算機(jī)實(shí)現(xiàn)堆棧時(shí),堆棧的容量是有限的,如果盤子過多,就會(huì)出錯(cuò)。當(dāng)然,如果沒有盤子了,再要求取一個(gè)盤子,也會(huì)出錯(cuò)。 ? 在進(jìn)行矩陣操作時(shí),有可能需要先保存某個(gè)矩陣,過一段時(shí)間再恢復(fù)它。當(dāng)需要保存時(shí),調(diào)用 glPushMatrix函數(shù),它相當(dāng)于把矩陣(相當(dāng)于盤子)放到堆棧上。當(dāng)需要恢復(fù)最近一次的保存時(shí),調(diào)用 glPopMatrix函數(shù),它相當(dāng)于把矩陣從堆棧上取下。 ? OpenGL規(guī)定堆棧的容量 至少可以容納 32個(gè)矩陣 ,某些 OpenGL實(shí)現(xiàn)中,堆棧的容量實(shí)際上超過了 32個(gè)。因此不必過于擔(dān)心矩陣的容量問題。 ? 用這種先保存后恢復(fù)的措施,比先變換再逆變換要更方便,更快速 。 注意:模型視圖矩陣和投影矩陣都有相應(yīng)的堆棧。使用 glMatrixMode來指定當(dāng)前操作的究竟是模型視圖矩陣還是投影矩陣。 58 ? 綜合舉例 要制作的是一個(gè) 三維場(chǎng)景 ,包括了太陽、地球和月亮。假定一年有 12個(gè)月,每個(gè)月 30天。每年,地球繞著太陽轉(zhuǎn)一圈
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1