I am trying to make the camera unable to turn 360 to the x axis, so my camera can fixed to looking from top to bottom only (not allowing look backward except turn around base on y axis). the code below is how i rotate my camera base on x axis, and i can’t figure out how can i limit the camera that won’t look beyong 180.
void Camera::RotateX(float angle)
{
float radians = angle*PI/180.0f;
CVec3df v1 = upward * (-(float)sin(radians));
CVec3df v2 = forward * ((float)cos(radians));
forward = (v1 + v2).normalise();
upward = forward.cross(left).normalise();
}
Don’t you simply add a line at the top:
if (angle > 180.0F) angle = 180.0F;
float radians = …
or am I missing something?
the value of angle is the amount of angle going to turn not turn to which angle. this is the input, i think i got somethings wrong in my implementation but i am not sure what
void handleMouseMotion(int x, int y)
{
POINT pointCursorPos; // declare a point
// mouse position tracking
GetCursorPos(&pointCursorPos); // get current point position
int xCenter = currentWidth/2;
int yCenter = currentHeight/2;
int delX = xCenter - pointCursorPos.x;
int delY = pointCursorPos.y - yCenter;
if (!(delX || delY))
return;
cam.RotateX(delY*sensitivity);
cam.RotateY(delX*sensitivity);
SetCursorPos(xCenter, yCenter);
}
void Camera::RotateX(float angle)
{
float radians = angle*PI/180.0f;
CVec3df v1 = upward * (-(float)sin(radians));
CVec3df v2 = forward * ((float)cos(radians));
forward = (v1 + v2).normalise();
upward = forward.cross(left).normalise();
if (upward.y < 0) //we're upside down
{
if (forward.y > 0) //we're looking up
{
forward = CVec3df(0, 1, 0);
}
else //we're looking down
{
forward = CVec3df(0, -1, 0);
}
upward = forward.cross(left).normalise();
}
}
Just made that up. Untested
wow, it worked. thanks a lot