на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Использование OpenGL
p align="left">«include <X11/Xlib.h> «include <GL/glx.h>

В операционной системе Microsoft Windows для подключения подпрограмм WGL следует добавить к вашему программному коду следующую строку:

«include <windows.h>

(и строку

#include <GL/glaux.h>

если вам нужны расширенные возможности OpenGL. Примечание научн. редактора.)

Если вы используете библиотеку GLUT для управления задачами оконного менеджера, то необходимо будет включить следующую строку:

#include <GL/glut.h>

Большинство OpenGL-приложений также используют системные вызовы для стандартной библиотеки языка программирования С, поэтому обычно следует включать заголовочные файлы, не связанные с обработкой графики (если вы программируете консольное \Ут32-приложение на языке программирования С/С-н-- прим. научн. ред.), такие как:

#include <stdlib.h> #include <stdio.h>

2.3 GLUT, инструментарий утилит библиотеки OpenGL

2.3.1. Инструментарий библиотек

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

Кроме того, поскольку состав команд рисования в библиотеке OpenGL ограничен только командами, которые генерируют простые геометрические примитивы (точки, линии и многоугольники), библиотека GLUT включает несколько подпрограмм, создающих более сложные трехмерные объекты, такие как сфера, тор и чайник. Таким образом, можно получить для просмотра достаточно интересные кадры вывода программы. (Обратите внимание на то, что Библиотека утилит OpenGL, GLU, также имеет в своем составе подпрограммы построения двумерных поверхностей, которые создают некоторые трехмерные объекты, такие же, как и те, которые создает инструментарий GLUT, в том числе сферу, цилиндр или конус.)

Инструментарий GLUT может быть не достаточным для полнофункциональных OpenGL-приложений, но он может оказаться хорошей отправной точкой для изучения OpenGL. Остальная часть настоящего раздела кратко описывает небольшое подмножество подпрограмм библиотеки GLUT таким образом, чтобы вы смогли разобраться с примерами программирования в остальной части данной книги.

2.3.2 Управление окнами

Пять подпрограмм инструментария GLUT выполняют задачи, необходимые для того, чтобы инициализировать окно.

Подпрограмма glutlnit(int *argc, char **argv) инициализирует библиотеку GLUT иобрабатывает любые аргументы командной строки (для оболочки X WindowSystem это могли бы быть такие опции, как -display и -geometry). Подпрограмма glutlnit() должна быть вызвана перед любой другой подпрограммой библиотеки GLUT.

Подпрограмма glutInitDisplayMode(unsigned int mode) определяет, какую цветовую модель следует использовать: режим RGBA или режим индексации цвета. Можно также определить, хотите ли вы работать с буфером кадра окна с одинарной или с двойной буферизацией. (Если вы работаете в режиме индексации цвета, то вы, возможно, захотите загрузить некоторые цвета в таблицу компонентов цвета; для того чтобы сделать это, воспользуйтесь командой glutSetColor().) Наконец, можно использовать эту подпрограмму для того, чтобы указать, что вы хотите связать с данным окном буферы глубины, трафарета и/или буфер-накопитель. Например, если вы хотите использовать окно с двойной буферизацией, цветовой моделью RGBA и буфером глубины, то для этого можно вызвать рассматриваемую подпрограмму со следующими параметрами: g\utlnitmsv\&yMote{GLUT_DOUBLE\ GLUT^RGB \ GLUTJ)EPTH).

Подпрограмма glutInitWindowPosition(int х, int у) определяет местоположение левого верхнего угла создаваемого окна на экране монитора.

Подпрограмма glutInitWindowSize(int width, int size) определяет размер создаваемого окна в пикселях.

Подпрограмма int glutCreateWindow(char *string) создает окно с контекстомOpenGL. Эта подпрограмма возвращает уникальный идентификатор для нового окна. Имейте в виду: до тех пор, пока вызывается подпрограмма glutMainLoopO, это окно еще не отображается на экране.

2.3.3 Функция обратного вызова отображения

Подпрограмма gIutDisplayFunc(void (*/«nc)(void)) представляет собой первую и наиболее важную функцию обратного вызова по событию, с которой вам предстоит столкнуться. Всякий раз, когда библиотека GLUT определяет, что содержимое данного окна должно быть восстановлено, выполняется функция обратного вызова, зарегистрированная подпрограммой glutDisplayFunc(). Поэтому вы должны поместить все подпрограммы, которые необходимы для перерисовки сцены, в данную функцию обратного вызова отображения.

Если ваша программа изменяет содержимое окна, то иногда вы должны будете вызывать подпрограмму glutPostRedisplay(void), которая вынуждает подпрограмму glutMainLoopO вызывать зарегистрированную функцию обратного вызова отображения при следующем удобном случае.

2.3.4. Исполнение программы

Самое последнее, что вы должны сделать, это вызвать подпрограмму glutMainLoop(void). При этом отображаются все окна, которые были созданы, и в этих окнах теперь работает визуализация. Начинается обработка событий, и вызывается зарегистрированная функция обратного вызова отображения. Войдя однажды в этот цикл, из него не выходят никогда!

Пример 2 демонстрирует, как можно было бы воспользоваться инструментарием GLUT, чтобы создать простую программу, показанную ранее в примере 1. Обратите внимание на реструктурирование программного кода. Для того чтобы сделать эффективность программы максимальной, все операции, которые должны вызываться однократно (установка цвета фона и системы координат), теперь включены в состав процедуры, названной init(). Операции, необходимые для визуализации (и, возможно, для повторной визуализации) сцены, включены в состав процедуры display(), которая представляет собой зарегистрированную функцию обратного вызова отображения библиотеки GLUT.

