c++ - 四元数变形或闪烁

标签 c++ opengl quaternions glm-math

我正在尝试创建我自己的四元数类,但我得到了奇怪的结果。我尝试旋转的立方体要么疯狂闪烁,要么变形。

这是我的代码:

void Quaternion::AddRotation(vec4 v)
{
    Quaternion temp(v.x, v.y, v.z, v.w);
    *this = temp * (*this);
}

mat4   Quaternion::GenerateMatrix(Quaternion &q)
{
    q.Normalize();

    //Row order
    mat4 m( 1 - 2*q.y*q.y - 2*q.z*q.z, 2*q.x*q.y - 2*q.w*q.z, 2*q.x*q.z + 2*q.w*q.y, 0,
            2*q.x*q.y + 2*q.w*q.z, 1 - 2*q.x*q.x - 2*q.z*q.z, 2*q.y*q.z + 2*q.w*q.x, 0,
            2*q.x*q.z - 2*q.w*q.y, 2*q.y*q.z - 2*q.w*q.x, 1 - 2*q.x*q.x - 2*q.y*q.y, 0,
            0, 0, 0, 1);

    //Col order
    //  mat4 m( 1 - 2*q.y*q.y - 2*q.z*q.z,2*q.x*q.y + 2*q.w*q.z,2*q.x*q.z - 2*q.w*q.y,0,
    //          2*q.x*q.y - 2*q.w*q.z,1 - 2*q.x*q.x - 2*q.z*q.z,2*q.y*q.z - 2*q.w*q.x,0,
    //          2*q.x*q.z + 2*q.w*q.y,2*q.y*q.z + 2*q.w*q.x,1 - 2*q.x*q.x - 2*q.y*q.y,0,
    //          0,0,0,1);

    return m;
}

当我创建实体时,我给它一个四元数:

entity->Quat.AddRotation(vec4(1.0f, 1.0f, 0.0f, 45.f));

每一帧我都尝试将它额外旋转一点:

for (int i = 0; i < Entities.size(); i++)
{
    if (Entities[i] != NULL)
    {
        Entities[i]->Quat.AddRotation(vec4(0.5f, 0.2f, 1.0f, 0.000005f));
        Entities[i]->DrawModel();
    }
    else
        break;
}

最后这是我绘制每个立方体的方式:

void Entity::DrawModel()
{
    glPushMatrix();

    //Rotation
    mat4 RotationMatrix;
    RotationMatrix = this->Quat.GenerateMatrix(this->Quat);

    //Position
    mat4 TranslationMatrix = glm::translate(mat4(1.0f), this->Pos);

    this->Trans = TranslationMatrix * RotationMatrix;

    glMultMatrixf(value_ptr(this->Trans));

    if (this->shape != NULL)
        this->shape->DrawShape();

    glPopMatrix();
}

编辑:这是我用来学习四元数的教程: http://www.cprogramming.com/tutorial/3d/quaternions.html

最佳答案

如果不研究你的旋转矩阵到底,我能想到两个可能的错误。第一个是你的旋转矩阵 R 不是正交的,即 R 的倒数不等于转置。这可能会导致物体变形。隐藏错误的第二个地方是四元数的乘法。

关于c++ - 四元数变形或闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18827674/

相关文章:

c++ - 无法在 Windows CE 中以编程方式卸载字体

.net - 在 .NET 中使用 C++ 类

c++ - 为什么有人需要指向指针的指针?

c++ - 是否可以在 directx dc/buffer 上使用 opengl 进行绘制?

c++ - 使用 GLAD 时无法命名变量 "far"和 "near"

java - 向四元数添加3D vector

c++ - VBScript 和 C++ 之间 wuapi 的无法解释的差异

c++ - 在opengl中旋转时闪烁

c++ - IMU数据中的重力补偿

c++ - 如何旋转 btCollisionShape