【问题标题】:Rotating an object with quaternion使用四元数旋转对象
【发布时间】:2015-02-14 03:57:08
【问题描述】:

我有一个关于使用四元数来旋转我的图形对象的问题。

我有一个Transform 类,它具有以下带有默认参数的构造函数:

Transform(const glm::vec3& pos = glm::vec3(0.0), const glm::quat& rot = glm::quat(1.0, 0.0, 0.0, 0.0),
    const glm::vec3& scale = glm::vec3(1.0))
{
    m_pos = pos;
    m_rot = rot;
    m_scale = scale;
}

在我的Transform 类中计算MVP 如下:

glm::mat4 Transform::GetModelMatrix() const
{
    glm::mat4 translate = glm::translate(glm::mat4(1.0), m_pos);
    glm::mat4 rotate = glm::mat4_cast(m_rot);
    glm::mat4 scale = glm::scale(glm::mat4(1.0), m_scale);

    return translate * rotate * scale;
}

我面临的问题是,当我使用const glm::quat& rot = glm::quat(1.0, 0.0, 0.0, 0.0) 时,我的对象在屏幕上显示正常。下图显示了它:

但是,如果我尝试使用例如 const glm::quat& rot = glm::quat(glm::radians(90.0f), 0.0, 1.0, 0.0)(在 y 轴上旋转 90 度),我的对象看起来好像已被缩放。下图显示了它:

当我尝试旋转它时,我无法弄清楚是什么导致它变成这样。我错过了什么重要的东西吗?

如果有任何相关性,以下是我计算视图矩阵的方法:

glm::mat4 Camera::GetView() const
{
    glm::mat4 view = glm::lookAt(m_pos, m_pos + m_forward, m_up);

    return view;
}

【问题讨论】:

  • glm 没有指定角度和轴的四元数构造函数。您正在使用您的值直接初始化四元数文件,导致一些奇怪的非标准化四元数。
  • @derhass 那么我应该如何初始化它呢?

标签: opengl rotation quaternions glm-math


【解决方案1】:

AFAIK,您可以使用以下方法初始化 glm::quat:

glm::vec3 angles(degToRad(rotx), degToRad(roty), degToRad(rotz));
glm::quat rotation(angles);

其中rotx、roty、rotz 是围绕 x、y 和 z 轴的旋转角度,而 degToRad 将角度转换为弧度。因此,对于您的情况:

glm::vec3 angles(degToRad(0), degToRad(90), degToRad(0));
glm::quat rotation(angles);

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多