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

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

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

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

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

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

Рейтинг@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 контексты в этих подокнах.