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