OpenGL和DirextX不一樣,沒有內置的數學庫,於是我們需要找一個第三方庫,按照LearnOpenGL的教程我們使用GLM庫,可以到他們的官網下載
glm常用的數據類型
- vec2 二維向量
- vec3 三維向量
- vec4 四維向量
- mat2 二階矩陣
- mat3 三階矩陣
- mat4 四階矩陣
常用的函數
- glm::radians() 角度制轉弧度制
- glm::translate() 創建一個平移矩陣,第一個參數是目標矩陣,第二個參數是平移的方向向量
- glm::rotate() 創建一個將點繞某個軸旋轉x弧度的旋轉矩陣,第一個參數是弧度,第二個參數是旋轉軸
- glm::scale() 創建一個縮放矩陣,第一個參數是目標矩陣,第二個參數是縮放系數
創建裁剪矩陣的函數,位於glm/ext/matrix_clip_space.hpp,這個文件存放裁剪空間相關的API
- glm::ortho(float left, float right, float bottom, float top, float zNear, float zFar); 前兩個參數指定了平截頭體的左右坐標,第三和第四參數指定了平截頭體的底部和頂部。通過這四個參數我們定義了近平面和遠平面的大小,然后第五和第六個參數則定義了近平面和遠平面的距離。
- glm::perspective(float fovy, float aspect, float zNear, float zFar); 第一個參數為視錐上下面之間的夾角,第二個參數為寬高比,即視窗的寬/高,第三第四個參數分別為近截面和遠界面的深度
其實上面提到的大多數函數基本都是模板函數,只不過我們平時習慣用float的特化,為了測試GLM庫,可以試一下簡單的對一個點進行位移的操作
glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);//創建一個點
glm::mat4 trans = glm::mat4(1.0f);//創建單位矩陣
trans = glm::translate(trans, glm::vec3(1.0, 1.0, 1.0));//設置平移矩陣
vec = trans * vec;//變換矩陣左乘點向量,獲得變換后的點
cout << vec.x << vec.y << vec.z << endl;
system("pause");
將一個點(1, 0, 0)移動(1, 1, 1)
參考自LearnOpenGL