Проблема с поворотом OpenGL 2D

#opengl #transformation #matrix-multiplication #glrotate

#opengl #преобразование #матрица-умножение #glrotate

Вопрос:

В следующей программе я пытаюсь нарисовать простой дом. Координаты определены в массиве house. Мне нужно повернуть дом и отобразить как повернутый, так и исходный дом. Но почему не отображается повернутый дом?

     //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(amp;argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800,800);
    glutInitWindowPosition(100,100);
    glutCreateWindow("House rotation");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
}
  

Ответ №1:

Попробуйте вращаться по оси Z вместо оси Y:

 //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(amp;argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800,800);
    glutInitWindowPosition(100,100);
    glutCreateWindow("House rotation");
    glutDisplayFunc(display);
    glutMainLoop();
}
  

РЕДАКТИРОВАТЬ: Этот должен поворачиваться вокруг нижнего угла.

Комментарии:

1. Вышеуказанная модификация отображает выходные данные. Но это не поворачивает дом вокруг его нижнего левого угла, который равен 100,100. Итак, я попробовал это: glTranslatef (-100,-100,0); glRotatef (30,0,0,1); glTranslatef (100,100,0); Но все еще это не работает. Почему?

2. @footy: Отредактировано. Похоже, что эти преобразования были в неправильном порядке.