I'm trying to code a camera with glTranslate/glRotate. To implement the look-up / look-down functions I need all the objects in my rendering space to rotate around a point (that is, where the "camera" is at), point which usually differs from the origin. Still, things keep rotating around the origin. Is there a way to specify a different point?
EDIT: Added code
Thanks for your fast reply. It seems that I can't get it working right no matter what, so I've decided to add my code; I'd much appreciate if someone could take a look at it and tell me what changes are needed in order to translate/rotate/translate back.
#include <iostream> #include <cmath> #include <GLUT/GLUT.h> const double roaming_step = .13; double z_offset = .0; double y_offset = .0; double x_offset = .0; const double angle_step = 1.5; double angle_xz = .0; double angle_yz = .0; bool keyStates[256] = { false }; void drawFloor() { glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glVertex3f(-3.0, -1.0, 3.0); glVertex3f(-3.0, -1.0, -3.0); glVertex3f(3.0, -1.0, -3.0); glVertex3f(3.0, -1.0, 3.0); glEnd(); } void drawBalls() { glTranslatef(-3.0, -.5, -3.0); glColor3f(.8, .1, .1); for(int i = 0; i < 3; i++) { glPushMatrix(); glTranslatef(.0, -.5, i * 3); for(int j = 0; j < 3; j++) { glPushMatrix(); glTranslatef(j * 3, .0, .0); glutSolidSphere(.5, 20, 20); glPopMatrix(); } glPopMatrix(); } } void keyPressed(unsigned char key, int x, int y) { keyStates[key] = true; } void keyReleased(unsigned char key, int x, int y) { keyStates[key] = false; } void keyboardOperations() { if(keyStates['w']) z_offset += roaming_step; if(keyStates['s']) z_offset -= roaming_step; if(keyStates['a']) x_offset += roaming_step; if(keyStates['d']) x_offset -= roaming_step; if(keyStates['i']) { angle_xz -= angle_step; if(angle_xz < .0) angle_xz += 360.0; } if(keyStates['o']) { angle_xz += angle_step; if(angle_xz >= 360.0) angle_xz -= 360.0; } if(keyStates['u']) { angle_yz -= angle_step; if(angle_yz < .0) angle_yz += 360.0; } if(keyStates['j']) { angle_yz += angle_step; if(angle_yz >= 360.0) angle_yz -= 360.0; } if(keyStates['q']) exit(0); } // I guess it has to be done in this function // but didn't get how void camera() { glLoadIdentity(); // Forward / Backward glTranslated(.0, .0, z_offset); // Left / Right glTranslated(x_offset, .0, .0); // XZ Rotation glRotated(angle_xz, .0, 1.0, .0); // YZ Rotation glRotated(angle_yz, 1.0, .0, .0); } void display(void) { keyboardOperations(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); camera(); drawFloor(); drawBalls(); glutSwapBuffers(); } void reshape(int width, int height) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, width, height); GLdouble aspect = (GLdouble) width / (GLdouble) height; gluPerspective(60, aspect, 1, 100); glMatrixMode(GL_MODELVIEW); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowPosition(0, 0); glutCreateWindow("openGLtest3"); glClearColor(.0, .0, .0, .0); glEnable(GL_DEPTH_TEST); glShadeModel(GL_FLAT); glutDisplayFunc(display); glutReshapeFunc(reshape); glutIdleFunc(display); glutIgnoreKeyRepeat(true); glutKeyboardFunc(keyPressed); glutKeyboardUpFunc(keyReleased); glutMainLoop(); return 0; }