Rotation Matrix not rotating Accurately

Started by
1 comment, last by Cacks 18 years ago
Hi guys, I use 4x4 matrices to represent my objects & camera rotations. The direction it rotates in is perfect. But the angle it rotates by is not. When I pass a value 1.0f to my camera or objects they seem to rotate a lot more than they should. And when I want to flip an object by rotating it by 180 degrees, It doesn't actually flip 180 degrees. here's my code:

void Matrix4x4::rotate(const SceneVector3& axis, RotationDirection direction, float angle)
{
	float rotationAngle = angle;

	//invert the rotation angle if necessary
	switch(direction)
	{
		case rotateUp:    	break;
		case rotateDown:	rotationAngle = -rotationAngle;	break;
		case rotateRight:	rotationAngle = -rotationAngle;	break;
		case rotateLeft:	break;
		case tiltRight:		rotationAngle = -rotationAngle;	break;
		case tiltLeft:		break;
		default:	break;
	}

	float x = axis.x;
	float y = axis.y;
	float z = axis.z;

	float c = cos(rotationAngle);
	float s = sin(rotationAngle);
	float t = 1.0f - c;

	//Rotation Matrix
	Matrix4x4 rotation(t*x*x+c,   t*x*y-s*z, t*x*z+s*y, 0,
					   t*x*y+s*z, t*y*y+c,   t*y*z-s*x, 0,
					   t*x*z-s*y, t*y*z+s*x, t*z*z+c,   0,
					   0        ,	0       , 0      ,	1);

	//Multiply rotation matrix by this matrix
	(*this) = rotation*(*this);
	normaliseAndOrthogonise();
}

void Matrix4x4::normaliseAndOrthogonise()
{
	//Re-normalise & orthogonise matrix because rounding will lead to errors
	//Get Column vectors
	SceneVector3 xVector = getXAxis().Normalise();
	SceneVector3 yVector = getYAxis().Normalise();	//Y-axis
	SceneVector3 zVector = getZAxis().Normalise();	//Z-axis
	
	//Normalise column vectors
	xVector = (yVector.CrossProduct(zVector)).Normalise();
	yVector = (zVector.CrossProduct(xVector)).Normalise();

	//Replace values into matrix
	matrix[0]  = xVector.x;  matrix[1]  = xVector.y;  matrix[2]  = xVector.z;  matrix[3]  = 0.0;
	matrix[4]  = yVector.x;  matrix[5]  = yVector.y;  matrix[6]  = yVector.z;  matrix[7]  = 0.0; 
	matrix[8]  = zVector.x;  matrix[9]  = zVector.y;  matrix[10] = zVector.z;  matrix[11] = 0.0; 
	matrix[12] =       0.0;  matrix[13] =       0.0;  matrix[14] =       0.0;  matrix[15] = 1.0; 
}

Any1 know why this is happening? Thanks for any help given!
Reject the basic asumption of civialisation especially the importance of material possessions
Advertisement
I hope that your angles are in radians. If they aren't you need to multiply them by pi/180.0f;
You are a genius! I forgot to convert the angles to radians! Thank you!
Reject the basic asumption of civialisation especially the importance of material possessions

This topic is closed to new replies.

Advertisement