# Quaternion gives wrong results

This topic is 3915 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi, I'm experimenting with quaternions and I ran into a problem. I have an axis angle represenation and I want to convert it to a quaternion. Then I want to convert it to a matrix (I know this is useless, but I narrowed my problem down to this). So if I rotate the matrix directly with the axis angle I should get the same result. But it's not :S These are my test numbers and results:
axis: (1, 0, 0). angle: 1.5707964 radians.

Quaternion is: xyz: (0.70710677, 0, 0). w: 0.70710677.

Matrix:

[0]	1.0000000	float
[1]	-0.00000000	float
[2]	0.00000000	float
[3]	0.00000000	float
[4]	0.00000000	float
[5]	5.9604645e-008	float
[6]	-0.99999994	float
[7]	0.00000000	float
[8]	0.00000000	float
[9]	0.99999994	float
[10]	5.9604645e-008	float
[11]	0.00000000	float
[12]	0.00000000	float
[13]	0.00000000	float
[14]	0.00000000	float
[15]	1.0000000	float

While the direct axis angle to matrix yields:
		[0]	0.99999994	float
[1]	0.00000000	float
[2]	0.00000000	float
[3]	0.00000000	float
[4]	0.00000000	float
[5]	-4.3711388e-008	float
[6]	1.0000000	float
[7]	0.00000000	float
[8]	0.00000000	float
[9]	-1.0000000	float
[10]	-4.3711388e-008	float
[11]	0.00000000	float
[12]	0.00000000	float
[13]	0.00000000	float
[14]	0.00000000	float
[15]	1.0000000	float

My routines:
	// Convert to Matrix
matrix4f getMatrix()
{
Normalise();
float x2 = x * x;
float y2 = y * y;
float z2 = z * z;
float xy = x * y;
float xz = x * z;
float yz = y * z;
float wx = w * x;
float wy = w * y;
float wz = w * z;

//   OpenGL matrix type
return matrix4f( 1.0f - 2.0f * (y2 + z2), 2.0f * (xy - wz), 2.0f * (xz + wy), 0.0f,
2.0f * (xy + wz), 1.0f - 2.0f * (x2 + z2), 2.0f * (yz - wx), 0.0f,
2.0f * (xz - wy), 2.0f * (yz + wx), 1.0f - 2.0f * (x2 + y2), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
}

void FromAxis(const vector3f &v, float angle)
{
float sinAngle;
angle *= 0.5f;
vector3f vn(v);
vn.Normalize();

sinAngle = sinf(angle);

x = (vn.x * sinAngle);
y = (vn.y * sinAngle);
z = (vn.z * sinAngle);
w = cosf(angle);
}

// and the matrix rotation, pretty sure this is correct!
inline void Rotate(float angle, float x, float y, float z)
{
vector3f axis(x, y, z);
axis.Normalize();

matrix4f rot;

float b = angle;
float c = cosf(b);
float ac = 1.00f - c;
float s = sinf(b);

rot.m[0] = axis.x * axis.x * ac + c;
rot.m[1] = axis.x * axis.y * ac + axis.z * s;
rot.m[2] = axis.x * axis.z * ac - axis.y * s;

rot.m[4] = axis.y * axis.x * ac - axis.z * s;
rot.m[5] = axis.y * axis.y * ac + c;
rot.m[6] = axis.y * axis.z * ac + axis.x * s;

rot.m[8] = axis.z * axis.x * ac + axis.y * s;
rot.m[9] = axis.z * axis.y * ac - axis.x * s;
rot.m[10] = axis.z * axis.z * ac + c;

Multiply(rot, false); // M = R * M
}



##### Share on other sites
It looks like you might be mixing row-vector and column-vector notational conventions. If so, you'll need to pick one or the other, and then make sure that all of your code is implemented appropriately.

1. 1
2. 2
3. 3
Rutin
24
4. 4
5. 5
khawk
14

• 11
• 11
• 23
• 10
• 9
• ### Forum Statistics

• Total Topics
633651
• Total Posts
3013132
×