日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL学习随笔(三)——2022.1.24

發(fā)布時(shí)間:2023/12/14 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL学习随笔(三)——2022.1.24 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

????????通過上兩回的學(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。