OpenGL中四元数旋转问题(GLM / C ++)

问题描述 投票:0回答:1

我正在出于教育目的对游戏引擎进行编程,但我对旋转有些困惑。问题是,我在UI中有3个正方形,以欧拉角表示对象的方向,然后可以从中更改值。

要更改它们,我打电话:

void TransformComponent::SetOrientation(glm::vec3 eulerAxAngles)
{
    glm::vec3 euler_inRadians = glm::radians(eulerAxAngles);

    glm::quat newRot;
    double cy = cos(euler_inRadians.y * 0.5);
    double sy = sin(euler_inRadians.y * 0.5);
    double cp = cos(euler_inRadians.x * 0.5);
    double sp = sin(euler_inRadians.x * 0.5);
    double cr = cos(euler_inRadians.z * 0.5);
    double sr = sin(euler_inRadians.z * 0.5);
    newRot.w = cy * cp * cr + sy * sp * sr;
    newRot.x = cy * cp * sr - sy * sp * cr;
    newRot.y = sy * cp * sr + cy * sp * cr;
    newRot.z = sy * cp * cr - cy * sp * sr;

    m_Orientation = newRot * m_Orientation;
    UpdateTransform();
}

m_Orientation是存储对象当前方向的四元数。我知道所有从euler到四元数的转换都可以由glm处理,但我改为使用它来调试正在发生的事情...

然后,UpdateTransform()执行下一个:

void TransformComponent::UpdateTransform()
{
    m_TransformationMatrix = glm::translate(glm::mat4(1.0f), m_Translation) *
        glm::scale(glm::mat4(1.0f), m_Scale) * glm::mat4_cast(m_Orientation);


    //Set euler angles
    m_Rotation_InEulerAngles = glm::eulerAngles(m_Orientation);
}

并且m_Rotation_InEulerAngles是可以从UI看到的vec3,用于更改对象方​​向的角度。

问题是,当我尝试修改3个欧拉角之一时,这3个都被修改,我的意思是,如果我修改横滚角(围绕Z轴),它也会同时修改俯仰角和偏航角(而不是Z值) ,就好像它为对象设置了另一个方向)。

在此gif中,显示了如何很好地执行平移/缩放,但是旋转(目前在这里以弧度显示)效果不好,它改变了整个方向,而不仅是我想要的轴方向:

https://gfycat.com/plushhonestargentineruddyduck

有人看到我在做什么错吗?

c++ opengl 3d quaternions glm-math
1个回答
0
投票

Changing或设置方向与rotating

不同

要设置方向,您需要这样做:

void setOrientation(glm::vec3 eular)
{
    m_Orientation = glm::quat(eular); // very simple
}

void setRotation(glm::vec3 eular)
{
    m_Rotation = glm::quat(eular); // very simple
}

要旋转,我们要使用SLERP整合旋转四元数:

void update(float deltaTimeS)
{
    glm::quat ident(1.0f);
    glm::quat rotation = glm::mix(ident, m_Rotation, deltaTimeS);
    m_Orientation = rotation * m_Orientation;
}

并获得您的旋转矩阵:

void setTransform()
{
    m_RotationMatrix = glm::gtx::quaternion::toMat4(quaternion);
}

有关四元数旋转的更多信息,请参见here。>>

© www.soinside.com 2019 - 2024. All rights reserved.