一、缩放(Scaling)
把缩放变量表示为 (S1,S2,S3), 将任意向量 (x,y,z) 定义一个缩放矩阵,缩放公式:
二、位移
和缩放矩阵一样,在4×4矩阵上有几个特别的位置用来执行特定的操作,对于位移来说它们是第四列最上面的3个值。如果我们把位移向量表示为(Tx,Ty,Tz),我们就能把位移矩阵定义为:
三、旋转(Rotation)
角度制与弧度制相互转换公式:
旋转矩阵在3D空间中每个单位轴都有不同定义,旋转角度用θ表示:
1、沿x轴旋转:
2、沿y轴旋转:
3、沿z轴旋转:
4、任意旋转轴
其中(Rx,Ry,Rz)代表任意旋转轴。
四、变换(Transform)
当在组合矩阵(即变换)时,需要先进行缩放操作,然后是旋转,最后才是位移,否则它们会(消极地)互相影响。因为矩阵乘法是不遵守交换律的,这意味着它们的顺序很重要。
五、编程应用
首先,点击这里下载GLM第三方库,然后把头文件的根目录复制到自己工程的includes文件夹,并且包含它的头文件便可以使用:
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
接着,在工程添加变换代码:
// create transformations
glm::mat4 transform = glm::mat4(1.0f); // make sure to initialize matrix to identity matrix first
transform = glm::translate(transform, glm::vec3(0.5f, -0.0f, 0.0f));
transform = glm::scale(transform, glm::vec3(0.5, 0.5, 0.5));
transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));
最后,修改着色器代码如下:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 TexCoord;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos, 1.0f);
ourColor = aColor;
TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y);
}
效果如下:
六、demo下载
demo:点击跳转
觉得有帮助的话,打赏一下呗。。