2

独自の四元数クラスを作成しようとしていますが、奇妙な結果が得られます。回転させようとしている立方体が狂ったようにちらつくか、ゆがんでいます。

これは私のコードです:

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

4

2 に答える 2

0

回転行列に誤りがあります。要素 (2,3) を要素 (3,2) と交換してみてください。

于 2013-09-16T19:23:38.660 に答える
0

回転行列を最後まで調べないと、考えられるバグが 2 つあります。1 つ目は、回転行列 R が直交していないことです。つまり、R の逆行列は転置行列と等しくありません。これにより、オブジェクトのゆがみが発生する可能性があります。バグを隠す 2 番目の場所は、クォータニオンの乗算の内部です。

于 2013-09-16T15:27:44.030 に答える