0

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; } 

1 Answer 1

2

In openGL, glRotation fuction takes origin as a reference. In order to rotate around a point (your camera coordinate in this case) you should translate your camera position to the origin (Translate all your objects accordingly) and then apply rotation function.And then you can translate your camera back (with all your objects)

lets say your camera position is (a,b,c) so your code should be something like :

foreach object { glPushMatrix(); glTranslate(a,b,c); glRotate(...); glTranslate(-a,-b,-c); //render glPopMatrix(); } 
Sign up to request clarification or add additional context in comments.

2 Comments

I added some code, could you please take a look at it?
This is the wrong order of transformations. See this for the correct order: stackoverflow.com/questions/23442499/….

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.