Quaternion Camera Problem

Started by
1 comment, last by EricmBrown 18 years, 4 months ago
I am trying to use a quaternion camera for my game engine. the camera works perfectly while the position is at 0,0,0. but whenever i move the position the rotation of the camera goes wacky. i havent been able to place my finger on the cause, here is the code - any help is very welcome :-).

void update()
{
        //horizontal camera movement

	if(diMgr.getCurMouseX() == 0)
		xDir = 0;

	else if(diMgr.getCurMouseX() > 1)
		xDir = -.1;

	else if(diMgr.getCurMouseX() < 1)
		xDir = .1;

        //vertical camera movement
	if(diMgr.getCurMouseY() == 0)	
		yDir = 0;

	else if(diMgr.getCurMouseY() > 1)
		yDir = -.05;

	else if(diMgr.getCurMouseY() <1)
		yDir = .05;


        //dont want to look up or down more than 1 radian!
	rotationAboutX += yDir; //how much is camera rotated up/down?
	if(rotationAboutX > 1) //if it rotates up too much, cap it
	{
		rotationAboutX = 1;
		yDir = 0;
	}
	if(rotationAboutX < -1) //same if it rotates down too far
	{
		rotationAboutX = -1;
		yDir = 0;
	}

        //now find the horizontal axis to rotate around the x-axis
        vector3 temp, axis;
	temp.x = view.x - position.x;
	temp.y = view.y - position.y;
	temp.z = view.z - position.z;
	axis = crossProduct(temp, up);
	axis = normalize(axis);

	rotateCamera(axis,yDir);		//rotate vertical camera
	rotateCamera(vector3(0,1,0),xDir);	//rotate horizontal

	if(GetAsyncKeyState(VK_UP) <0)	
	{
		position.z += view.z; //move in the direction we are facing
		position.x += view.x;
	}
	if(GetAsyncKeyState(VK_DOWN) <0)
	{
		position.z += -view.z; //move away from the direction we face
		position.x += -view.x;
	}

	//set camera location
	gluLookAt(position.x,position.y,position.z,(position.x + view.x),
                 (position.y + view.y),(position.z + view.z),up.x,up.y,up.z);
}//end update()

void rotateCamera(vector3 vec, double angle)
{
	quaternion temp, quat_view, result;

	//set the rotation quaternion to get the final coordinates of the view
	temp.x = vec.x * sin(angle/2);
	temp.y = vec.y * sin(angle/2);
	temp.z = vec.z * sin(angle/2);
	temp.w = cos(angle/2);


	//set view quaternion equal to view vector
	quat_view.x = view.x;
	quat_view.y = view.y;
	quat_view.z = view.z;
	quat_view.w = 0;

	//rotate the quaternion by equation finalQuat = rotQuat * viewQuat * 
        //conjugate(rotQuat)

	result = mult(mult(temp, quat_view), conjugate(temp));

	//set the view vector equal to the final, rotated quaternion coordinates
	view.x = result.x;
	view.y = result.y;
	view.z = result.z;
}
I used the tutorial in the math and physics section of gamedev articles to make the camera. and like i said - it works perfectly while at camera position (0,0,0). but it gives me all sorts of wacky controls once i move my camera position. please help :-\
Advertisement
You are using the view vector inconsistently. The code that calculates the rotations to perform is treating the view vector as if it was the point to look at; the code that set up the camera matrix and the rotation code is treating the view vector as a direction vector.

The easiest fix would be to change the code that is calculating the rotation axis. Keep in mind that the view vector is already a unit vector representing a direction.

Took me about 5 minutes of studying and staring at your response to finally get it, but it hit me like a ton of bricks! thanks alot, i apreciate the help :-)

This topic is closed to new replies.

Advertisement