Search code examples
opengltransformationmatrix-multiplicationglrotate

OpenGL 2D rotation problem


In the following program i am trying to draw a simple house. The coordinates are defined in the house array. I need to rotate the house and display both rotated as well as the original house. But why is the rotated house not being displayed?

    //Program to create a house like figure and rotate ir about a given fixed point using OpenGL functions.
#include <glut.h>
#include <stdio.h>

float house [11][2] = {{100,200},{200,250},{300,200},{100,200},{100,100},{175,100},{175,150},{225,150},{225,100},{300,100},{300,200}};

void init()
{
    glClearColor(1,1,1,0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0,800,0,800);
    glMatrixMode(GL_MODELVIEW);
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);

    //NORMAL HOUSE
    glColor3f(1,0,0);
    glBegin(GL_LINE_LOOP);

    for(int i=0;i<11;i++)
        glVertex2fv(house[i]);
    glEnd();
    glFlush();


    //ROTATED HOUSE
    glPushMatrix();
    glRotatef(60,0,1,0);
    glColor3f(1,1,0);
    glBegin(GL_LINE_LOOP);

    for(int i=0;i<11;i++)
        glVertex2fv(house[i]);
    glEnd();
    glFlush();
    glPopMatrix();
}

void main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800,800);
    glutInitWindowPosition(100,100);
    glutCreateWindow("House rotation");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
}

Solution

  • Try rotating on the Z axis instead of the Y axis:

    //Program to create a house like figure and rotate ir about a given fixed point using OpenGL functions.
    #include <GL/glut.h>
    
    float house [11][2] = {{100,200},{200,250},{300,200},{100,200},{100,100},{175,100},{175,150},{225,150},{225,100},{300,100},{300,200}};
    
    void display()
    {
        glClearColor(1,1,1,0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0,800,0,800);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
        //NORMAL HOUSE
        glColor3f(1,0,0);
        glBegin(GL_LINE_LOOP);
        for(int i=0;i<11;i++)
            glVertex2fv(house[i]);
        glEnd();
    
    
        //ROTATED HOUSE
        glPushMatrix();
        glTranslatef(100,100,0);
        glRotatef(60,0,0,1);
        glTranslatef(-100,-100,0);
        glColor3f(1,1,0);
        glBegin(GL_LINE_LOOP);
        for(int i=0;i<11;i++)
            glVertex2fv(house[i]);
        glEnd();
        glPopMatrix();
    }
    
    void main(int argc,char** argv)
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowSize(800,800);
        glutInitWindowPosition(100,100);
        glutCreateWindow("House rotation");
        glutDisplayFunc(display);
        glutMainLoop();
    }
    

    EDIT: This one should rotate around the bottom corner.