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

正文內(nèi)容

計算機(jī)圖形學(xué)ppt課件-文庫吧資料

2025-05-10 12:18本頁面
  

【正文】 atef(day, 0, 0, 1)。由于今年已經(jīng)經(jīng)過的天數(shù)已知為 day,則地球轉(zhuǎn)過的角度為 day/一年的天數(shù) *360度。 ? 太陽在坐標(biāo)原點,所以不需要經(jīng)過任何變換,直接繪制就可以了。由于坐標(biāo)是可以通過 glTranslate*和 glRotate*兩個函數(shù)進(jìn)行隨意變換的,所以就可以在任意位置繪制球體了。 59 ? 把三個天體都想象成規(guī)則的球體。最近可視距離為 ,最遠(yuǎn)可視距離為202200000*2=400000000。 ? 為了得到透視效果,使用 gluPerspective來設(shè)置可視空間。即一年有 360天,要求繪制出太陽、地球、月亮的相對位置示意圖。每年,地球繞著太陽轉(zhuǎn)一圈。 58 ? 綜合舉例 要制作的是一個 三維場景 ,包括了太陽、地球和月亮。 注意:模型視圖矩陣和投影矩陣都有相應(yīng)的堆棧。因此不必過于擔(dān)心矩陣的容量問題。當(dāng)需要恢復(fù)最近一次的保存時,調(diào)用 glPopMatrix函數(shù),它相當(dāng)于把矩陣從堆棧上取下。 ? 在進(jìn)行矩陣操作時,有可能需要先保存某個矩陣,過一段時間再恢復(fù)它。 ? 通常,在計算機(jī)實現(xiàn)堆棧時,堆棧的容量是有限的,如果盤子過多,就會出錯。 ? 開始的時候一個盤子也沒有,可以一個一個往上放,也可以一個一個取下來。其中前兩個參數(shù)定義了視口的左下腳( 0,0表示最左下方),后兩個參數(shù)分別是寬度和高度。這時候還剩最后一個問題:應(yīng)該把像素繪制到窗口的哪個區(qū)域呢? ? 通常情況下,默認(rèn)是完整的填充整個窗口,但我們完全可以只填充一半。其參數(shù)的意義如下圖: ? 如果繪制的圖形空間本身就是二維的,可以使用 gluOrtho2D。但對于計算機(jī)來說,使用正投影有可能獲得更好的運行速度。其參數(shù)的意義如下圖: 54 ? 也可以使用更常用的 gluPerspective函數(shù)。 53 ? 透視投影所產(chǎn)生的結(jié)果類似于照片,有近大遠(yuǎn)小的效果,比如在火車頭內(nèi)向前照一個鐵軌的照片,兩條鐵軌似乎在遠(yuǎn)處相交了。 通常,需要在進(jìn)行變換前把當(dāng)前矩陣設(shè)置為單位矩陣。如果需要操作投影矩陣,需要以 GL_PROJECTION為參數(shù)調(diào)用 glMatrixMode函數(shù)。 ? OpenGL支持兩種類型的投影變換,即透視投影和正投影。 ? 前三個參數(shù)表示了觀察點的位置, ? 中間三個參數(shù)表示了觀察目標(biāo)的位置, ? 最后三個參數(shù)代表從 (0,0,0)到 (x,y,z)的直線,它表示了觀察者認(rèn)為的“上”方向。 ? 由于“先移動后旋轉(zhuǎn)”和“先旋轉(zhuǎn)后移動”得到的結(jié)果很可能不同,初學(xué)的時候需要特別注意這一點。由于矩陣乘法的結(jié)合率, ((RT)v) = (R(Tv)),換句話說,實際上是先進(jìn)行移動,然后進(jìn)行旋轉(zhuǎn)。 50 ? 假設(shè)當(dāng)前矩陣為單位矩陣,然后先乘以一個表示旋轉(zhuǎn)的矩陣 R,再乘以一個表示移動的矩陣 T,最后得到的矩陣再乘上每一個頂點的坐標(biāo)矩陣 v。 ? glScale*,把當(dāng)前矩陣和一個表示縮放物體的矩陣相乘。 ? glRotate*,把當(dāng)前矩陣和一個表示旋轉(zhuǎn)物體的矩陣相乘。 49 ? 進(jìn)行模型和視圖變換,主要涉及到三個函數(shù): ? glTranslate*,把當(dāng)前矩陣和一個表示移動物體的矩陣相乘。 ? 通常,我們需要在進(jìn)行變換前把當(dāng)前矩陣設(shè)置為單位矩陣。 ? 由于模型和視圖的變換都通過矩陣運算來實現(xiàn),在進(jìn)行變換前,應(yīng)先設(shè)置當(dāng)前操作的矩陣為“模型視圖矩陣”。 48 ? 模型變換和視圖變換 從“相對移動”的觀點來看,改變觀察點的位置與方向和改變物體本身的位置與方向具有等效性。 ? OpenGL變換實際上是通過矩陣乘法來實現(xiàn)。(投影變換) ? 我們可能希望把整個看到的圖形畫下來,但它只占據(jù)紙張的一部分,而不是全部。(模型變換) ? 如果把物體畫下來,我們可以選擇:是否需要一種“近大遠(yuǎn)小”的透視效果。 47 ? 三維變換 ? 如果要觀察一個物體,我們可以: ? 從不同的位置去觀察它。 ? 目前的 PC機(jī)性能已經(jīng)足夠在各種場合下使用 RGB顏色,因此 PC程序開發(fā)中,使用索引顏色已經(jīng)不是主流。 最終得到的效果是八個相同形狀、不同顏色的三角形。循環(huán)八次就可以設(shè)置八格。 ? return 0。 ? myDisplay()。 ? auxInitPosition(0, 0, 400, 400)。 ? glFlush()。 ? glVertex2f(cos(i*Pi/4), sin(i*Pi/4))。 i=8。 ? glVertex2f(, )。 ? glClear(GL_COLOR_BUFFER_BIT)。0x01))。0x04), (float)(iamp。 i8。 ? void myDisplay(void) ? { ? int i。 ? 另一個 OpenGL工具包: aux,是 VisualStudio自帶的,不必另外安裝,但它已經(jīng)過時。 ? 、設(shè)置顏色表 OpenGL 并直接沒有提供設(shè)置顏色表的方法,因此設(shè)置顏色表需要使用操作系統(tǒng)的支持。 ? 其中最常用的是 glIndexi,它的參數(shù)是一個整形。在使用索引顏色方式進(jìn)行繪圖時,總是先設(shè)置顏色表,然后選擇顏色?!靶枰?k種顏色來畫圖”,那么就用畫筆去蘸一下第 k格調(diào)色板。試將顏色表的每一項想象成調(diào)色板上的一個格子:它保存了一種顏色。 43 ? 索引顏色 在索引顏色模式中, OpenGL需要一個顏色表。 采用 s做后綴的函數(shù),以 32767表示最大的使用。 采用 b做后綴的函數(shù),以 127表示最大的使用。 ? } ? 注意: glColor系列函數(shù),在參數(shù)類型不同時,表示“最大”顏色的值也不同。 ? glRectf(, , , )。 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT)。如果 OpenGL找不到精確的顏色,會進(jìn)行類似“四舍五入”的處理。 注意:浮點數(shù)可以精確到小數(shù)點后若干位,這并不表示計算機(jī)就可以顯示如此多種顏色。 glColor3f(, , )。 表示使用綠、藍(lán)色到最多,而不使用紅色。 表示不使用綠、藍(lán)色,而將紅色使用最多,于是得到最純凈的紅色。 41 ?將浮點數(shù)作為參數(shù),其中 ,而 示將該種顏色用到最多。例如: void glColor3f(GLfloat red, GLfloat green, GLfloat blue)。 在 RGBA模式下選擇顏色是十分簡單的事情,只需要一個函數(shù)就可以搞定。 ? 1. RGBA顏色 RGBA模式中,每一個像素會保存以下數(shù)據(jù): R值(紅色分量)、 G值(綠色分量)、 B值(藍(lán)色分量)和 A值( alpha分量)。 無論哪種顏色模式,計算機(jī)都必須為每一個像素保存一些數(shù)據(jù)。 ? glFlush()。 ? glVertex2f(, )。 ? glVertex2f(, )。 ? glBegin(GL_POLYGON)。 ? glVertex2f(, )。 ? glVertex2f(, )。 // 設(shè)置逆時針方向為正面 ? glBegin(GL_POLYGON)。 // 設(shè)置正面為填充模式 ? glPolygonMode(GL_BACK, GL_LINE)。 // 設(shè)置 CW方向為“正面”, CW即 ClockWise,順時針 39 ? void myDisplay(void) ? { ? glClear(GL_COLOR_BUFFER_BIT)。 ? glFrontFace(GL_CCW)。 // 設(shè)置兩面均為頂點繪制方式 ? ( 2)反轉(zhuǎn) ? 一般約定為“頂點以逆時針順序出現(xiàn)在屏幕上的面”為“正面”,另一個面即成為“反面”。 // 設(shè)置正面為填充方式 ? glPolygonMode(GL_BACK, GL_LINE)。可以為兩個面分別設(shè)置不同的方式。 ? 從三維的角度來看,一個多邊形具有兩個面。 ? glFlush()。 ? glVertex2f(, )。 ? glBegin(GL_LINES)。 ? glLineStipple(2, 0x0F0F)。 37 ? 示例代碼: ? void myDisplay(void) ? { ? glClear(GL_COLOR_BUFFER_BIT)。 ? void glLineStipple(GLint factor, GLushort pattern)。來啟動虛線模式(使用 glDisable(GL_LINE_STIPPLE)可以關(guān)閉)。 ? ( 2)畫虛線。 ? } 36 ? 關(guān)于直線 ? ( 1)直線可以指定寬度: ? void glLineWidth(GLfloat width)。 ? glEnd()。 ? glVertex2f(, )。 ? glPointSize()。 ? size必須大于 ,默認(rèn)值為 ,單位為“像素”。 ? 關(guān)于點 ? 點的大小默認(rèn)為 1個像素,但也可以改變。 glFlush()。 x+=) { glVertex2f(x*factor, sin(x)*factor)。 for(x=。 // 以上兩個點可以畫 y軸 glEnd()。 35 // 以上兩個點可以畫 x軸 glVertex2f(, )。 glVertex2f(, )。 glClear(GL_COLOR_BUFFER_BIT)。 } ? 例三、畫出正弦函數(shù)的圖形 include const GLfloat factor = 。 glEnd()。 glVertex2fv(PointB)。 glVertex2fv(PointC)。 glBegin(GL_LINE_LOOP)。 GLfloat PointA[2] = { 0, a }, PointB[2] = { bx, by }, PointC[2] = { , cy }, PointD[2] = { , cy }, PointE[2] = { bx, by }。 GLfloat by = a * sin(18 * Pi/180)。 void myDisplay(void) { GLfloat a = 1 / (22*cos(72*Pi/180))。 ? glFlush()。 ++i) ? glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i))。 ? for(i=0。 ? glClear(GL_COLOR_BUFFER_BIT)。 ? const GLfloat Pi = 。 } 32 ? 例一、畫一個圓 正四邊形,正五邊形,正六邊形, …… ,直到正 n邊形,當(dāng) n越大時,這個圖形就越接近圓,當(dāng) n大到一定程度后,人眼將無法把它跟真正的圓相區(qū)別,這時我們已經(jīng)成功的畫出了一個“圓” ? include ? const int n = 20。 /* 在這里使用 glVertex*系列函數(shù) */ /* 指定你所希望的頂點位置 */ glEnd()。 31 ? 另一方面, glBegin支持的方式除了 GL_POINTS和 GL_LINES,還有GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES,GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN等,每種方式的大致效果: 程序代碼: void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT)。如果將 GL_POINTS替換成 GL_LINES,則兩個點將被認(rèn)為是直線的兩個端點, OpenGL將會畫出一條直線。 ? glEnd()。 ? glVertex2f(, )。并由 glBegin來指明如何使用這些點。 注意: OpenGL的很多函數(shù)都是采用這樣的形式,一個相同的前綴再加上參數(shù)說明標(biāo)記,這一點會隨著學(xué)習(xí)的深入而有更多的體會。 (五) GLfloat VertexArr3[] = {, , }。 (三) glVertex3f(, , )。例如,以下五個代碼段的功能是等效的: (一) glVertex2i(1, 3)。它們都以 glVertex開頭,后面跟一個數(shù)字和 1~2個字母。 ? 在 OpenGL中指定頂點 由以上的討論可以知道,“點”是一切的基礎(chǔ)。這樣一來弧和圓也可以表示出來了。要避免這個錯誤, 盡量使用三角形 ,因為三角形都是凸多邊形) ?可以想象,通過點、直線和多邊形,就可以組合成各種幾何圖形。多邊形可以由其
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1