Search code examples
c++opengldrawingopengl-compat

OpenGL independent rotation


I'm trying to draw these shaped bellow this this:

What I want

Tried this code:

    glLoadIdentity();
    glColor3f(0.98f, 0.83f, 0.73f);
    glBegin(GL_POLYGON);
    for (float i = 0; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i)-10;
        y = 115 * sin(i)+270;
        glVertex2f(x, y);
    }
    glEnd();

    glRotatef(-135.0f, 0.0f, 0.0f, 1.0f);   
    glColor3f(1.0f, 0.83f, 0.0f);
    glBegin(GL_POLYGON);
    for (float i = p; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i) - 10;
        y = 115 * sin(i) + 270;
        glVertex2f(x, y);
    }

But this is what I get:

What I get

If I want to only use the glLoadIdentity and glRotatef for rotation, do you have any idea about how to fix it?

Note: I don't want to use push/pop or translation


Solution

  • You have to rotate the object around its center and move the rotated object to its position in the world. glRotatef rotates the vertices around (0, 0). Draw the object around (0, 0) and glTranslate to move the object to its position in the world:

    glTranslate(-10.0f, 270.0f, 0.0f);   
    glRotatef(-135.0f, 0.0f, 0.0f, 1.0f);   
        
    glColor3f(1.0f, 0.83f, 0.0f);
    glBegin(GL_POLYGON);
    for (float i = p; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i);
        y = 115 * sin(i);
        glVertex2f(x, y);
    }
    

    Note, the matrix operations like glRotate and glTranslate specify a new matrix and multiply the current matrix by the new matrix.


    If you are not allowed to use glTranslate, you have to rotate the translation vector (-10, 270) in the opposite direction. Use the trigonometric functions sin an cos to rotate the vector (see Rotation matrix). You need to invert the angle and convert it to Radians since the unit of sin and cos is Radian.

    float tx = -10.0f;   
    float ty = 270.0f;
    float angle = -135.0f;
    
    float inv_angle_rad = -angle * M_PI / 180.0f;
    float tx_rot = tx * cos(inv_angle_rad) - ty * sin(inv_angle_rad); 
    float ty_rot = tx * sin(inv_angle_rad) + ty * cos(inv_angle_rad);  
    
    glRotatef(angle, 0.0f, 0.0f, 1.0f);   
       
    glColor3f(1.0f, 0.83f, 0.0f);
    glBegin(GL_POLYGON);
    for (float i = p; i <= (2 * p); i += 0.001) {
        x = 100 * cos(i) + tx_rot;
        y = 115 * sin(i) + ty_rot;
        glVertex2f(x, y);
    }