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

Вход на сайт

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

Построения
на плоскости (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
Среда программирования: 
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);
}

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