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

Вход на сайт

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

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

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

Пиривет сайт с работой закладчиком Работа курьером Значение финансов в повседневной жизни известно каждому, но что делать, если зарплата на постоянной работе невелика или ее вообще нет? Если у Вас нет профессии или возникли иные сложности, то...
Модные тренды медицинской одежды - новая эра стиля и комфорта в 2024 году https://fkmed.r... C нами Вы убедитесь: качественная, комфортная и модная медицинская одежда существует! В каталоге на сайте представлена медицинская одежда для врачей и...
14 070 руб https://www.eco... 38 900 руб https://www.eco... и выберите из списка ниже: Купить в 1 клик https://www.eco... По типу двигателя снегоотбрасыватель может быть: Купить в 1 клик https://www.eco...
Все изделия хорошо сидят на фигуре и отличаются высокой степенью комфортности https://fkmed.r... Комбинированные ткани с применением хлопка и синтетики - это оптимальный вариант для пошива формы https://fkmed.r... Специальная пропитка...
53 990 руб https://www.eco... Экономия 4 160 руб https://www.eco... Купить в 1 клик https://www.eco... Главными элементами устройства являются двигатель, металлический или пластиковый корпус и лопасти для уборки снега https://www.eco... Тип...

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

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
Visual C

Данный урок основан на предыдущем уроке №1.
У нас есть окно OpenGL с белым треугольником. Мы будем его анимировать. Для анимации нужно задействовать двойную буферизацию. Функция glutIdleFunc позволяет зарегистрировать функцию обратного вызова, которая будет вызываться когда само приложение находится в режиме ожидания.

void glutIdleFunc(void (*func)(void));

Параметры:

*func - имя функции, которая будет вызываться всякий раз, когда приложение находится в режиме ожидания.

Итак, функция main теперь выглядит следующим образом:

int main(int argc, char **argv) {
 
	// инициализация
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(400,400);
	glutCreateWindow("Урок 3");
 
	// регистрация
	glutDisplayFunc(renderScene);
	glutReshapeFunc(changeSize);
 
	// новая функция для регистрации
	glutIdleFunc(renderScene);
 
	// основной цикл
	glutMainLoop();
 
	return 1;
}

Объявим переменную angle, и инициализировать его в 0.0. Затем мы добавляем необходимые значения в renderScene.

float angle = 0.0f;

void renderScene(void) {
	// очистка буфера цвета и глубины
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// обнуление трансформации
	glLoadIdentity();
	// установка камеры
	gluLookAt( 0.0f, 0.0f, 10.0f,
		   0.0f, 0.0f,  0.0f,
		   0.0f, 1.0f,  0.0f);
 
	glRotatef(angle, 0.0f, 1.0f, 0.0f);
 
	glBegin(GL_TRIANGLES);
		glVertex3f(-2.0f,-2.0f, 0.0f);
		glVertex3f( 0.0f, 2.0f, 0.0);
		glVertex3f( 2.0f,-2.0f, 0.0);
	glEnd();
 
	angle+=0.1f;
 
	glutSwapBuffers();
}

Замечание о двойной буферизации.
Как вы помните, мы устанавливаем режим отображения в main - режим двойной буферизации. Эта функция обеспечивает два буфера для отображения. первый показывается на экране, второй просчитывается, потом происходит смена буфера. и процесс обработки повторяется. GlutSwapBuffers вызывает смену переднего и заднего буферов, создавая эфект анимированного изображения. Синтаксис выглядит следующим образом:

void glutSwapBuffers();

Итоговый код:

#include <glut.h>
 
float angle = 0.0f;
 
void changeSize(int w, int h) {
	// предотвращение деления на ноль
	if (h == 0)
		h = 1;
	float ratio =  w * 1.0 / h;
	// используем матрицу проекции
	glMatrixMode(GL_PROJECTION);
	// обнуляем матрицу
	glLoadIdentity();
	// установить параметры вьюпорта
	glViewport(0, 0, w, h);
	// установить корректную перспективу
	gluPerspective(45.0f, ratio, 0.1f, 100.0f);
	// вернуться к матрице проекции
	glMatrixMode(GL_MODELVIEW);
}
 
void renderScene(void) {
	// очистка буфера цвета и глубины
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// обнуление трансформации
	glLoadIdentity();
	// установка камеры
	gluLookAt( 0.0f, 0.0f, 10.0f,
		   0.0f, 0.0f,  0.0f,
		   0.0f, 1.0f,  0.0f);
 
	glRotatef(angle, 0.0f, 1.0f, 0.0f);
 
	glBegin(GL_TRIANGLES);
		glVertex3f(-2.0f,-2.0f, 0.0f);
		glVertex3f( 0.0f, 2.0f, 0.0);
		glVertex3f( 2.0f,-2.0f, 0.0);
	glEnd();
 
	angle+=0.1f;
 
	glutSwapBuffers();
}
 
int main(int argc, char **argv) {
 
	// Инициализация GLUT и создание окна
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(400,400);
	glutCreateWindow("Урок 3");
 
	// регистрация
	glutDisplayFunc(renderScene);
	glutReshapeFunc(changeSize);
	glutIdleFunc(renderScene);
 
	// основной цикл
	glutMainLoop();
 
	return 1;
}

Результат работы программы: окно размером 400*400 пикселей с заголовком "Урок 3" и вращающимся треугольником.
Вращающийся треугольник