OpenGL之變換、矩陣堆棧

OpenGL中的變換

變換 解釋
視圖變換 指定觀察者的位置
模型變換 在場(chǎng)景中移動(dòng)物體
模型視圖 描述視圖/模型變換的二元性(2種看到模型轉(zhuǎn)換的方式)
投影 改變視景體大小和設(shè)置它的投影方式
視口 偽變化,對(duì)窗口上最終輸出進(jìn)行縮放

視圖變換

2個(gè)視角觀察視覺(jué)坐標(biāo)

  • 視圖變換是應(yīng)用到場(chǎng)景中的第一種變換,可以將觀察者放在你希望的任何位置,并允許在任何方向上觀察場(chǎng)景,確定場(chǎng)景中利于觀察的位置。確定視圖變換就像在場(chǎng)景中放置觀察者并讓它指向某一個(gè)方向。
  • 默認(rèn)情況下,透視投影中的觀察者位置處于原點(diǎn)(0,0,0),并沿著z軸負(fù)方向看向屏幕里面。
  • 從大局上考慮,在應(yīng)用任何其他模型變換之前,必須先應(yīng)用視圖變換。這樣做事由于,對(duì)于視覺(jué)坐標(biāo)系而言,視圖變換移動(dòng)了當(dāng)前的工作的坐標(biāo)系,后續(xù)變換都會(huì)基于新調(diào)整的坐標(biāo)系進(jìn)行。

模型變換

模型變換:用于操縱模型與其中某特定變換。這些變換將對(duì)象移動(dòng)到需要的位置,通過(guò)旋轉(zhuǎn)、縮放、平移。


模型變換

模型變換組合

對(duì)模型的組合變換順序不一樣,就會(huì)得到不同的結(jié)果,物體經(jīng)過(guò)變換后的最終位置也不一樣。其根本原因在于矩陣的叉乘不滿足交換律。所以不能交換模型變換(平移、旋轉(zhuǎn))的前后順序。
如果對(duì)一個(gè)物體進(jìn)行模型視圖的變換,可以有多種方式。

  1. 觀察者動(dòng),物體不動(dòng);
  2. 觀察者不動(dòng),物體動(dòng);
  3. 觀察者動(dòng),物體也動(dòng)。

其最終目的都是為了更好的觀察物體。

模型變換API

轉(zhuǎn)自style_月月

投影變換

來(lái)自CC老師

投影方式有兩種

  • 透視投影:屏幕上物體與實(shí)物的比例是 < 1:1的,且有遠(yuǎn)小近大的效果
    OpenGL中對(duì)應(yīng)的設(shè)置API:
    void SetPerspective(float fFov, float fAspect, float fNear, float fFar)
  • 正投影:屏幕上物體與實(shí)物的比例是 = 1:1的,都是一樣大的效果
    設(shè)置投影方式的API:
    void SetOrthographic(GLfloat xMin, GLfloat xMax, GLfloat yMin, GLfloat yMax, GLfloat zMin, GLfloat zMax)

矩陣堆棧

當(dāng)我們觀察物體變換場(chǎng)景時(shí),需要設(shè)置一個(gè)幾何的變換管道(GLGeometryTransform)來(lái)使用投影矩陣堆棧和模型視圖矩陣堆棧。之后 變換管道通過(guò)GetModelViewProjectionMatrix()GetMatrix函數(shù)就可以獲得矩陣堆棧頂部的值。給著色器的運(yùn)行指定了一個(gè)幾何圖形變換4 * 4變換矩陣。
其中用到的矩陣堆棧,在構(gòu)造函數(shù)時(shí)允許指定堆棧的最大深度,默認(rèn)的堆棧深度為64。這個(gè)矩陣堆在初始化時(shí)已經(jīng)在堆棧中包含了單位矩陣。矩陣堆棧是用來(lái)保存物體變換的狀態(tài),在OpenGL的狀態(tài)機(jī)里面,如果想要保證目標(biāo)圖形的變換不影響其他圖形,需要一個(gè)矩陣去保存更改前的狀態(tài),在變換圖形完成后恢復(fù)之前的狀態(tài)。
矩陣堆棧的使用API:

圖片轉(zhuǎn)自style_月月

矩陣堆棧中入棧、矩陣相乘、出棧的流程

仿射變換
矩陣堆棧中有與平移、旋轉(zhuǎn)、縮放三個(gè)模型變換相對(duì)應(yīng)的仿射變換,直接通過(guò)矩陣堆棧的API實(shí)現(xiàn)這3種變換,如下表所示

仿射變換API 說(shuō)明
Void MatrixStack::Rotate(GLfloat angle,GLfloat x,GLfloat y, GLfloat z); 旋轉(zhuǎn);參數(shù)1 angle傳遞的是度數(shù),?不是弧度
Void MatrixStack::Translate(GLfloat x,GLfloat y, GLfloat z); 平移
Void MatrixStack::Scale(GLfloat x,GLfloat y, GLfloat z); 縮放

GLFrame(角色幀)
用來(lái)表示物體及觀察者所處的位置,有三個(gè)參數(shù)

vOrigin:當(dāng)前所處的位置,默認(rèn)是(0,0,0),處于原點(diǎn)
vForward:即將要去的位置,默認(rèn)是(0,0,-1),朝向-z軸方向
vUp:朝向哪,默認(rèn)是(0,1,0),朝向+y軸方向

GLFrame

矩陣堆棧除了可以操作矩陣,也可以操作角色幀。

  • 將堆棧頂部壓入任何矩陣
    void GLMatrixStack::LoadMatrix(GLFrame &frame);
  • 與堆棧棧頂相乘,將結(jié)果存儲(chǔ)在堆棧棧頂
    void GLMatrixStack::MultMatrix(GLFrame &frame);
  • 將當(dāng)前矩陣壓棧
    void GLMatrixStack::PushMatrix(GLFrame &frame);

照相機(jī)管理

  • GLFrame的函數(shù),這個(gè)函數(shù)?來(lái)檢索條件適合的觀察者矩陣
    void GetCameraMatrix(M3DMatrix44f m,bool bRotationOnly = flase);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容