7 矩陣變換

2021-10-24 09:09:51 字數 2723 閱讀 2650

2.平移、旋轉、縮放矩陣

glm::vec4 vec(1.0f,0.0f,0.0f,1.0f);

//預設是乙個單位矩陣(9.9版本之後的glm應改為glm::mat4 trans(1.0f);)

glm::mat4 trans;

//縮放

trans = glm::scale(trans,glm::vec3(0.5,0.5,0.5));

//旋轉

trans = glm::rotate(trans,glm::radians(90.0f),glm::vec3(0.0,0.0,1.0));

//平移

trans = glm::translate(trans,glm::vec3(1.0f,1.0f,0.0f));

vec = trans*vec;

3.注意:**的書寫順序不等於實際變換順序    

因為:shader中頂點座標是vec4變數,相當於四行一列矩陣,所以gl_position = mvpmatrix * vec4(vertexcoord);**中最後進行的變換最先與頂點座標進行相乘,即:

**中變換順序是glm:scale,glm:rotate,glm:translate,shader中的實際順序是:matrix_scale * matrix_rotate * matrix_translate * vec4(vertexcoord),矩陣乘法滿足結合律,

相當於matrix_scale * (matrix_rotate * (matrix_translate * vec4(vertexcoord))),所以**書寫順序與實際變換順序相反

4.檢視矩陣,定義相機的位置,觀察方向,相機右方向(x軸正方向),相機上方向

(1)相機位置

glm::vec3 camerapos = glm::vec3(0.0f,0.0f,3.0f);
(2)攝像機方向(為了後面計算方便,我們使用攝像機方向的反向量,因為它指向z軸正方向)

glm::vec3 cametarget = glm::vec3(0.0f,0.0f,0.0f);

glm::cameradirection = glm::normalize(camerapos - cameratarget);

(3)右軸:首先定義乙個不與攝像機方向平行的向量,進行叉乘得到乙個垂直於攝像機方向的向量,(為了方便,我們直接定義乙個上向量,這樣叉乘的結果就是x軸方向)

glm::vec3 up = glm::vec3(0.0f,1.0f,0.0f);

glm::vec3 cameraright = glm::normalize(glm::cross(up,cameradirection));

(4)上軸:將x和z軸叉乘得到y軸

glm::vec3 cameraup = glm::cross(cameradirection,cameraright);
(5)lookat矩陣,由三個相互垂直的向量和乙個位移向量可方便的將向量變換到該座標空間

其中r是右向量,u是上向量,d是方向向量,p是攝像機位置(注意方向向量是實際上攝像機方向的相反值,因為相機的)glm提供了設定檢視矩陣的方法:

glm::mat4 view;

view = glm::lookat(glm::vec3(0.0f, 0.0f, 3.0f),glm::vec3(0.0f, 0.0f, 0.0f),glm::vec3(0.0f, 1.0f, 0.0f));

其中三個引數分別表示:攝像機位置、目標方向和上向量

關於設定檢視矩陣的小技巧:

(1)保持方向不變:glm::lookat( camerapos , camerapos + camerafront , cameraup),輸入操作改變camerapos,改變的大小值乘以camerafront

(2)降低硬體渲染效率對移動速度的影響:設定相機移動速度是cameraspeed,使用全域性變數儲存上一幀與當前幀渲染的時間差,當前幀的移動速度是cameraspeed * deltatime(時間差)

5.投影矩陣,定義可視空間(裁剪範圍)

正射投影:

glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);
四個引數依次是:可視空間的左平面座標,右平面座標,上平面,下平面,近平面和遠平面

透視投影:

glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)width/(float)height, 0.1f, 100.0f);
四個引數依次是:仰角,寬高比,近平面,遠平面

透視投影是通過改變齊次座標的w分量來進行實現的,頂點著色器處理完後的頂點座標輸出是ndc座標,座標值被轉化到[-1,1]區間是通過前三個分量處以w來實現的,距離相機越遠w分量越大,所以遠處的頂點座標越小,最終兩條平行直線會相交

6.啟用深度緩衝

glenable(gl_depth_test);

glclear(gl_color_buffer_bit | gl_depth_buffer_bit);

transforms CTM,變換矩陣

quartz轉換實現的原理 quartz把繪圖分成兩個部分,使用者空間,即和裝置無關,裝置空間,使用者空間和裝置空間中間存在乙個轉換矩陣 ctm 本章實質是講解ctm quartz提供的3大功能 移動,旋轉,縮放 演示如下,首先載入一張 移動函式cgcontexttranslatectm mycon...

opengl 矩陣變換

opengl 矩陣變換 opengl 座標系的變換如下圖 我們給我們的圖形,設定好頂點座標後,通過model matrix 變換為世界座標,然後 view matrix相機座標,projection matrix 螢幕座標x,y 1,1 矩陣變換的結果是把三維的世界最終裁剪為二維的螢幕,數學的說法就...

OpenGL矩陣變換

現在考慮object座標系中的點p px,p y,pz 向camera座標系進行變換,object座標軸分別為xyz,camera座標軸分別為uvn p pxx pyy pz z 先只考慮旋轉變換,camera座標系的基向量可表示為 u v n u.xx u.yy u.zz v.xx v.yy v....