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...