OpenGL基礎(chǔ)易懂篇_第1頁(yè)
OpenGL基礎(chǔ)易懂篇_第2頁(yè)
OpenGL基礎(chǔ)易懂篇_第3頁(yè)
OpenGL基礎(chǔ)易懂篇_第4頁(yè)
OpenGL基礎(chǔ)易懂篇_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、OpenGL篇1. 矩陣/zh-hans/beginners-tutorials-zh/第三課:矩陣/這是所有課程中最重要的一課。至少得看八遍。(1).齊次坐標(biāo)目前為止,我們?nèi)匀话讶S頂點(diǎn)視為三元組(x,y,z)?,F(xiàn)在引入一個(gè)新的分量w,得到向量(x,y,z,w)。請(qǐng)先記住以下兩點(diǎn)(稍后我們會(huì)給出解釋?zhuān)?#183; 若w=1,則向量(x, y, z, 1)為空間中的點(diǎn)。· 若w=0,則向量(x, y, z, 0)為方向。(請(qǐng)務(wù)必將此牢記在心。)二者有什么區(qū)別呢?對(duì)于旋轉(zhuǎn),這點(diǎn)區(qū)別倒無(wú)所謂。當(dāng)您旋轉(zhuǎn)點(diǎn)和方向時(shí),結(jié)果是一樣的。但

2、對(duì)于平移(將點(diǎn)沿著某個(gè)方向移動(dòng))情況就不同了。“平移一個(gè)方向”是毫無(wú)意義的。齊次坐標(biāo)使得我們可以用同一個(gè)公式對(duì)點(diǎn)和方向作運(yùn)算。(2) 變換矩陣矩陣簡(jiǎn)介簡(jiǎn)而言之,矩陣就是一個(gè)行列數(shù)固定的、縱橫排列的數(shù)表。比如,一個(gè)2×3矩陣看起來(lái)像這樣:三維圖形學(xué)中我們只用到4×4矩陣,它能對(duì)頂點(diǎn)(x,y,z,w)作變換。這一變換是用矩陣左乘頂點(diǎn)來(lái)實(shí)現(xiàn)的:矩陣x頂點(diǎn)(記住順序!矩陣左乘頂點(diǎn),頂點(diǎn)用列向量表示)= 變換后的頂點(diǎn)這看上去復(fù)雜,實(shí)則不然。左手指著a,右手指著x,得到ax。 左手移向右邊一個(gè)數(shù)b,右手移向下一個(gè)數(shù)y,得到by。依次類(lèi)推,得到cz、dw。最后求和ax + by + cz

3、 + dw,就得到了新的x!每一行都這么算下去,就得到了新的(x, y, z, w)向量。平移矩陣(Translation matrices)平移矩陣是最簡(jiǎn)單的變換矩陣。平移矩陣是這樣的:其中,X、Y、Z是點(diǎn)的位移增量。例如,若想把向量(10, 10, 10, 1)沿X軸方向平移10個(gè)單位,可得:(算算看!一定得親手算?。┻@樣就得到了齊次向量(20,10,10,1)!記住,末尾的1表示這是一個(gè)點(diǎn),而不是方向。經(jīng)過(guò)變換計(jì)算后,點(diǎn)仍然是點(diǎn),這倒是挺合情合理的。下面來(lái)看看,對(duì)一個(gè)代表Z軸負(fù)方向的向量作上述平移變換會(huì)得到什么結(jié)果:還是原來(lái)的(0,0,-1,0)方向,這也很合理,恰好印證了前面的結(jié)論:“

4、平移一個(gè)方向是毫無(wú)意義的”。單位矩陣(Identity matrix)單位矩陣很特殊,它什么也不做。單位矩陣的身份和自然數(shù)“1”一樣基礎(chǔ)而重要,因此在這里要特別提及一下??s放矩陣(Scaling matrices)縮放矩陣也很簡(jiǎn)單:例如把一個(gè)向量(點(diǎn)或方向皆可)沿各方向放大2倍:w還是沒(méi)變。您也許會(huì)問(wèn):“縮放一個(gè)向量”有什么用?嗯,大多數(shù)情況下是沒(méi)什么用,所以一般不會(huì)去縮放向量;但在某些特殊情況下它就派上用場(chǎng)了。(順便說(shuō)一下,單位矩陣只是縮放矩陣的一個(gè)特例,其(X, Y, Z) = (1, 1, 1)。單位矩陣同時(shí)也是旋轉(zhuǎn)矩陣的一個(gè)特例,其(X, Y, Z)=(0, 0, 0))。旋轉(zhuǎn)矩陣(R

5、otation matrices)旋轉(zhuǎn)矩陣比較復(fù)雜。這里略過(guò)細(xì)節(jié),因?yàn)槿粘?yīng)用中,您并不需要知道矩陣的內(nèi)部構(gòu)造。想了解更多,請(qǐng)看“矩陣和四元組常見(jiàn)問(wèn)題”(這個(gè)資源很熱門(mén),應(yīng)該有中文版吧)。累積變換前面已經(jīng)學(xué)習(xí)了如何旋轉(zhuǎn)、平移和縮放向量。把這些矩陣相乘就能將它們組合起來(lái),例如:TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;!注意!這行代碼首先執(zhí)行縮放,接著旋轉(zhuǎn),最后才是平移。這就是矩陣乘法的工作方式。變換的順序不同,得出的結(jié)果也不同。您不妨親自嘗試一下:- 向前一步(小心

6、別磕著愛(ài)機(jī))然后左轉(zhuǎn);- 左轉(zhuǎn),然后向前一步實(shí)際上,上述順序正是你在變換游戲角色或者其他物體時(shí)所需的:先縮放;再調(diào)整方向;最后平移。例如,假設(shè)有個(gè)船的模型(為簡(jiǎn)化,略去旋轉(zhuǎn)):- 按(10, 0, 0)平移船體。船體中心目前距離原點(diǎn)10個(gè)單位。- 將船體放大2倍。以原點(diǎn)為參照,每個(gè)坐標(biāo)都變成原來(lái)的2倍,就出問(wèn)題了。最后您得到的是一艘放大的船,但其中心位于2*10=20。這并非您預(yù)期的結(jié)果。- 將船體放大2倍,得到一艘中心位于原點(diǎn)的大船。- 平移船體。船大小不變,移動(dòng)距離也正確。矩陣-矩陣乘法和矩陣-向量乘法類(lèi)似,所以這里也會(huì)省略一些細(xì)節(jié),不清楚的讀者請(qǐng)移步a href=”http:/www.c

