天天看點

OpenGL學習之使用glm庫實作變換

一、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中添加自己錄的視訊的方法,是以暫時不放結果。

繼續閱讀