Eine Matrix in einen Quaternionen umwandeln



  • Hallo,

    ich habe eine Funktion in C++ die eine Matrix in einen Quaternionen umwandelt, ich möchte das aber anders rum auch haben.

    Hier ist meine Funktion:

    // Die "quaternion" Klasse hat die Komponenten X, Y, Z, W
    
    matrix4f quaternion::getMatrix() const
    {
        matrix4f m;
    
        m(0, 0) = 1.0 - 2.0*Y*Y - 2.0*Z*Z;
        m(1, 0) = 2.0*X*Y + 2.0*Z*W;
        m(2, 0) = 2.0*X*Z - 2.0*Y*W;
        m(3, 0) = 0.0;
    
        m(0, 1) = 2.0*X*Y - 2.0*Z*W;
        m(1, 1) = 1.0 - 2.0*X*X - 2.0*Z*Z;
        m(2, 1) = 2.0*Z*Y + 2.0*X*W;
        m(3, 1) = 0.0;
    
        m(0, 2) = 2.0*X*Z + 2.0*Y*W;
        m(1, 2) = 2.0*Z*Y - 2.0*X*W;
        m(2, 2) = 1.0 - 2.0*X*X - 2.0*Y*Y;
        m(3, 2) = 0.0;
    
        m(0, 3) = 0.0;
        m(1, 3) = 0.0;
        m(2, 3) = 0.0;
        m(3, 3) = 1.0;
    
        return m;
    }
    

    Wie also muss die Funktion aussehen um das anders herum zu machen??



  • Gibst du bei google quaternion matrix conversion ein und dann findest du was du suchst.



  • Also ich habe mit Google gesucht und auch etwas gefunden, aber berechnungen führen entweder zu sehr ungenauen oder besser gesagt sehr schlechten Ergebnissen.

    Dies ist meine neue Funktion:

    dim::quaternion MatrixToQuat(dim::matrix4f Mat)
    {
        dim::quaternion q;
    
        f32 trace = Mat(0, 0) + Mat(1, 1) + Mat(2, 2) + 1.0f;
    
        if (trace > 1e-10)
        {
            f32 s = 0.5 / sqrt(trace);
            q.W = 0.25f / s;
            q.X = (Mat(2, 1) - Mat(1, 2)) * s;
            q.Y = (Mat(0, 2) - Mat(2, 0)) * s;
            q.Z = (Mat(1, 0) - Mat(0, 1)) * s;
        }
        else
        {
            if (Mat(0, 0) > Mat(1, 1) && Mat(0, 0) > Mat(2, 2))
            {
                f32 s = 2.0 * sqrt(1.0f + Mat(0, 0) - Mat(1, 1) - Mat(2, 2));
                q.W = (Mat(2, 1) - Mat(1, 2) ) / s;
                q.X = 0.25f * s;
                q.Y = (Mat(0, 1) + Mat(1, 0) ) / s;
                q.Z = (Mat(0, 2) + Mat(2, 0) ) / s;
            }
            else if (Mat(1, 1) > Mat(2, 2))
            {
                f32 s = 2.0 * sqrt(1.0f + Mat(1, 1) - Mat(0, 0) - Mat(2, 2));
                q.W = (Mat(0, 2) - Mat(2, 0) ) / s;
                q.X = (Mat(0, 1) + Mat(1, 0) ) / s;
                q.Y = 0.25f * s;
                q.Z = (Mat(1, 2) + Mat(2, 1) ) / s;
            }
            else
            {
                f32 s = 2.0 * sqrt(1.0f + Mat(2, 2) - Mat(0, 0) - Mat(1, 1));
                q.W = (Mat(1, 0) - Mat(0, 1) ) / s;
                q.X = (Mat(0, 2) + Mat(2, 0) ) / s;
                q.Y = (Mat(1, 2) + Mat(2, 1) ) / s;
                q.Z = 0.25f * s;
            }
        }
    
        return q;
    }
    


  • <Besserwissermodus ein>
    Das heißt "die Quaternion" (feminin)
    <Besserwissermodus aus>

    mfg



  • Bloops schrieb:

    <Besserwissermodus ein>
    Das heißt "die Quaternion" (feminin)
    <Besserwissermodus aus>

    mfg

    pah, gleich erstell' ich einen wiktionary-eintrag...


Anmelden zum Antworten