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

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

Построения
на плоскости (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

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

void glutPositionWindow(int x, int y);
void glutReshapeWindow(int width, int height);

Параметры:

х, у - в верхнем левом углу окна.
width, height - размеры окна в пикселях.

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

void glutSetWindow(int windowIdentifier);

Параметры:

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

Если мы хотим знать, какое окно активное, мы можем использовать функцию glutGetWindow.

int glutGetWindow();

Возвращаемое значение этой функции является идентификатор текущего окна.

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

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

int w,h, border=6;
...
void setProjection(int w1, int h1)
{
	float ratio;
	// Предотвращение деления на ноль, когда окно слишком короткое
	// (вы не можете сделать окно нулевой ширины).
	ratio = 1.0f * w1 / h1;
	//Сброс системы координат перед изменением
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
 
	// Установить область просмотра
        glViewport(0, 0, w1, h1);
 
	// Установить объем отсечения
	gluPerspective(45,ratio,0.1,1000);
	glMatrixMode(GL_MODELVIEW);
}
 
void changeSize(int w1,int h1) {
 
	if(h1 == 0)
		h1 = 1;
 
	// сохраним эти значения дают они нам понадобятся позже
	w = w1;
	h = h1;
 
	// установить подокно 1 как активное окно
	glutSetWindow(subWindow1);
	// изменяем размер и положение дополнительного окна
	glutPositionWindow(border,border);
	glutReshapeWindow(w-2*border, h/2 - border*3/2);
	setProjection(w-2*border, h/2 - border*3/2);
 
	// установить подокно 2 как активное окно
	glutSetWindow(subWindow2);
	// изменяем размер и положение дополнительного окна
	glutPositionWindow(border,(h+border)/2);
	glutReshapeWindow(w/2-border*3/2, h/2 - border*3/2);
	setProjection(w/2-border*3/2,h/2 - border*3/2);
 
	// установить подокно 3 как активное окно
	glutSetWindow(subWindow3);
	// изменяем размер и положение дополнительного окна
	glutPositionWindow((w+border)/2,(h+border)/2);
	glutReshapeWindow(w/2-border*3/2,h/2 - border*3/2);
	setProjection(w/2-border*3/2,h/2 - border*3/2);
}

Продолжение в следующем уроке