50087 (Використання OpenGL. Моделювання вогню), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Використання OpenGL. Моделювання вогню", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "50087"

Текст 3 страницы из документа "50087"

#include

#include

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

Інструментарій бібліотек

Як ви вже знаєте, бібліотека OpenGL містить команди візуалізації, проте вона розроблялася так, щоб бути незалежною від будь-якої конкретної віконної або операційної системи. Отже, ця бібліотека не містить ніяких команд для відкриття вікон або зчитування подій від клавіатури або миші. На жаль, неможливо написати закінчену графічну програму, не відкриваючи, принаймні, одне вікно, а найцікавіші програми вимагають певного об'єму обробки даних, що вводяться користувачем, або інших послуг від віконної або операційної системи. У багатьох випадках закінчені програми дають найцікавіші приклади, тому справжня програма використовує бібліотеку GLUT для того, щоб спростити процедури відкриття вікон, виявлення введення даних користувачем і так далі. Якщо на вашій системі є реалізація бібліотеки OpenGL і інструментарію GLUT, то приклади повинні працювати без змін при роботі з вашими бібліотеками OpenGL і GLUT.

Крім того, оскільки склад команд малювання у бібліотеці OpenGL обмежений тільки командами, які генерують прості геометричні примітиви (точки, лінії і багатокутники), бібліотека GLUT включає декілька підпрограм, що створюють складніші тривимірні об'єкти, такі як сфера, тор і чайник. Таким чином, можна отримати для перегляду досить цікаві кадри виведення програми. (Зверніть увагу на те, що бібліотека утиліт OpenGL, GLU, також має у своєму складі підпрограми побудови двовимірних поверхонь, які створюють деякі тривимірні об'єкти, такі ж, як і ті, які створює інструментарій GLUT, у тому числі сферу, циліндр або конус.)

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

Управління вікнами

П'ять підпрограм інструментарію 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, це вікно ще не відображається на екрані.

Функція зворотного виклику відображення

Підпрограма gIutDisplayFunc(void(void)) є першою і найбільш важливою функцією зворотного виклику по події, з якою належить зіткнутися. Всякий раз, коли бібліотека GLUT визначає, що вміст цього вікна має бути відновлений, виконується функція зворотного виклику, зареєстрована підпрограмою glutDisplayFunc(). Тому ви повинні помістити усі підпрограми, які потрібні для перемальовування сцени, в цю функцію зворотного виклику відображення.

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

Виконання програми

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

Для того, щоб зробити ефективність програми максимальної, усі операції, які повинні викликатися одноразово (установка кольору фону і системи координат), тепер включені до складу процедури, названої init(). Операції, необхідні для візуалізації (і, можливо, для повторної візуалізації) сцени, включені до складу процедури display(), яка є зареєстрованою функцією зворотного виклику відображення бібліотеки GLUT.

Приклад 2. Проста програма OpenGL, що використовує інструментарій GLUT : hello.c

#include

#include

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){

glutInit(Sargc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize(250, 250);

glutInitWindowPosition(100, 100);

glutCreateWindow("hello");

init();

glutDisplayFunc(display);

glutMainLoop();

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

Обробка подій введення даних користувачем

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

Підпрограма glutReshapeFunc(void(int w, int h)) вказує на те, яка саме дія має бути виконана при зміні розміру вікна.

Підпрограми glutKeyboardFunc(void(unsigned char key, int x, int у)) і glutMouseFunc (void(int button, int state, int x, int у)) дозволяють зв'язувати певну клавішу клавіатури або кнопку миші з підпрограмою, яка викликається, коли ця клавіша або кнопка миші натискається або відпускається користувачем.

Підпрограма glutMotionFunc(void(int x, int у)) реєструє деяку підпрограму для зворотного виклику при переміщенні миші з натиснутою кнопкою.

Управління фоновим процесом

Можна визначити деяку функцію, яка має бути виконана за допомогою підпрограми glutIdleFunc(void(void)) у тому випадку, якщо не очікуються ніякі інші події, наприклад, коли цикл обробки подій перейшов би в стан простою. Ця підпрограма в якості свого єдиного параметра приймає покажчик на цю функцію. Для того, щоб відключити виконання цієї функції, передайте їй значення NULL (нуль).

Малювання тривимірних об'єктів

Бібліотека 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 кадрів в секунду, можуть бути за межами точки зменшення повторної появи, залежно від меж сприйняття.

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

відкрити вікно();

for (i = 0; i < 1000000; i++){

очистити вікно();

намалювати_кадр (i);

почекати_доки_не_закінчиться_інтервал_в_1_24__частку_секунди(); )

Якщо ви додасте час, який потрібно вашій обчислювальній системі для того, щоб очистити екран і намалювати типовий кадр, то приведена вище програма показує результати, що усе більш тривожать, залежно від того, наскільки близько підходить час, потрібний їй для очищення екрану і промальовування кадру до 1/ 24 частці секунди. Припустимо, що процедура малювання в цій програмі майже повністю займає 1/24 частку секунди. Елементи, намальовані на самому початку, видимі впродовж повної 1/24 частки секунди і представляють суцільне зображення на екрані; елементи, намальовані у кінці даного інтервалу, негайно очищаються, як тільки програма запускається для малювання наступного кадру. Вони є у кращому разі деякою подібністю примарного зображення, оскільки велику частину інтервалу в 1/24 секунди ваше око розглядає очищений фон замість тих елементів, які, до нещастя для них, були намальовані останніми. Проблема в даному випадку полягає в тому, що приведена вище програма не відображає повністю намальовані кадри; замість цього ви спостерігаєте процес малювання в його розвитку.

Більшість реалізацій бібліотеки OpenGL забезпечують подвійну буферизацію - апаратну або програмну, яка надає два готові буфери з кольоровими зображеннями. Зображення з одного буфера відображається на екрані, тоді як в іншому буфері малюється нове зображення. Коли малювання чергового кадру завершується, ці два буфери міняються місцями, і той буфер, що містив зображення, що відображалося, тепер використовується для малювання, і навпаки. Це схоже на роботу кінопроектора, плівка в якому містить всього два кадри і склеєна в петлю; тоді як один проектується на екран, кіномеханік відчайдушно стирає і перемальовував невидимий глядачеві кадр. Якщо кіномеханік працює досить швидко, то глядач не помічає відмінностей між таким "кінопроектором" і реальною системою, в якій усі кадри вже намальовані, і кінопроектор просто відображає їх один за іншим. При використанні подвійної буферизації кожен кадр відображається тільки тоді, коли його малювання завершене; глядач ніколи не побачить частково намальованого кадру.

Псевдокод зміненої версії приведеної вище програми, яка відображає плавно анімовану графіку, використовуючи при цьому подвійну буферизацію, міг би виглядати таким чином:

відкрити_вікно_в_режимі_подвійної_буфериэації(); for (i = 0; i < 1000000; i++){

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5137
Авторов
на СтудИзбе
440
Средний доход
с одного платного файла
Обучение Подробнее