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

Вход на сайт

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

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

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

Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)
как исправить это , сделал все по инструкции
Timer1 - выдает ошибку. Использовал IdleTimer1, работает! unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 =...
в коде присутствуют ошибки! // Считываем координаты procedure TForm1.getCoords(Sender: TObject); var j1:longint; begin n:= StrToInt(Edit2.Text); //число точек s1:=Edit1.Text; s2:=''; i := 1; j:=1; k:=0...

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

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