Max Mister
Max Mister

Reputation: 129

Calculate position and rotation of camera with mouse events

My plan:

1. Calculate mouse direction [x, y] [success]

I my Mouse Move event:

int directionX = lastPosition.x - position.x;
int directionY = lastPosition.y - position.y;

2. Calculate angles [theta, phi] [success]

float theta = fmod(lastTheta + sensibility * directionY, M_PI);
float phi = fmod(lastPhi + sensibility * directionX * -1, M_PI * 2);

Edit {

bug fix:

float theta = lastTheta + sensibility * directionY * -1;
if (theta < M_PI / -2)theta = M_PI / -2;
else if (theta > M_PI / 2)theta = M_PI / 2;

float phi = fmod(lastPhi + sensibility * directionX * -1, M_PI * 2);

}

Now I have given theta, phi, the centerpoint and the radius and I want to calculate the position and the rotation [that the camera look at the centerpoint]

3. Calculate position coordinates [X,Y,Z] [failed]

float newX = radius * sin(phi) * cos(theta);
float newY = radius * sin(phi) * sin(theta);
float newZ = radius * cos(phi);

Solution [by meowgoesthedog]:

float newX = radius * cos(theta) * cos(phi);
float newY = radius * sin(theta);
float newZ = radius * cos(theta) * sin(phi);

4. Calculate rotation [failed]

float pitch = ?;
float yaw = ?;

Solution [by meowgoesthedog]:

float pitch = -theta;
float yaw = -phi;

Thanks for your solutions!

Upvotes: 4

Views: 1501

Answers (1)

meowgoesthedog
meowgoesthedog

Reputation: 15035

Your attempt was almost (kinda) correct:

  • As the diagram shows, in OpenGL the "vertical" direction is conventionally taken to be Y, whereas your formulas assume it is Z

  • phi and theta are in the wrong order

  • Very simple conversion: yaw = -phi, pitch = -theta (from the perspective of the camera)

Fixed formulas:

float position_X = radius * cos(theta) * cos(phi);
float position_Y = radius * sin(theta);
float position_Z = radius * cos(theta) * sin(phi);

(There may also be some sign issues with the mouse deltas but they should be easy to fix.)

Upvotes: 2

Related Questions