【问题标题】:Quaternions getting warped or flickers四元数扭曲或闪烁
【发布时间】:2013-09-16 12:09:08
【问题描述】:

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

这是我的代码:

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

【问题讨论】:

  • 那么你的代码在某处是错误的。你能简化你的测试用例并对每个四元数方法进行单元测试吗?尝试手动传递简单案例并验证边缘案例的正确性。不幸的是,除了有条不紊和合理的编码之外,这里没有灵丹妙药,最有可能的是前面提到的 TDD。
  • 是的,我的代码不正确。我不是 100% 确定我理解你的答案,我的英语不是最好的......我试图保持它尽可能基本,只渲染一个简单的立方体。我不知道如何设置一个更简单的测试用例,抱歉。这是我正在使用的关于四元数的所有代码。感谢您的回复!
  • 更简单的代码不会渲染任何东西,只需计算并输出非常简单的数据上的数字,您可以自己验证;您还可以尝试使用矩阵和四元数(甚至更好,您信任的其他四元数库)构建等效转换,然后检查结果是否相同。希望这能澄清一点。

标签: c++ opengl quaternions glm-math


【解决方案1】:

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

【讨论】:

  • 我查过了。逆!=转置。谢谢提醒,我会调查此事,希望能找到解决办法!
【解决方案2】:

旋转矩阵有错误。尝试将元素 (2,3) 与元素 (3,2) 交换。

【讨论】:

  • 这解决了我的闪烁问题!谢谢!但是现在我遇到了另一个问题……这个物体只绕着它自己的 Y 轴旋转。我会更多地调查此事。至少这比闪烁更容易调试......
猜你喜欢
  • 2011-03-21
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多