Matrices, quads

Hello,
I would like to ask, how to calculate quaternion from matrix ? thank you :slight_smile:

i found this site, but it shows different values then my other app, which is right (i think)

http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm


void Quat::FromMatrix(const Mat3& mat)
{
	float trace = mat(0, 0) + mat(1, 1) + mat(2, 2);
	if (trace > nv_zero){
		float scale = sqrtf(trace + nv_one);
		w = nv_zero_5 * scale;
		scale = nv_zero_5 / scale;
		x = scale * (mat(2, 1) - mat(1, 2));
		y = scale * (mat(0, 2) - mat(2, 0));
		z = scale * (mat(1, 0) - mat(0, 1));
	}
	else 
    {
		static int next[] = { 1, 2, 0 };
		int i = 0;
		if (mat(1, 1) > mat(0, 0))
			i = 1;
		if (mat(2, 2) > mat(i, i))
			i = 2;
		int j = next[i];
		int k = next[j];
		float scale = sqrtf(mat(i, i) - mat(j, j) - mat(k, k) + 1);
		float* q[] = { &x, &y, &z };
		*q[i] = 0.5f * scale;
		scale = 0.5f / scale;
		w = scale * (mat(k, j) - mat(j, k));
		*q[j] = scale * (mat(j, i) + mat(i, j));
		*q[k] = scale * (mat(k, i) + mat(i, k));
	}
}

Be aware that a matrix can include reflections and scaling, while a quaternion can only represent a rotation.

First, why do you guys answer this question?
It’s asked in the wrong section and the answer is not difficult to find on the Internet.

To the question itself…
Q and -Q (component-wise) both are equivalents of the orthonormal matrix transformation in a space with a given handness(!).

So, I guess you can find 4 correct algorithms all producing different results (Q from right-handed, Q from left handed, -Q from right, -Q from left).

DmitryM: Because, They are kind ? :slight_smile:

thank you :wink: