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 :-\
Quaternion Camera Problem
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 :-).
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.
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.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement