一、glm簡介
glm常用三維資料類型
vec2 二維向量
vec3 三維向量
vec4 四維向量
mat2 二階矩陣
mat3 三階矩陣
mat4 四階矩陣
常用的函數
glm::radians()角度制轉弧度制
glm::translate()建立一個平移矩陣,第一個參數是目标矩陣,第二個參數是平移的方向向量
glm::rotate()建立一個将點繞某個軸旋轉x弧度的旋轉矩陣,第一個參數是弧度,第二個參數是旋轉軸
glm::scale()建立一個縮放矩陣,第一個參數是目标矩陣,第二個參數是縮放系數
二、glm使用
我們使用GLM(OpenGL Mathematics),我們使用d它是一個隻有頭檔案的庫。根據教程建議,我們使用低于0.9.9版本的GLM。把下載下傳好的頭檔案包含到我們的include檔案夾下,就可以使用了。
然後我們在.cpp中添加
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
1.測試
glm::vec(1.0f,0.0f,0.0f,1.0f);
glm::mat4 trans;
trans=glm::translate(trans,glm::vec3(1.0f,1.0f,0.0f));
vec =trans*vec;
std::cout<<vec.x<<vec.y<<vec.z<<std::endl;
以上代碼中,我們首先用GLM内建的向量類定義一個叫做vec的向量。
然後定義一個mat4類型的trans,預設是一個4*4矩陣。
接着我們建立一個變換矩陣,最後用給定的矩陣乘以位移矩陣就能獲得最後需要的矩陣。
2.利用glm函數
glm::mat4 trans;
trans=glm::rotate(trans,glm::radians(90.0f),glm::vec3(0.0,0.0,1.0));
trans=glm::scale(trans,glm::vec3(0.5,0.5,0.5));
上述代碼實作的功能是:把箱子的每個軸都縮放0.5倍,然後沿z軸旋轉90度(使用glm::radians将角度轉化為弧度,逆時針為正),由于有紋理的面是在XY平面上的,是以把箱子繞着z軸旋轉。
修改頂點着色器
#version 330 core
layout(location=0)in vec3 apos;
layout(location=1)in vec2 aTexCoord;
out vec2 TextCoord;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos,1.0f);
TexCoord = vec2(aTexCoord.x,1.0-aTexCoord.y);
}
把變換矩陣傳遞給着色器
unsingned int transformLoc=glGetUniformLocation(ourShader.ID,"transform");
glUniformMatrix4fv(transformLoc,1,GL_FALSE,glm::value_ptr(trans));
由于還沒掌握在CSDN中添加自己錄的視訊的方法,是以暫時不放結果。