Original Post
alright i just put this code in that will move the screen around in my 3d enviroment with the mouse, now 1st problem which ive been up all night trying to figure out is that it wont rotate around in a full 360deg circle only 180deg then stops!!!! 2nd problem is when i have both x and y look coords enabled so you can look all around instead of just left and right or up and down, when you move the mouse around the camera will roll and not be evenly horizontal know what i mean?? Heres the code for my prog that rotates the camera!!! Heres the code that trells the prog to rotate by mouse i think the problems in here???? [Edited by - chaoticseedx on October 7, 2005 3:43:35 PM]
void Camera::RotateCamera(float AngleDir, float xSpeed, float ySpeed, float zSpeed)
{
float xNewLookDirection = 0, yNewLookDirection = 0, zNewLookDirection = 0;
float xLookDirection = 0, yLookDirection = 0, zLookDirection = 0;
float CosineAngle = 0, SineAngle = 0;
// First we will need to calculate the cos and sine of our angle. I creaetd two macros to
// do this in the CCamera.h header file called GET_COS and GET_SINE. To use the macros
// we just send in the variable we ant to store the results and the angle we need to
// calculate.
GET_COS(CosineAngle, AngleDir);
GET_SINE(SineAngle, AngleDir);
// Next get the look direction (where we are looking) just like in the move camera function.
xLookDirection = _look.x - _pos.x;
yLookDirection = _look.y - _pos.y;
zLookDirection = _look.z - _pos.z;
// Normalize the direction.
float dp = 1 /(float)sqrt(xLookDirection * xLookDirection + yLookDirection * yLookDirection +
zLookDirection * zLookDirection);
xLookDirection *= dp;
yLookDirection *= dp;
zLookDirection *= dp;
// Calculate the new X position.
xNewLookDirection = (CosineAngle + (1 - CosineAngle) * xSpeed) * xLookDirection;
xNewLookDirection += ((1 - CosineAngle) * xSpeed * ySpeed - zSpeed * SineAngle)* yLookDirection;
xNewLookDirection += ((1 - CosineAngle) * xSpeed * zSpeed + ySpeed * SineAngle) * zLookDirection;
// Calculate the new Y position.
yNewLookDirection = ((1 - CosineAngle) * xSpeed * ySpeed + zSpeed * SineAngle) * xLookDirection;
yNewLookDirection += (CosineAngle + (1 - CosineAngle) * ySpeed) * yLookDirection;
yNewLookDirection += ((1 - CosineAngle) * ySpeed * zSpeed - xSpeed * SineAngle) * zLookDirection;
// Calculate the new Z position.
zNewLookDirection = ((1 - CosineAngle) * xSpeed * zSpeed - ySpeed * SineAngle) * xLookDirection;
zNewLookDirection += ((1 - CosineAngle) * ySpeed * zSpeed + xSpeed * SineAngle) * yLookDirection;
zNewLookDirection += (CosineAngle + (1 - CosineAngle) * zSpeed) * zLookDirection;
// Last we add the new rotations to the old view to correctly rotate the camera.
_up.x = _pos.x + xNewLookDirection;
_up.y = _pos.y + yNewLookDirection;
_up.z = _pos.z + zNewLookDirection;
}
[/Source]
void Camera::RotateByMouse(int mousePosX, int mousePosY, int midX, int midY)
{
float yDirection = 0.0f; // Direction angle.
float xDirection = 0.0f; // Direction angle.
float yRotation = 0.0f; // Rotation angle.
// If the mouseX and mouseY are at the middle of the screen then we can't rotate the view.
if((mousePosX == midX) && (mousePosY == midY))
return;
// Next we get the direction of each axis. We divide by 1000 to get a smaller value back.
yDirection = (float)((midX - mousePosX)) / 1000.0f;
//yRotation = (float)((midY - mousePosY)) / 500.0f;
//xDirection = (float)((midY - mousePosY)) / 1000.0f;
// We use curentRotX to help use keep the camera from rotating too far in either direction.
_look.x -= yDirection;
//_look.y -= xDirection;
/*
// Stop the camera from going to high...
if(_look.x > 1.0f)
{
_look.x = 1.0f;
return;
}
// Stop the camera from going to low...
if(_look.x < -1.0f)
{
_look.x = -1.0f;
return;
*/
// Next we get the axis which is a perpendicular vector of the view direction and up values.
// We use the cross product of that to get the axis then we normalize it.
float xAxis = 0, yAxis = 0, zAxis = 0;
float xDir = 0, yDir = 0, zDir = 0;
// Get the Direction of the view.
xDir = _pos.x - _look.x;
yDir = _pos.y - _look.y;
zDir = _pos.z - _look.z;
// Get the cross product of the direction and the up.
xAxis = (yDir * _up.z) - (zDir * _up.y);
yAxis = (zDir * _up.x) - (xDir * _up.z);
zAxis = (xDir * _up.y) - (yDir * _up.x);
// Normalize it.
float len = 1 /(float)sqrt(xAxis * xAxis + yAxis * yAxis + zAxis * zAxis);
xAxis *= len;
yAxis *= len;
zAxis *= len;
// Rotate the camera.
//RotateCamera(-xDirection, xAxis, yAxis, zAxis);
RotateCamera(-yDirection, 0, 0, 0);
}
[/Source]