7、/gewang/projects/darth/stuff/quat_faq.html”>“矩陣和四元組常見(jiàn)問(wèn)題”?,F(xiàn)在,就讓計(jì)算機(jī)來(lái)算:(3) 模型(Model),觀察(View)和投影(projection)矩陣在接下來(lái)的課程中,我們假定您已知如何繪制Blender經(jīng)典模型小猴Suzanne。利用模型、觀察和投影矩陣,可以將變換過(guò)程清晰地分解為三個(gè)階段。雖然此法并非必需(前兩課我們就沒(méi)用這個(gè)方法嘛),但采用此法較為穩(wěn)妥。我們將看到,這種公認(rèn)的方法對(duì)變換流程作了清晰的劃分。模型矩陣這個(gè)三維模型和可愛(ài)的紅色三角形一樣,由一組頂點(diǎn)定義。頂點(diǎn)的XYZ坐標(biāo)是相對(duì)于物

8、體中心定義的:也就是說(shuō),若某頂點(diǎn)位于(0,0,0),則其位于物體的中心。我們希望能夠移動(dòng)它,玩家也需要用鍵鼠控制這個(gè)模型。這很簡(jiǎn)單,只需記住:縮放*旋轉(zhuǎn)*平移就夠了。在每一幀中,用算出的這個(gè)矩陣去乘(在GLSL中乘,不是在C+中!)所有的頂點(diǎn),物體就會(huì)移動(dòng)。唯一不動(dòng)的是世界空間(World Space)的中心?,F(xiàn)在,物體所有頂點(diǎn)都位于世界空間。下圖中黑色箭頭的意思是:從模型空間(Model Space)(頂點(diǎn)都相對(duì)于模型的中心定義)變換到世界空間(頂點(diǎn)都相對(duì)于世界空間中心定義)。下圖概括了這一過(guò)程:觀察矩陣這里再引用一下飛出個(gè)未來(lái):仔細(xì)想想,攝像機(jī)的原理也是相通的。如果想換個(gè)角度觀察一座山,您

9、可以移動(dòng)攝像機(jī)也可以移動(dòng)山。后者在實(shí)際中不可行,在計(jì)算機(jī)圖形學(xué)中卻十分方便。起初,攝像機(jī)位于世界坐標(biāo)系的原點(diǎn)。移動(dòng)世界只需乘一個(gè)矩陣。假如你想把攝像機(jī)向右(X軸正方向)移動(dòng)3個(gè)單位,這和把整個(gè)世界(包括網(wǎng)格)向左(X軸負(fù)方向)移3個(gè)單位是等效的!腦子有點(diǎn)亂?來(lái)寫(xiě)代碼吧:/ Use #include and #include glm:mat4 ViewMatrix = glm:translate(-3,0,0);下圖展示了:從世界空間(頂點(diǎn)都相對(duì)于世界空間中心定義)到攝像機(jī)空間(Camera Space,頂點(diǎn)都相對(duì)于攝像機(jī)定義)的變換。趁腦袋還沒(méi)爆炸,來(lái)欣賞一下GLM強(qiáng)大的glm:LookAt函

