OpenGL学习笔记《五》转换
转换(Transformations),主要是指位移(Translate),缩放(Scaling),旋转(Rotation)三种,opengl实现这三种转换,主要是通过矩阵的运算来实现的。在这里就会涉及到一定的矩阵、向量的运算了。
opengl没有提供现成的矩阵、向量运算的库,这个需要我们自己引入第三方的库,在教程中作者是使用到了GLM库,可以在这里下载。
因为矩阵运算并不满足交换律,所以在这里进行转换的矩阵操作对于运算顺序有要求,需要先缩放(Scaling),再旋转(Rotation),最后再位移(Rotation)。而实际书写过程可能又是这样的顺序:T * R * S,在代码中调用顺序是 T、R、S, 在这里需要注意一下。我们理解/读矩阵组合运算的式子,应该是从右到左的顺序。
glm提供现成的位移、缩放、旋转的矩阵运算方法,分别为glm::translate、glm::scale、glm::rotation,假如我们在这里需要实现一个缩放、旋转、位移的组合操作,我们的代码大概是这样的:
// 转换矩阵 glm::mat4 trans = glm::mat4(1.0f); // 位移 x轴移动0.5单位,y轴移动-0.5单位 trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f)); // 旋转 绕y轴旋转45度 trans = glm::rotation(trans, glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f)); // 缩放 0.5 trans = glm::scale(trans, glm::vec3(0.5f, 0.5f, 0.5f));
这是一个组合运算的过程,最终得到一个转换后的矩阵。再将转换好的矩阵传给顶点着色器,就能看到最终的转换效果了。顶点着色器接收转换后的矩阵:
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aColor; layout (location = 2) in vec2 aCoord; out vec3 oColor; out vec2 oCoord; uniform mat4 u_transform; void main() gl_Position = u_transform * vec4(aPos, 1.0f); oColor = aColor; oCoord = aCoord; }
GLSL内部也有对应的mat4类型的变量,用来存储传递过来的转换矩阵数据,再将这个乘以顶点坐标,既可以得到转换后的坐标信息。
赋值uniform部分对应的调整为
glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(trans));
参数1为uniform变量的位置索引,参数4就是我们要传递过来的矩阵数据,glm使用value_ptr方法将glm存储的矩阵格式转换为GLSL使用的格式。
对应的代码在这里。