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

Вход на сайт

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

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

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

КРУГОВОЙ ФРАКТАЛ -ОШИБОЧНАЯ ПРОГРАММА! ПАПА ЗибЕрт
Можешь обяснить подробно что как работает, и почему массу не задаем
Здравствуйте, Ильгиз. Математика - царица наук (Карл Гаусс). Изучение математики начинается с детского сада, когда нас учат считать и выполнять простые арифметические операции. Любой, даже самый простейший алгоритм будет связан с арифметическими...
Я хотел узнать математика это обязательно в программирование. Пять лет назад просто из любопытства я увлекся HTML потом изучил CSS и JvaScript потом изучил PHP и Java. Как то не задумывался и начал смотреть форумы и узнал что без математики не...
Все верно, но так же необходимо зайти в: Компоновщик -> Ввод -> Дополнительные зависимости Здесь необходимо нажать изменить и в Дополнительные зависимости прописать это: SDL2.lib SDL2main.lib SDL2test.lib Без этого не заработает. (MVS 2015)

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

Яндекс.Метрика Рейтинг@Mail.ru
http://www.remontnik.ru/moskva/stroitelstvo_bassejnov/ строительство бассейна.
Среда программирования: 
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 контексты в этих подокнах.