10、數(shù)吧:glm:mat4 CameraMatrix = glm:LookAt( cameraPosition, / the position of your camera, in world space cameraTarget,   / where you want to look at, in world space upVector        / probably glm:vec3(0,1,0), but (0,-1,0) would make you looking upside-down, w

11、hich can be great too);下圖解釋了上述變換過(guò)程:投影矩陣現(xiàn)在,我們處于攝像機(jī)空間中。這意味著,經(jīng)歷了這么多變換后,現(xiàn)在一個(gè)坐標(biāo)X=0且Y=0的頂點(diǎn),應(yīng)該被畫(huà)在屏幕的中心。但僅有x、y坐標(biāo)還不足以確定物體是否應(yīng)該畫(huà)在屏幕上:它到攝像機(jī)的距離(z)也很重要!兩個(gè)x、y坐標(biāo)相同的頂點(diǎn),z值較大的一個(gè)將會(huì)最終顯示在屏幕上。這就是所謂的透視投影(perspective projection): 好在用一個(gè)4×4矩陣就能表示這個(gè)投影¹ :/ Generates a really hard-to-read matrix, but a normal, standard

12、 4x4 matrix nonethelessglm:mat4 projectionMatrix = glm:perspective( FoV,         / The horizontal Field of View, in degrees : the amount of "zoom". Think "camera lens". Usually between 90° (extra wide) and 30° (quite zoomed in) 4.

13、0f / 3.0f, / Aspect Ratio. Depends on the size of your window. Notice that 4/3 = 800/600 = 1280/960, sounds familiar ? 0.1f,        / Near clipping plane. Keep as big as possible, or you'll get precision issues. 100.0f       / Far

14、clipping plane. Keep as little as possible.);最后一個(gè)變換:從攝像機(jī)空間(頂點(diǎn)都相對(duì)于攝像機(jī)定義)到齊次坐空間(Homogeneous Space)(頂點(diǎn)都在一個(gè)小立方體中定義。立方體內(nèi)的物體都會(huì)在屏幕上顯示)的變換。最后一幅圖示:再添幾張圖,以便大家更好地理解投影變換。投影前,藍(lán)色物體都位于攝像機(jī)空間中,紅色的東西是攝像機(jī)的平截頭體(frustum):這是攝像機(jī)實(shí)際能看見(jiàn)的區(qū)域。用投影矩陣去乘前面的結(jié)果,得到如下效果:此圖中,平截頭體變成了一個(gè)正方體(每條棱的范圍都是-1到1,圖不太明顯),所有的藍(lán)色物體都經(jīng)過(guò)了相同的變形。因此,離攝像機(jī)近的物體就

15、顯得大一些,遠(yuǎn)的顯得小一些。這和現(xiàn)實(shí)生活一樣!讓我們從平截頭體的“后面”看看它們的模樣:這就是您得到的圖像!看上去太方方正正了,因此,還需要做一次數(shù)學(xué)變換使之適合實(shí)際的窗口大小。這就是實(shí)際渲染的圖像啦!復(fù)合變換:模型觀察投影矩陣(MVP)再來(lái)一連串深?lèi)?ài)已久的標(biāo)準(zhǔn)矩陣乘法:/ C+ : compute the matrixglm:mat3 MVPmatrix = projection * view * model; / Remember : inverted !/ GLSL : apply ittransformed_vertex = MVP * in_vertex;總結(jié)· 第一步:創(chuàng)

16、建模型觀察投影(MVP)矩陣。任何要渲染的模型都要做這一步。/ Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit 100 unitsglm:mat4 Projection = glm:perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);/ Camera matrixglm:mat4 View       = glm:lookAt( glm:vec3(4,3,3), / Camera is

17、 at (4,3,3), in World Space glm:vec3(0,0,0), / and looks at the origin glm:vec3(0,1,0)  / Head is up (set to 0,-1,0 to look upside-down);/ Model matrix : an identity matrix (model will be at the origin)glm:mat4 Model      = glm:mat4(1.0f);  / Changes for each model

18、 !/ Our ModelViewProjection : multiplication of our 3 matricesglm:mat4 MVP        = Projection * View * Model; / Remember, matrix multiplication is the other way around· 第二步:把MVP傳給GLSL/ Get a handle for our "MVP" uniform./ Only at initialisation time.GLuint MatrixID = glGetUniformLocation(programID, "MVP");/ Send our transformation to the currently bound shader,/ in the "MVP" uniform/ For each model you render, since the MVP will be different (at leas

溫馨提示

  • 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)論