Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Пиривет сайт с работой закладчиком Работа курьером Значение финансов в повседневной жизни известно каждому, но что делать, если зарплата на постоянной работе невелика или ее вообще нет? Если у Вас нет профессии или возникли иные сложности, то...
Модные тренды медицинской одежды - новая эра стиля и комфорта в 2024 году https://fkmed.r... C нами Вы убедитесь: качественная, комфортная и модная медицинская одежда существует! В каталоге на сайте представлена медицинская одежда для врачей и...
14 070 руб https://www.eco... 38 900 руб https://www.eco... и выберите из списка ниже: Купить в 1 клик https://www.eco... По типу двигателя снегоотбрасыватель может быть: Купить в 1 клик https://www.eco...
Все изделия хорошо сидят на фигуре и отличаются высокой степенью комфортности https://fkmed.r... Комбинированные ткани с применением хлопка и синтетики - это оптимальный вариант для пошива формы https://fkmed.r... Специальная пропитка...
53 990 руб https://www.eco... Экономия 4 160 руб https://www.eco... Купить в 1 клик https://www.eco... Главными элементами устройства являются двигатель, металлический или пластиковый корпус и лопасти для уборки снега https://www.eco... Тип...

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
Visual C

Создание и уничтожение вложенных окон

С GLUT мы можем работать с подокнами, т.е. разделить главное окно в различных регионах, каждый со своим собственным контекстом OpenGL и обратными вызовами. Одним из возможных применений является предоставление нескольких видов одной и той же сцены одновременно.

Для того чтобы создать дочернее окно мы используем функцию glutCreateSubWindow со следующим синтаксисом:

int glutCreateSubWindow(int parentWindow, int x, int y, int width, int height);

Параметры:

parentwindow – идентификатор родительского окна.
x, y – верхний левый угол вспомогательного окна, относительно родительского окна.
width, height – размеры подокна.

Идентификатор родительского окна является возвращаемым значением, полученным при создании родительского окна. Следующий код демонстрирует эту связь:

mainWindow = glutCreateWindow("Урок 14");
	...
	subWindow1 = glutCreateSubWindow(mainWindow, 10,10,100,100);

Дочернее окно также может быть родительским окном для других подчиненных окон. Подокна могут быть вложенными произвольным образом.

Как упоминалось ранее дочернее окно имеет свой собственный контекст OpenGL, так что, например, если мы используем "Vertex Buffer Object(VBO)" мы должны будем создавать его для каждого окна и дополнительных окон, который мы хотим создать. То же самое относится к большинству функций обратного вызова.

По крайней мере, мы должны зарегистрировать функцию отображения для каждого окна, которую мы создаём с использованием glutDisplayFunc. Для каждого окна, мы должны также зарегистрировать функции обратного вызова для управления курсором мыши и обработки нажатий, если мы хотим использовать эти возможности. Всплывающие меню также назначаются для конкретного окна. Заметим, однако, что есть только одна не работающая функция.

Допустим, нам необходимо создать установку с тремя видами. Один для основной камеры, другой с видом от верха, в центре которой основная камера, а третий со стороны, снова сосредоточено на основной камеры.

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

int mainWindow, subWindow1,subWindow2,subWindow3;
...
void init() {
 
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);
 
	//регистрация вызовов
	glutIgnoreKeyRepeat(1);
	glutKeyboardFunc(processNormalKeys);
	glutSpecialFunc(pressKey);
	glutSpecialUpFunc(releaseKey);
	glutMouseFunc(mouseButton);
	glutMotionFunc(mouseMove);
}
 
int main(int argc, char **argv) {
 
	// инициализация GLUT и создание окна
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(800,800);
	mainWindow = glutCreateWindow("Урок 14");
 
	// регистрация вызовов для главного окна
	glutDisplayFunc(renderScene);
	glutReshapeFunc(changeSize);
	glutIdleFunc(renderSceneAll);
	init();
 
	//дочерние окна
	subWindow1 = glutCreateSubWindow(mainWindow, border,border,w-2*border, h/2 - border*3/2);
	glutDisplayFunc(renderScenesw1);
	init();
 
	subWindow2 = glutCreateSubWindow(mainWindow, border,(h+border)/2,w/2-border*3/2, h/2 - border*3/2);
	glutDisplayFunc(renderScenesw2);
	init();
 
	subWindow3 = glutCreateSubWindow(mainWindow, (w+border)/2,(h+border)/2,w/2-border*3/2,h/2 - border*3/2);
	glutDisplayFunc(renderScenesw3);
	init();
 
	// главный цикл
	glutMainLoop();
 
	return 1;
}

Приведенный выше код создает три подчиненных окна. Каждое дочернее окно используется для представления различных точек зрения одной и той же сцены. Верхнее окно - подокно, показывает свободную движущейся камерой, в левом нижнем углу вид сверху, а нижний правый вид с правого бока.

При создании нового окна, либо из главного окна, или дочернего окна, оно становится текущим окном. Все обратные вызовы являются зарегистрированными относительно текущего окна, за исключением glutIdleFunc(), что, как упоминалось ранее является уникальным для данного приложения.

Обратите внимание, что мы действительно вызывали initScene для всех подчиненных окон для инициализации контекста OpenGL для дополнительного окна. Также обратите внимание, что мы зарегистрировали модифицирующую функцию один раз только для главного окна.

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

void glutDestroyWindow(int windowIdentifier);

Параметры:

windowIdentifier – значения, возвращаемое при создании окна.

Эта функция уничтожает окно, любые подокна, которые оно содержит и все OpenGL контексты в этих подокнах.