Rotation around a pivot point with OpenGL
The problem comes from the
glTranslatef(0, 0, -10.0);
you're calling after the rotation. That means the (0,0,-10) is applied to the object coordinates (+-50,+-50,0) before they are transformed by anything else, so the quad is offset before it's being rotated.
Here's the code I used for testing, maybe you get something out of it:
#include <glm/glm.hpp>
#include <glm/ext.hpp>
using namespace glm;
void display(void)
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLfloat aspect = (float)g_Width / g_Height;
mat4 eyeToCamera = perspective(45.f, aspect, g_nearPlane, g_farPlane); // projection
mat4 cameraToWorld = lookAt(vec3(0, 0, -150), vec3(), vec3(0, 1, 0)); // view
vec3 pivot(50, -50, 0);
mat4 worldToObject = translate(pivot)
* rotate(rotationAngle, vec3(0, 1, 0))
* translate(-pivot); // model
glLoadMatrixf(value_ptr(eyeToCamera * cameraToWorld * worldToObject));
glBegin(GL_QUADS);
glVertex3f(-50.0, 50.0, 0);
glVertex3f(50.0, 50.0, 0);
glVertex3f(50.0, -50.0, 0);
glVertex3f(-50.0, -50.0, 0);
glEnd();
glutSwapBuffers();
}
Note that I don't use any matrix stack functions, and I only set the GL_MODELVIEW matrix.
Related videos on Youtube
user1240679
Updated on September 14, 2022Comments
-
user1240679 over 1 year
I am trying to rotate an object about one of its side and already tried the common approach as found on the forums:
translate(-P); rotate(); translate(P);
In
OpenGL
(reversing the order of translations/rotations), I used the following code:glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glTranslatef(-50, 50, 0); glRotatef(rotationCoord, 0, 1, 0); glTranslatef(50, -50, 0); glBegin(GL_QUADS); glVertex3f(-50.0, 50.0, 0); glVertex3f(50.0, 50.0, 0); glVertex3f(50.0, -50.0, 0); glVertex3f(-50.0, -50.0, 0); glEnd(); glPopMatrix();
However, the rectangle that I am drawing doesn't seem to be rotating around one side as pivot. (trying to set the left side as the pivot point and rotate around it). I made a screen capture vid to show what kind of rotation I am getting right now. Here's the video:
How do I set the pivot for this object so that it rotated around that point?
-
user1240679 almost 11 yearsI needed to translate the translate the back by
-10
first because I have the projection matrix applied as above (which is needed for one of my subsequent operations that is to come later). I tried reducing thez value
of the rectangle to change how far the rectangle is drawn and to see if that is creating a problem with the rotation. But even if the rectangle is at-0.1
, I still don't get a fixed pivot. Because of OpenGL's post-multiplication, that translate by-10
has to be there after rotation so as to make the rectangle fully visible inside the perspective projection. -
user1240679 almost 11 yearsI am not sure why that translate by
-10
is causing or how should I go around for fixed pivot with a rectangle still being shown in my perspective projection. -
Andreas Haferburg almost 11 years@user1240679 Put the
glTranslatef(0, 0, -10.0)
call before the rotation, i.e. directly after callingglPushMatrix
above. That way the translation is applied after the object is rotated. -
user1240679 almost 11 yearsSuperb! Thanks. A lil off-topic doubt to be cleared here. I have the vector positions of a rectangle (which is rotated in the real world - two Z vertices at Z=0, other two at Z=200). I want to get the rotation matrix from these vertices and apply it as I did above in my post (but instead of
glRotatef
will be usingglMultMatrix
). The question is here btw: stackoverflow.com/questions/17585424/… If you could just give a read to comments discussion below that would give the context. Thanks