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)行模型視圖的變換,可以有多種方式。
- 觀察者動(dòng),物體不動(dòng);
- 觀察者不動(dòng),物體動(dòng);
- 觀察者動(dòng),物體也動(dòng)。
其最終目的都是為了更好的觀察物體。
模型變換API

投影變換

投影方式有兩種
- 透視投影:屏幕上物體與實(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)、縮放三個(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軸方向

矩陣堆棧除了可以操作矩陣,也可以操作角色幀。
- 將堆棧頂部壓入任何矩陣
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);