Студопедия — Связь между GLUT и вашей OpenGL программой
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Связь между GLUT и вашей OpenGL программой






Самой первой по значимости (без которой не обойтись ни в одной программе) идет функция отвечающая за перерисовку содержимого окна:

void glutDisplayFunc(void (*func)(void));

Эта функция устанавливает функцию в вашей программе, которая будет отвечать за перерисовку окна. Это нужно для того, что когда системе потребуется перерисовать ваше окно (например когда вы из свернутого состояния развернули окно), то она вызовет соответствующую функцию в вашей программе, которая ответственна за перерисовку содержимого окна. Также функция перерисовки окна вызывается при самом первом запуске вашего приложения. Отмечу, что если вы создаете окно в GLUT, то определять функцию перерисовки окна нужно обязательно! С другой стороны, вы сами можете заставить систему перерисовать окно, это нужно например тогда, когда вы изменили состояния объектов или изменили их внешность, то вам понадобится перерисовать содержимое окна, чтобы отобразить сделанные изменения. Поэтому в GLUT существует специальная функция glutPostRedisplay(), которая заставляет систему перерисовать текущее окно. Если вдруг вам захочется перерисовать не текущее окно, а какое-то другое, то предусмотрена следующая функция: glutPostWindowRedisplay(int win), которая перерисовывает содержимое win окна.

void glutReshapeFunc(void (*func)(int width, int height));

Как уже говорилось, это функция устанавливает другую функцию в вашей программе, которая будет ответственна за изменение размеров окна. Как только у окна изменились размеры, необходимо перестроить вывод графической информации уже в новое окно с другими размерами. Для этого в вызываемую функцию (т.е. функцию в вашей программе) передаются 2 параметра width и height, т.е. ширина и высота измененного окна. Обычно в самом начале функции, вызывается функция glViewport, например так: glViewport(0, 0, width, height), чтобы перестроить вывод изображения уже в окно с другими размерами.

Еще одна интересная функция, которая устанавливает функцию в вашей программе, которая будет вызываться системой всякий раз, когда окно становиться видимым или наоборот становиться невидимым.

void glutVisibilityFunc(void (*func)(int state));

Единственный параметр, который передается в вызываемую системой функцию: state. Сравнивая этот параметр с константами GLUT_NOT_VISIBLE и GLUT_VISIBLE можно определить, что произошло с окном, либо оно стало невидимым или наоборот - видимым.

void glutIdleFunc(void (*func)(void));

Функция, которая устанавливает функцию в вашей программе, которая будет вызываться системой всякий раз, когда ваше приложение простаивает, т.е. ничего не делает. Часто эту функцию используют для анимации.

Ну и последняя функция, которую мы рассмотрим:

void glutTimerFunc(unsigned int millis, void (*func)(int value), int value);

Эта функция устанавливает таймер. Первый параметр millis задает время в миллисекундах, по истечении которых вызывается функция, которая указана как второй параметр. Третий параметр value указывает индентификатор таймера, т.е. таймеров может быть одновременно запущено несколько. То же самое значение value есть и в функции, которая вызывается таймером. Это нужно для того, чтобы определить, какой таймер сработал, т.е. если ваша функция обрабатывает несколько таймеров.

Пример небольшой программки, которая рисует вращающуюся линию.

#include <stdio.h>

#include <GL/glut.h>

 

int WindW, WindH;

int i;

int alpha;

 

void Reshape(int width, int height) // Reshape function

{

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-1, 1, -1, 1);

glMatrixMode(GL_MODELVIEW);

 

WindW = width;

WindH = height;

}

 

void Draw(void) // Window redraw function

{

glClear(GL_COLOR_BUFFER_BIT);

 

glLineWidth(3);

glColor3f(0.0f, 0.6f, 0.9f);

 

glPushMatrix();

glRotatef(alpha, 0.0f, 0.0f, 1.0f);

alpha += 4;

if (alpha > 359) alpha = 0;

glBegin(GL_LINES);

glVertex2f(-0.5f, 0.5f);

glVertex2f(0.5f, -0.5f);

glEnd();

glPopMatrix();

 

glFlush();

glutSwapBuffers();

}

 

void Visibility(int state) // Visibility function

{

if (state == GLUT_NOT_VISIBLE) printf("Window not visible!\n");

if (state == GLUT_VISIBLE) printf("Window visible!\n");

}

 

void timf(int value) // Timer function

{

glutPostRedisplay(); // Redraw windows

glutTimerFunc(40, timf, 0); // Setup next timer

}

 

int main(int argc, char *argv[])

{

WindW = 400;

WindH = 300;

alpha = 0;

 

glutInit(&argc, argv);

glutInitWindowSize(WindW, WindH);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);

(void)glutCreateWindow("Romka Demo");

 

glutReshapeFunc(Reshape); // Set up reshape function

glutDisplayFunc(Draw); // Set up redisplay function

glutTimerFunc(40, timf, 0); // Set up timer for 40ms, about 25 fps

glutVisibilityFunc(Visibility); // Set up visibility funtion

glClearColor(0, 0, 0, 0);

 

glutMainLoop();

 

return 0;

}

 

Попробуйте свернуть окно, а потом развернуть и посмотрите на консоль, это сработала процедура Visibility.







Дата добавления: 2015-10-19; просмотров: 451. Нарушение авторских прав; Мы поможем в написании вашей работы!



Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

Законы Генри, Дальтона, Сеченова. Применение этих законов при лечении кессонной болезни, лечении в барокамере и исследовании электролитного состава крови Закон Генри: Количество газа, растворенного при данной температуре в определенном объеме жидкости, при равновесии прямо пропорциональны давлению газа...

Ганглиоблокаторы. Классификация. Механизм действия. Фармакодинамика. Применение.Побочные эфффекты Никотинчувствительные холинорецепторы (н-холинорецепторы) в основном локализованы на постсинаптических мембранах в синапсах скелетной мускулатуры...

Шов первичный, первично отсроченный, вторичный (показания) В зависимости от времени и условий наложения выделяют швы: 1) первичные...

Условия, необходимые для появления жизни История жизни и история Земли неотделимы друг от друга, так как именно в процессах развития нашей планеты как космического тела закладывались определенные физические и химические условия, необходимые для появления и развития жизни...

Метод архитекторов Этот метод является наиболее часто используемым и может применяться в трех модификациях: способ с двумя точками схода, способ с одной точкой схода, способ вертикальной плоскости и опущенного плана...

Примеры задач для самостоятельного решения. 1.Спрос и предложение на обеды в студенческой столовой описываются уравнениями: QD = 2400 – 100P; QS = 1000 + 250P   1.Спрос и предложение на обеды в студенческой столовой описываются уравнениями: QD = 2400 – 100P; QS = 1000 + 250P...

Studopedia.info - Студопедия - 2014-2024 год . (0.013 сек.) русская версия | украинская версия