c++ - 在 OpenGL 中旋转 0

标签 c++ opengl quaternions

我在 OpenGL 中使用四元数旋转一个对象,但我遇到了一个问题,当我从 5 度旋转到 -5 度(穿过一个单位平面)时,我看到我的模型旋转“很远”。也就是说,它从 5 到 -5 旋转了完整的 350 度,而不是整个平面的 10 度。每当我通过旋转 0 度“通过”时,围绕每个轴的旋转都会发生这种情况,但我不确定如何修复它。

我的代码如下所示,其中 roll、pitch 和 yaw 代表我的对象旋转的欧拉角:

quaternion[0] = cos(pitch/2)*cos(yaw/2)*cos(roll/2) + sin(pitch/2)*sin(yaw/2)*sin(roll/2);
quaternion[1] = sin(pitch/2)*cos(yaw/2)*cos(roll/2) - cos(pitch/2)*sin(yaw/2)*sin(roll/2);
quaternion[2] = cos(pitch/2)*sin(yaw/2)*cos(roll/2) + sin(pitch/2)*cos(yaw/2)*sin(roll/2);
quaternion[3] = cos(pitch/2)*cos(yaw/2)*sin(roll/2) - sin(pitch/2)*sin(yaw/2)*cos(roll/2);
glLoadIdentity();   
glPushMatrix();
glRotatef((float) (2.0f * acos(quaternion[0]) * 180.0f / PI), quaternion[1], quaternion[2], quaternion[3]);

有什么建议吗?

最佳答案

问题不是您的四元数或 glRotate(),而是您计算旋转步距的地方。

可能您正在使用某种归一化,其中像 -5 这样的负角被“校正”为 0..359 范围内的值,因此它将变为 355 并且您的旋转然后从 5 执行到 355。

关于c++ - 在 OpenGL 中旋转 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8430426/

相关文章:

c++ - VSCode IntelliSense无法识别SDL框架的SDL_image扩展库

math - 两个四元数之间的“差异”

c++ - 查找作为参数传递给函数的数组中的元素数。

c++ - 运算符优先级困惑

c++ - 渲染场景后让 CPU 休息

c++ - OpenGL 错误。运行时立方体顶点位置错误?

opengl - 优化像素交换着色器

c++ - 将四元数转换为相机旋转矩阵 - OpenCV

ios - SCN四元数乘法

python - ROS 中 C++ 和 Python 都是必需的吗