OpenGL + glm库实现四元数的旋转

最近在搭小引擎,在节点类里面弄了一个返回模型矩阵的方法,想实现旋转,用欧拉角的方式会发生万向节死锁,所以只好用四元数的方式实现,然而learnOpenGL里只提到了用欧拉角的旋转方法,只好去翻翻glm库的文档了

使用四元数进行旋转需要用到几个库

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/quaternion.hpp>

然后看看具体怎么实现

glm::mat4 model = glm::mat4(1.0f); //创建一个单位矩阵
glm::qua<float> q = glm::qua<float>(glm::radians(glm::vec3(0.0f, 0.0f, 90.0f))); //创建一个绕z轴旋转90度的四元数
model = glm::mat4_cast(q) * model;	//得到一个旋转的模型矩阵

glm::mat4_cast可以把四元数转换成旋转矩阵,这个函数在glm/gtc/matrix_transform.hpp
新版本的glm库旋转用的都是弧度制,所以角度制要记得用radians转换一下

另外要注意的是,我们造引擎的时候,实现模型矩阵,要按照缩放->旋转->平移的顺序处理模型矩阵,运算的话就是

model = 平移矩阵 * 旋转矩阵 * 缩放矩阵 * E

测试

我们用learnOpenGL里读取模型的章节进行测试,把模型矩阵左乘一个旋转矩阵

model = glm::scale(model, glm::vec3(0.2f, 0.2f, 0.2f));
glm::qua<float> q = glm::qua<float>(glm::radians(glm::vec3(0.0f, 0.0f, 90.0f)));
model = glm::mat4_cast(q) * model;
 ourShader.setMat4("model", model);

OpenGL + glm库实现四元数的旋转
成功旋转了90度