Пример 2 Простая программа OpenGL, использующая инструментарий GLUT: hello.c

#include <GL/glut.h> #include <stdlib.h>

void display(void)

/* Очистить все пиксели */

glClear(GL_COLOR_BUFFER_BIT);

/* нарисовать белый многоугольник (прямоугольник) с углами,

расположенными в точках с координатами (0.25, 0.25, 0.0)

и (0.75, 0.75, 0.0)*/

glColor3f(1.0, 1.0, 1.0); glBegin(GL_POLYGON);

glVertex3f(0.25, 0.25, 0.0);

glVertex3f(0.75, 0.25, 0.0);

glVertex3f(0.75, 0.75, 0.0);

glVertex3f(0.25, 0.75, 0.0);glEnd() ;

/* He ждать! Запустить обработку буферизированных

* подпрограмм OpenGL*/

glFlushO ; }

void init(void) {

/* Выбрать цвет очистки (цвет фона) */

glClearColor (0.0, 0.0, 0.0, 0.0);

/* Инициализировать просматриваемые значения */

glMatrixMode(GL_PROJECTION);

glLoadldentity();

glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); } /*

Объявить начальный размер окна, его положение на экране и режим отображения (одинарная буферизация и режим RGBA).

Открыть окно со словом "hello" в строке заголовка. Вызвать подпрограммы инициализации. Зарегистрировать функцию обратного вызова для отображения графики. Войти в основной цикл и обрабатывать события.*/

int main(int argc, char** argv) GLUT_RGB);

glutInitWindowSize(250, 250);

glutInitWindowPosition(100, 100);

glutCreateWindow("hello");

init();

glutDisplayFunc(display);

glutMainLoop();

return 0; /* Язык программирования С, согласно ISO, требует, чтобы функция main возвращала значение типа int. */

2.3.4 Обработка событий ввода данных пользователем

Для того чтобы зарегистрировать обратный вызов команд, которые вызываются в том случае, когда происходят указанные события, можно воспользоваться следующими подпрограммами.

Подпрограмма glutReshapeFunc(void (*func)(int w, int h)) указывает на то, какое именно действие должно быть выполнено при изменении размера окна.

Подпрограммы glutKeyboardFunc(void (*/«wc)(unsigned char key, int x, int у)) иglutMouseFunc (void (*func)(int button, int state, int x, int у)) позволяют связывать определенную клавишу клавиатуры или кнопку мыши с подпрограммой, которая вызывается, когда данная клавиша или кнопка мыши нажимается или отпускается пользователем.

Подпрограмма glutMotionFunc(void (*func)(int x, int у)) регистрирует некоторую подпрограмму для обратного вызова при перемещении мыши с нажатой кнопкой.

2.3.5 Управление фоновым процессом

Можно определить некоторую функцию, которая должна быть выполнена с помощью подпрограммы glutIdleFunc(void (*/«nc)(void)) в том случае, если не ожидаются

никакие другие события, например, когда цикл обработки событий в противном случае перешел бы в состояние простоя. Эта подпрограмма в качестве своего единственного параметра принимает указатель на данную функцию. Для того чтобы отключить выполнение этой функции, передайте ей значение NULL (нуль).

2.3.6 Рисование трехмерных объектов

Библиотека GLUT включает в себя несколько подпрограмм для рисования перечисленных ниже трехмерных объектов:

Конус

Икосаэдр

Чайник

Куб

Октаэдр

Тетраэдр

Додекаэдр

Сфера

Тор

Вы можете нарисовать эти объекты в виде каркасных моделей или в виде сплошных закрашенных объектов с определенными нормалями к поверхностям. Например, подпрограммы для куба и сферы имеют следующий синтаксис:

void glutWireCube(GLdouble size);

void glutSolidCube(GLdouble size);

void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);

void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);

Все эти модели рисуются центрированными относительно начала мировой системы координат.

3. Анимация

3.1. Анимация компьютерной графики

Одна из наиболее захватывающих вещей, которую вы можете сделать в области компьютерной графики, -- это рисование движущихся изображений. Вне зависимости от того, являетесь ли вы инженером, пытающимся увидеть все стороны разрабатываемого механического узла, пилотом, изучающим с использованием моделирования процесс пилотирования самолета, или же просто страстным любителем компьютерных игр, очевидно, что анимация является важной составной частью компьютерной графики.

В кинотеатре иллюзия движения достигается за счет использования последовательности изображений и проецирования их на экран с частотой 24 кадра в секунду. Каждый кадр последовательно перемещается в положение позади объектива, затвор открывается, и данный кадр отображается на экране. Затвор на мгновение закрывается, в то время как пленка протягивается к следующему кадру, затем на экране отображается этот следующий кадр, и так далее. Хотя каждую секунду вы наблюдаете на экране 24 различные кадра, ваш мозг смешивает все эти кадры в "непрерывную" анимацию. (Старые фильмы Чарли Чаплина снимались с частотой 16 кадров в секунду и при воспроизведении фигуры двигались заметными резкими толчками.) Экран в компьютерной графике обычно обновляется (перерисовывает изображение) приблизительно от 60 до 76 раз в секунду, а иногда прикладные программы обеспечивают даже приблизительно 120 обновлений в секунду. Очевидно, что анимация с частотой 60 кадров в секунду выглядит более "гладкой", чем при частоте 30 кадров в секунду, а 120

кадров в секунду заметно лучше, чем 60 кадров в секунду. Однако частоты регенерации, превышающие 120 кадров в секунду, могут быть за пределами точки уменьшения повторного появления, в зависимости от пределов восприятия.

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

Страницы: 1, 2, 3, 4



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.