Решено: вопрос по функциям opengl (странное поведение при изменениии размеров окна)

Модератор: Модераторы разделов

Аватара пользователя
S7a1k3r
Сообщения: 159
Статус: Белгородский LUG
ОС: Arch Linux

Решено: вопрос по функциям opengl

Сообщение S7a1k3r »

доброго времени суток
Столкнулся с такой проблемой: есть исходник из книги

Код:

#include <GL/glut.h> #include <math.h> #include <stdlib.h> const double TWO_PI = 6.2831853; GLsizei winWidth = 400, winHeight = 400; GLuint regHex; static void init(void){ GLint xhexVertex = 0, yhexVertex = 0; GLint xcircCtr = 0, ycircCtr = 0; GLdouble theta; GLint k; xcircCtr = winWidth /2; ycircCtr = winHeight /2; glClearColor(1.0, 1.0, 1.0, 0.0); regHex = glGenLists(1); glNewList(regHex, GL_COMPILE); glColor3f(1.0, 0.0, 0.0); glBegin(GL_POLYGON); for(k = 0; k < 6; k++){ theta = TWO_PI*k/6.0; xhexVertex = xcircCtr + 150 * cos(theta); yhexVertex = ycircCtr + 150 * sin(theta); glVertex2i(xhexVertex, yhexVertex); } glEnd(); glEndList(); } void regHexagon(void){ glClear(GL_COLOR_BUFFER_BIT); glCallList(regHex); glFlush(); } void winReshapeFunc(GLint newWidth, GLint newHeight){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble) newWidth, 0.0, (GLdouble) newHeight); glClear(GL_COLOR_BUFFER_BIT); } int main(int argc, char **argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("0003"); init(); glutDisplayFunc(regHexagon); glutReshapeFunc(winReshapeFunc); glutMainLoop(); }


который отображает на экране правильный шестиугольник.
А проблема вот в чем:
при увеличении размеров окна рисунок уменьшается, а при уменьшении - увеличивается.
Хотелось бы узнать, в чем причина столь странного поведения.
Заранее спасибо.
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Решено: вопрос по функциям opengl

Сообщение d_n_k »

http://opengl.org.ru:8000/coding/glut/glut2.html
void glutReshapeFunc(void (*func)(int width, int height));

Единственный параметр - это указатель на функцию, отвечающую за изменение размеров окна, которая как видно должна принимать два параметра width и height, соответственно ширина и высота нового (измененного) окна.


дальше читай доки по командам opengl и думай что ж такого странного делается в твоей функции winReshapeFunc
все сказанное есть имхо...
Спасибо сказали:
Аватара пользователя
amaora
Сообщения: 95
ОС: Slackware

Re: Решено: вопрос по функциям opengl

Сообщение amaora »

вот это,
gluOrtho2D(0.0, (GLdouble) newWidth, 0.0, (GLdouble) newHeight);
меняем на это,
gluOrtho2D(0.0, (GLdouble) 400, 0.0, (GLdouble) 400);
и проекция перестанет зависеть от размера области вывода/окна

а вообще обычно надо виевпорт заново выставлять а не проекцию в таких случаях.
кто здесь?
Спасибо сказали:
Аватара пользователя
S7a1k3r
Сообщения: 159
Статус: Белгородский LUG
ОС: Arch Linux

Re: Решено: вопрос по функциям opengl

Сообщение S7a1k3r »

amaora писал(а):
05.07.2007 00:52
вот это,
gluOrtho2D(0.0, (GLdouble) newWidth, 0.0, (GLdouble) newHeight);
меняем на это,
gluOrtho2D(0.0, (GLdouble) 400, 0.0, (GLdouble) 400);
и проекция перестанет зависеть от размера области вывода/окна

а вообще обычно надо виевпорт заново выставлять а не проекцию в таких случаях.

Спасибо. Разобрался. Изменил код winReshapeFunc на следующий

Код: Выделить всё

void winReshapeFunc(GLint newWidth, GLint newHeight){
    glViewport(0, 0, (GLsizei) newWidth, (GLsizei) newHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, winWidth, 0.0, winHeight);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

Теперь все работает как надо.

Оффтопик: увы, я не ожидал от рекомендованного мне издания такого подвоха. :(
Все примеры, приведенные в книге обладают досадными недочетами. Вероятно, чтоб освоили лучше
Спасибо сказали: