自定义C ++四元数旋转无法正常工作

时间:2015-06-13 14:11:10

标签: c++ rotation vector-graphics quaternions

在我的代码中,我有一个四元数,用于播放器的相机旋转。旋转本身似乎工作正常,但我移动和旋转的方向向量不能正确旋转。

四元数乘法:

Quaternion Quaternion::operator*(Vector3 other) const
{

    float x_ = w * other.x + y * other.z - z * other.y;
    float y_ = w * other.y + z * other.x - x * other.z;
    float z_ = w * other.z + x * other.y - y * other.x;
    float w_ = -x * other.x - y * other.y - z * other.z;

    return Quaternion(x_, y_, z_, w_);

}

Quaternion Quaternion::operator*(Quaternion other) const
{

    Vector4 r = other.getValues();

    float x_ = x * r.w + w * r.x + y * r.z - z * r.y;
    float y_ = y * r.w + w * r.y + z * r.x - x * r.z;
    float z_ = z * r.w + w * r.z + x * r.y - y * r.x;
    float w_ = w * r.w - x * r.x - y * r.y - z * r.z;

    return Quaternion(x_, y_, z_, w_);

}

共轭功能

Quaternion Quaternion::conjugate() const
{

    return Quaternion(-x, -y, -z, w);

}

矢量轮换:

void Vector3::rotate(Quaternion rotation)
{

    Quaternion rotated = rotation * *this * rotation.conjugate();

    x = rotated.getValues().x;
    y = rotated.getValues().y;
    z = rotated.getValues().z;

}

示例定向矢量

Vector3 Quaternion::getRight() const
{

    Vector3 right(1.0f, 0.0f, 0.0f);
    right.rotate(*this);

    return right;

}

如果我让相机围绕y轴旋转90度,我打印出右矢量的值,x为0.000796229,y为0,z为-1。在这种情况下,x应为0,z应为正1.

过去几天我一直在浏览谷歌和其他人的代码,试图找出我做错了什么,但我找不到任何错误。

更新

我最终决定将GLM融入我的数学课程中,经过一些改变之后,一切都按原样运作。

2 个答案:

答案 0 :(得分:1)

在矢量旋转中,用

替换第一行
Quaternion rotated = rotation * Quaternion(this->x, this->y, this->z, 0) * 
    rotation.conjugate();

说明:四元数乘法不是可交换的,这意味着Q * v不等于v * Q,其中v是一个w = 0的四元数。

答案 1 :(得分:0)

我最终决定将GLM融入我的数学课程中,经过一些改变之后,一切都按原样运作。