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);
成功旋转了90度