【问题标题】:GLM OpenGL Rotation only correct around X axisGLM OpenGL Rotation 仅围绕 X 轴正确
【发布时间】:2017-03-13 01:24:42
【问题描述】:

我正在使用这个非常简单的代码来围绕它们自己的原点旋转对象

void Entity::rotate(unsigned short axis, float speed, float delta)
{
    m_Orientation[axis] += delta * speed;
    glm::quat quaternion = glm::quat(glm::vec3(m_Orientation[0], m_Orientation[1], m_Orientation[2]));

    m_RotationMatrix = glm::mat4_cast(quaternion);
}

我面临的问题是旋转仅相对于对象在 X 轴上的方向。这意味着无论对象面向哪个方向(它的方向是什么),如果我围绕 X 旋转它,它将始终围绕它自己的 X 轴旋转。这就是我想要做的,但在另一个 2 轴上也是如此。

但是 Y 和 Z 总是围绕世界 X 和 Y 轴旋转,而不管我的对象面向哪个方向。

我的代码太小太简单了,我真的看不出问题吗? X 旋转总是正确的事故,还是其他两个错误?

【问题讨论】:

  • 这是该问题的视频:youtube.com / watch?v=DCZJsm8tZA8

标签: rotation quaternions glm-math


【解决方案1】:

我建议你试试这个:

#include <glm/gtx/euler_angles.hpp>
/**
If you change speed to a vec3,
it do all the calculations at once
(you won't have to do it for each angle)
**/

void Entity::rotate(glm::vec3 speed, float delta) 
{
   rotation = speed * data
   m_modelMatrix *= glm::eulerAngleXYZ(rotation.x, rotation.y, rotation.z);
}

glm::eulerAngleXYZ 函数将获取角度并从中创建一个旋转矩阵。

但请注意gimbal lock

如果您从右到左对矩阵进行乘法运算,它将围绕全局轴旋转。如果以另一种方式进行,它将围绕局部轴旋转。

【讨论】:

  • 嗨,谢谢您的回复,但是我使用 eulerAngleYXZ 得到了完全相同的结果... X 仍然正确,Y 和 Z 仍然围绕全局 X 和 Y 轴旋转,而不是局部旋转:(
  • 我没有做任何矩阵乘法?除了平移*旋转*缩放得到模型矩阵
  • 你必须这样做:平移*旋转*缩放*rotationAroundLocalAxis
  • 我在 youtube 上添加了一个视频来演示这个问题:youtube.com / watch?v=DCZJsm8tZA8 - 我也尝试过 glm::rotate 乘以单独的轴,但仍然不会给我想要的结果......也许我需要单独计算向上和侧向量并以某种方式将它们添加到计算中?或者我不确定,请有人帮忙!
  • 每帧计算一次模型矩阵,将其乘以 glm::eulerAngleYXZ(...) 就像答案中一样。不明白的请看google.fr/url?sa=t&source=web&rct=j&url=http://…(链接太长见谅)。确保不要重置矩阵,并将旋转矩阵放在乘法的右侧。
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 2017-06-30
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
相关资源
最近更新 更多