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

Вход на сайт

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

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

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

Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...
Комментарии на английском переведите на русский. Дополните код комментариями, чтоб было понятно как работает алгоритм
Пример, к которому вы оставили комментарий строит именно то самое изображение на языке с#, которое вам необходимо. Отличается только цветовая палитра.

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

Рейтинг@Mail.ru
http://dikito.ru/ concept концепт косметика для волос.
Среда программирования: 
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);
}

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