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