c – 如何正确旋转GLM四元数?

我希望在我的游戏中将我的汽车向左旋转90度.

当我使用这段代码时:

glm::quat rot(info.Rotation.w,info.Rotation.x,info.Rotation.y,info.Rotation.z);
            glm::quat done(glm::rotate(rot,glm::eulerAngles(rot)+glm::vec3(90.0f,0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

汽车得到一个奇怪的旋转.

但是,以下代码根本不会改变汽车的旋转(正如我所期望的那样,只是为了确保GLM与游戏中的quats兼容):

glm::quat rot(info.Rotation.w,info.Rotation.z);
            glm::quat done(rot);
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

每当我试着检查旋转是否随之改变时:

glm::quat rot(info.Rotation.w,vec3(0.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

汽车轮换仅设置为游戏中的0,0轮换.我希望这个代码保持旋转不受影响,因为我期望以下代码将汽车向左旋转90度:

glm::quat rot(info.Rotation.w,vec3(90.0,0.0)));
            info.Rotation.x = done.x;
            info.Rotation.y = done.y;
            info.Rotation.z = done.z;
            info.Rotation.w = done.w;

但这不符合我的要求.它只是设置旋转,而不是将其添加到’rot’.

我究竟做错了什么?

解决方法

如果你不关心万向节锁,那么应该这样做.
glm::quat rot(info.Rotation.w,info.Rotation.z);
glm::quat rot_euler_angles = glm::gtx::quaternion::eulerAngles(rot);
rot_euler_angles.x += 90;

glm::quat done(glm::rotate(rot,rot_euler_angles));
info.Rotation.x = done.x;
info.Rotation.y = done.y;
info.Rotation.z = done.z;
info.Rotation.w = done.w;

我认为这也是有效的

glm::vec3 rot(90.0*(float)M_PI/180.0,0);
info.Rotation = glm::normalize(info.Rotation * glm::quat(rot));

四元数很棒,因为它们可以复合以进行非常复杂的旋转.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...