#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: Отредактировано. Похоже, что эти преобразования были в неправильном порядке.