Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rotating in OpenGL relative to the viewport

I'm trying to display an object in the view which can be rotated naturally by dragging the cursor/touchscreen. At the moment I've got X and Y rotation of an object like this

glRotatef(rotateX, 0f, 1f, 0f); // Dragging along X, so spin around Y axis
glRotatef(rotateY, 1f, 0f, 0f);

I understand why this doesn't do what I want it to do (e.g. if you spin it right 180 degrees, up and down spinning gets reversed). I just can't figure out a way for both directions to stay left-right and up-down relative to the viewer.

I can assume that the camera is fixed and looking along the Z axis. Any ideas?

like image 408
Nick Avatar asked May 03 '10 13:05

Nick


2 Answers

Your best bet is to implement a Quaternion-based rotation. In the Quaternion world, every time you rotate, it will be axis-aligned to the axis you specify, without being affected by the previous rotations. This is also why it doesn't suffer from Gimbal Lock.

I've found these pages helpful for implementing quaternions:

  • http://en.wikipedia.org/wiki/Quaternion
  • http://www.cprogramming.com/tutorial/3d/quaternions.html
  • http://www.gamedev.net/reference/articles/article1095.asp

Good luck. I'm sure there are other solutions, but this one is one of the cleanest you can have.

like image 179
Xavier Ho Avatar answered Oct 11 '22 12:10

Xavier Ho


Solved it! Add xAngle and yAngle to the current matrix.

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]);
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]);
gl.glMultMatrixf(matrix, 0);
like image 39
Kyle Avatar answered Oct 11 '22 12:10

Kyle