Quaternionen "flippen" um 180 Grad



  • Hallo Leute,

    Ich beschaeftige mich gerade zum ersten mal mit Quaternionen Rotationen, damit ich eine Kamera implementieren kann, die sich um alle 3 Achsen drehen kann. Ich hab also erstmal angefangen, lediglich rauf/runter zu implementieren und schon das klappt nicht so wirklich.

    if (rotateUp || rotateDown)
    {
    	auto turn = elapsed * turnSpeed_;
    	auto& r = cameraLocation_.rotation;
    
    	if (rotateUp)
    		r *= glm::quat(-turn, glm::vec3(1.f, 0.f, 0.f));
    
    	if (rotateDown)
    		r *= glm::quat(turn, glm::vec3(1.f, 0.f, 0.f));
    
    	r = glm::normalize(r);
    
    	std::cout << "rotation = (" << r.w << ", (" << r.x << ", " << r.y << ", " << r.z << "))\n";
    
    	updateProjectionWorld();
    }
    

    Die w-Komponente flippt immer zwischer Werten nahe an -1, 0 und 1, obwohl sie eigentlich 1 bleiben sollte...
    Hier Beispiel (leider schlechte Quali): http://i.gyazo.com/852fb84ad4f0d2ea20d29915dcf3fb60.gif
    Noch ein besserer Screenshot von den ersten Werten: http://i.gyazo.com/b604ef1439b13615204ef07d8b3a2d9b.png
    Durch dieses flippen kommt der Effekt zu stande, dass mein Wuerfel waehrend des Rotierens dauernd blinkt.

    Weiss jemand weiter?

    Gruesse,
    Der Kellerautomat



  • Ich habe es mittlerweile von selbst rausgefunden. Der glm::quat Konstruktor macht nicht das, was ich dachte. Stattdessen brauchte ich glm::angleAxis.

    Vielen danke glm fuer diesen Fehler, schon zum zweiten mal heute. Drecks Lib.


Anmelden zum Antworten