OpenGL学习随笔(三)——2022.1.24
????????通過上兩回的學(xué)習(xí),通過兩個(gè)簡單的程序已經(jīng)對C++/OpenGL程序有了基本的了解,本次要學(xué)習(xí)了解一些與OpenGL相關(guān)的數(shù)學(xué)基礎(chǔ)。
一、3D坐標(biāo)系統(tǒng)
????????3D空間通常用3個(gè)坐標(biāo)軸X、Y、Z來表示,這三個(gè)軸可以用兩種方式來布置:左手系和右手系。(大拇指指向X軸,食指指向Y軸,中指指向Z軸)。在OpenGL中,大體使用右手系。
(圖源自《計(jì)算機(jī)圖形學(xué)編程(使用OpenGL和C++)》作者:V.斯科特.戈登 約翰.克萊維吉 (人民郵電出版社)168頁)
二、點(diǎn)
????????3D空間中點(diǎn)可用(x, y, z)來表示,不過,用齊次坐標(biāo)會(huì)使圖形學(xué)計(jì)算得更加高效。每個(gè)點(diǎn)的齊次坐標(biāo)有四個(gè)值,前三個(gè)值表示x, y, z,第四個(gè)值w總是非零值,通常為1。
用來存儲齊次3D坐標(biāo)的GLSL數(shù)據(jù)類型使vec4("vec"代表向量,同時(shí)也可以用來表示點(diǎn))。GLM庫包含適合在C++/OpenGL應(yīng)用中創(chuàng)建和存儲3元和4元(齊次)點(diǎn)的類,分別叫做vec3和vec4。
三、矩陣
? ? ? ? 矩陣是矩形的值陣列,它的元素通常使用下標(biāo)訪問。第一個(gè)下標(biāo)表示行號,第二個(gè)下標(biāo)表示列號,下標(biāo)從0開始。在3D圖形計(jì)算中要用到的矩陣大多數(shù)為4階矩陣。
? ? ? ? GLSL語言中的mat4數(shù)據(jù)類型用來存儲4階矩陣。同樣,GLM中有mat4類用以實(shí)例化并存儲4階矩陣。
? ? ? ? 矩陣的相關(guān)運(yùn)算:
- 單位矩陣:單位矩陣對角線上的值全為1,其余值為0。任何矩陣乘以單位矩陣都不會(huì)發(fā)生變化。在GLSL中,調(diào)用構(gòu)造函數(shù)glm::mate4 m(1.0f)以在變量m中生成單位矩陣。
- 矩陣的轉(zhuǎn)置是通過交換矩陣的行和列完成的。GLM庫和GLSL庫都有轉(zhuǎn)置函數(shù),分別是glm::transpose(mate4)和transpose(mate4)。
- 矩陣加法是多個(gè)矩陣對應(yīng)位置的元素相加即可。在GLSL中,+運(yùn)算符在mate4上進(jìn)行了重載,支持矩陣加法。
- 矩陣乘法:注意矩陣乘法不滿足交換律。矩陣乘法一般可以從左向右或從右向左處理。在3D圖形學(xué)中,點(diǎn)與矩陣相乘(從右往左)得到點(diǎn)。點(diǎn)用齊次坐標(biāo)表示為列數(shù)為1的矩陣。GLSL和GLM都支持點(diǎn)(vec4)與矩陣相乘用*運(yùn)算符。兩個(gè)4階矩陣相乘如下:?矩陣相乘也 經(jīng)常叫做合并,它可以用于將一系列矩陣變換合并為一個(gè)矩陣(源自矩陣的結(jié)合律)。GLSL和GLM都支持使用重載的*運(yùn)算符進(jìn)行矩陣乘法。?(上圖源自《計(jì)算機(jī)圖形學(xué)編程(使用OpenGL和C++)》作者:V.斯科特.戈登 約翰.克萊維吉 (人民郵電出版社)173頁)
- 矩陣的逆:一個(gè)4階矩陣的逆矩陣依然是4階矩陣,且矩陣×矩陣的逆為單位矩陣。GLSL和GLM都提供了計(jì)算矩陣的逆的函數(shù)mate4.inverse()。
四、變換矩陣
? ? ? ? 在圖形學(xué)中,矩陣通常用來進(jìn)行物體的變換。如矩陣可以用來將物體從一點(diǎn)移動(dòng)到另一點(diǎn)。接下來接受五個(gè)常用的變換矩陣。變換矩陣都是4階矩陣
- ? ? 平移矩陣:用于將物體從一個(gè)位置移動(dòng)到另一個(gè)位置。它包含一個(gè)單位矩陣,同時(shí)X、Y、Z的移動(dòng)量在矩陣的最后一列,即A03、A13、A23? 。 下圖表示點(diǎn)(X,Y,Z,1)與平移矩陣相乘后平移到(X+Tx,Y+Ty,Z+Tz,1)。(從右往左)。GLM中有用于構(gòu)建與點(diǎn)相乘的平移矩陣。glm::translate(x,y,z)構(gòu)建平移矩陣(x,y,z)的矩陣。
?(上圖源自《計(jì)算機(jī)圖形學(xué)編程(使用OpenGL和C++)》作者:V.斯科特.戈登 約翰.克萊維吉 (人民郵電出版社)177頁)
- 縮放矩陣:縮放矩陣用于改變物體的大小或者將點(diǎn)向原點(diǎn)相反的方向移動(dòng)。縮放矩陣是由單位矩陣和位于A00,A11,A22的X,Y,Z縮放因子組成的。如下圖。此外縮放還可以用來切換坐標(biāo)系。從上面兩個(gè)坐標(biāo)系中可以看出,左手系和右手系的區(qū)別就是Z軸的方向相反。故只需要Sx =1,Sy = 1,Sz = -1即可以實(shí)現(xiàn)左手系和右手系的轉(zhuǎn)化。GLM 有用于構(gòu)建與點(diǎn)相乘的縮放矩陣的函數(shù)。glm::scale(x,y,z)構(gòu)建縮放(x,y,z)的縮放矩陣。
?(上圖源自《計(jì)算機(jī)圖形學(xué)編程(使用OpenGL和C++)》作者:V.斯科特.戈登 約翰.克萊維吉 (人民郵電出版社)179頁)
- ? ? 旋轉(zhuǎn)矩陣:旋轉(zhuǎn)會(huì)比較復(fù)雜,因?yàn)?D空間中旋轉(zhuǎn)物體需要指定旋轉(zhuǎn)軸和旋轉(zhuǎn)的角度或弧度。旋轉(zhuǎn)變化有3種,分別繞X,Y,Z軸旋轉(zhuǎn)。矩陣形式如下圖:? ?反向旋轉(zhuǎn)的矩陣恰好等于其轉(zhuǎn)置矩陣。 ? GLM中構(gòu)建旋轉(zhuǎn)矩陣用glm::rotate(mate4,α,x,y,z)構(gòu)建繞X,Y,Z軸旋轉(zhuǎn)α度的旋轉(zhuǎn)矩陣。
?(上圖源自《計(jì)算機(jī)圖形學(xué)編程(使用OpenGL和C++)》作者:V.斯科特.戈登 約翰.克萊維吉 (人民郵電出版社)179頁)
- 投影矩陣
- LookAt矩陣
?這兩個(gè)矩陣還需要其他的一些內(nèi)容,將在下篇中進(jìn)行介紹。
五、向量
? ? ? ? 向量表示大小和方向。向量沒有特定的位置。移動(dòng)向量并不改變它所代表的意義。在3D圖形學(xué)中,向量一般用空間中的單個(gè)點(diǎn)表示,向量的大小是原點(diǎn)到該點(diǎn)的距離,方向則是原點(diǎn)到該點(diǎn)的方向。在我們的應(yīng)用中,我們簡單的將向量V表示為(x,y,z),即向量的起點(diǎn)是原點(diǎn),終點(diǎn)是點(diǎn)(x,y,z)。在GLSL和GLM中并不區(qū)分點(diǎn)和向量,它們所提供了vec3/vec4既能表示點(diǎn)又能表示向量。在GLM和GLSL中的向量操作如下:
? ? ? ? 假設(shè)向量A(u,v,w)和B(x,y,z)
- 加減法: A+B = (u+x,v+y,w+z)。glm: vec3+vec3。GLSL: vec3+vec3。減法同理
- 歸一化(變?yōu)殚L度為1):glm: normalize(vec3/vec4)。GLSL:normalize(vec3/vec4)
- 點(diǎn)積:A·B = ux+vy+wz。glm:dot(vec3/vec4,vec3/vec4)。GLSL:dot(vec3/vec4,vec3/vec4)
- 叉積:A×B = (vz-wy,wx-uz,uy-vx)。glm:cross(vec3,vec3)。GLSL:cross(vec3,vec3)
- 求模:glm:magnitude(vec3)。?GLSL:magnitude(vec3)
總結(jié)
以上是生活随笔為你收集整理的OpenGL学习随笔(三)——2022.1.24的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学习历程】05 安装大数据集群前的环境
- 下一篇: 学位英语考试复习