Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка комR_А5.doc
Скачиваний:
5
Добавлен:
09.11.2019
Размер:
419.84 Кб
Скачать

ДЕРЖАВНИЙ ВИЩИЙ НАВЧАЛЬНИЙ ЗАКЛАД

“ЗАПОРІЗЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ”

МІНІСТЕРСТВА ОСВІТИ І НАУКИ УКРАЇНИ

В.В. Мухін, А.О. Лісняк, О.А. Лисенко

Комп’ютерна графіка

Методичні рекомендації до виконання лабораторних робіт для студентів напрямів підготовки «Прикладна математика», «Інформатика»

Затверджено

Вченою радою ЗНУ

Протокол №3 від 30.11.2010

Запоріжжя 2010

УДК 004.92 (076)

Мухін В.В., Лісняк А.О., Лисенко О.А. Комп’ютерна графіка: Методичні рекомендації до виконання лабораторних робіт для студентів напрямів підготовки «Прикладна математика», «Інформатика». – Запоріжжя: ЗНУ, 2010. – 45 с.

Дане начально-методичне видання пропонується студентам, що навчаються за напрямами підготовки – 6.040301 «Прикладна математика», 6.040302 «Інформатика», для яких курс «Комп’ютерна графіка» є фаховою дисципліною. У методичних рекомендаціях представлені вимоги до знань студентів та зміст основних лабораторних робіт, що виносяться на захист при вивчені даного курсу, а також контрольні питання для самоконтролю знань.

Рекомендується студентам як денної, так і заочної форми навчання, як методичні вказівки при виконанні лабораторних робіт.

Рецензент: Бувайло Д.П.

Відповідальний за випуск: Гоменюк С.І.

Зміст

ВСТУП

Метою вивчення даної дисципліни є оволодіння знаннями та навичками основних принципів графічного відображення інформації.

Задачами дисципліни є: оволодіння основними принципами проектування графічного діалогу, знаннями технічних засобів до діалогу графічного уведення – виведення та вміннями їх використовувати, засвоєння вмінь та навичок щодо методів зображення тривимірних об’єктів, інтерактивного графічного проектування у простору, одержання знань з основних понять теорії геометричних перетворень та кольору у машинній графіці. А також оволодіння основними принципами візуального аналізу графічної інформації.

Лабораторна робота №1 Тема: «Вступ в програмування з використанням opengl»

Мета роботи.

Ознайомитися з основами використання бібліотеки OpenGL.

Теоретична частина.

OpenGL є на даний момент одним з найпопулярніших програмних інтерфейсів (API) для розробки додатків в області двовимірної і тривимірної графіки. Стандарт OpenGL був розроблений і затверджений в 1992 році провідними фірмами в області розробки програмного забезпечення, а його основою стала бібліотека IRIS GL, розроблена Silicon Graphics.

На даний момент реалізація OpenGL включає декілька бібліотек (опис базових функцій OpenGL, GLU, GLUT, GLAUX и другие), призначення яких буде описано нижче.

Усі команди (процедури і функції) бібліотеки GL починаються з префікса gl, усі константи - з префікса GL_. Крім того, в імена команд входять суфікси, що несуть інформацію про число і тип передаваних параметрів. У OpenGL повне ім'я команди має вигляд:

type glCommand_name[1 2 3 4][b s i f d ub us ui][v] (type1 arg1,…,typeN argN)

Ім'я складається з декількох частин:

gl ім'я бібліотеки, в якій описана ця функція.

Command_name ім'я команди (процедури або функції)

[1 2 3 4] число аргументів команди

[b s i f d ub us ui] тип аргументу: b – GLbyte (аналог char), i – Glint (аналог int), f – GLfloat (аналог float) тощо

[v] у параметрах використовується покажчик на масив значень.

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

Нижче приведений текст невеликої програми, написаної з використанням бібліотеки GLUT.

#include <stdlib.h>

/* підключаємо бібліотеку GLUT */

#include <gl\glut.h>

/* початкова ширина і висота вікна */

GLint Width = 512, Height = 512;

const int CubeSize = 200; /* розмір куба *

/* ця функція управляє усім виводом на екран */

void Display(void)

{

int left, right, top, bottom;

left = (Width - CubeSize) / 2;

right = left + CubeSize;

bottom = (Height - CubeSize) / 2;

top = bottom + CubeSize;

glClearColor(0, 0, 0, 1);

glClear(GL_COLOR_BUFFER_BIT);

glColor3ub(255,0,0);

glBegin(GL_QUADS);

glVertex2f(left,bottom);

glVertex2f(left,top);

glVertex2f(right,top);

glVertex2f(right,bottom);

glEnd();

glFinish();

}

/* Функція викликається при зміні розмірів вікна */

void Reshape(GLint w, GLint h)

{

Width = w; Height = h;

/* встановлюємо розміри області відображення */

glViewport(0, 0, w, h);

/* ортографічна проекція */

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(0, w, 0, h, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

/* Функція обробляє повідомлення від клавіатури */

void Keyboard( unsigned char key, int x, int y )

{

#define ESCAPE '\033'

if( key == ESCAPE ) exit(0);

}

/* головна програма */

main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB);

glutInitWindowSize(Width, Height);

glutCreateWindow("Red square example");

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutKeyboardFunc(Keyboard);

glutMainLoop();

}

Бібліотека GLUT підтримує взаємодію з користувачем за допомогою так званих функцій зворотного виклику (callback function). Якщо користувач посунув мишу, натиснув на кнопку клавіатури або змінив розміри вікна відбувається подія і викликається відповідна функція користувача - обробник подій.

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

Функція glutInit (&argc, argv) робить початкову ініціалізацію самої бібліотеки GLUT.

Команда glutInitDisplayMode (GLUT_RGB) ініціалізувала буфер кадру і встановлює повноколірний (непалитровый) режим RGB.

glutInitWindowSize (Width, Height) використовується для завдання початкових розмірів вікна.

glutCreateWindow ("Red square example") задає заголовок вікна і відображує само вікно на екрані.

Команди glutDisplayFunc (Display), glutReshapeFunc (Reshape), glutKeyboardFunc (Keyboard) реєструють функції Display (), Reshape() і Keyboard() як функції, які будуть викликані, відповідно, при перемальовуванні вікна, зміні розмірів вікна, натисненні клавіші на клавіатурі.

Контроль усіх подій і виклик потрібних функцій відбувається усередині циклу обробки повідомлень у функції glutMainLoop ().

Очищення буферів робиться за допомогою команд:

void glClearColor ( clampf r, clampf g, clampf b, clampf a )

void glClear (bitfield buf)

Команда glClearColor встановлює колір фону.

Команда glClear очищає буфери, а параметр buf визначає буфери, які треба очистити. Типова програма викликає команду

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

для очищення буферів кольору і глибини.

Кожен мальований об'єкт має бути представлений у вигляді набору примітивів OpenGL. Примітиви задаються набором вершин.

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

Положення вершини задають функції:

void glVertex [2 3 4][s i f d] (type coords)

void glVertex[2 3 4][s i f d]v (type *coords)

OpenGL працює з однорідними координатами (х, у, z, w). Якщо координата z не задана, то вона вважається рівною нулю. Якщо координата w не задана, то вона вважається рівною одиниці.

Для асоціації з вершинами кольорів, нормалей і координат текстур використовуються поточні значення відповідних даних.

Для завдання поточного кольору вершини використовуються команди:

void glColor [3 4][b s i f] (GLtype components)

void glColor[3 4][b s i f]v (GLtype components)

Вершинам можна призначати різні кольори, і, якщо включений відповідний режим, то проводитиметься лінійна інтерполяція кольорів за поверхнею примітиву.

Для управління режимом інтерполяції використовується команда

void glShadeModel (GLenum mode)

виклик якої з параметром GL_SMOOTH включає інтерполяцію (установка за умовчанням), а з GL_FLAT – відключає.

Визначити нормаль у вершині можна, використовуючи команди

void glNormal3[b s i f d] (type coords)

void glNormal3[b s i f d]v (type coords)

Для правильного розрахунку освітлення необхідно, щоб вектор нормалі мав одиничну довжину. Командою glEnable(GL_NORMALIZE) можна включити режим, при якому нормалі, що задаються, нормуватимуться автоматично.

Операторні дужки glBegin / glEnd

Для завдання геометричних примітивів необхідно виділити набір вершин, що визначають цей об'єкт. Для цього служать процедури glBegin() і glEnd().

void glBegin (GLenum mode)

void glEnd (void)

Параметр mode визначає тип примітиву, який задається усередині блоку, що задається процедурами glBegin() і glEnd(), і може набувати наступних значень:

GL_POINTS кожна вершина задає координати деякої точки.

GL_LINES кожна окрема пара вершин визначає відрізок.

GL_LINE_STRIP незамкнута ламана.

GL_LINE_LOOP замкнута ламана.

GL_TRIANGLES кожні окремі три вершини визначають трикутник.

GL_TRIANGLE_STRIP кожна наступна вершина задає трикутник разом з двома попередніми.

GL_TRIANGLE_FAN трикутники задаються першою вершиною і кожною наступною парою вершин.

GL_QUADS кожна четвірка вершин визначає чотирикутник.

GL_QUAD_STRIP чотирикутник з номером n визначається вершинами з номерами 2n-1, 2n, 2n+2, 2n+1.

GL_POLYGON вершини визначають опуклий багатокутник.

Усередині блоку можна викликати тільки наступні функції: glVertex, glColor, glIndex, glNormal, glTexCoord, glEvalCoord, glEvalPoint, glMaterial.

Щоб намалювати трикутник з різними кольорами у вершинах, досить написати:

GLfloat BlueCol[3] = {0,0,1};

glBegin(GL_TRIANGLES);

glColor3f(1.0, 0.0, 0.0); /* червоний */

glVertex3f(0.0, 0.0, 0.0);

glColor3ub(0,255,0); /* зелений */

glVertex3f(1.0, 0.0, 0.0);

glColor3fv(BlueCol); /* синій */

glVertex3f(1.0, 1.0, 0.0);

glEnd();

Окрім завдання самих примітивів можна визначити метод їх відображення на екрані (під примітивами в даному випадку розуміються багатокутники).

Проте спочатку потрібно визначити поняття лицьових і зворотних граней.

Під гранню розуміється одна із сторін багатокутника, і за умовчанням лицьовою вважається та сторона, вершини якої обходяться проти годинникової стрілки. Напрям обходу вершин лицьових сторін можна змінити викликом команди

void glFrontFace (GLenum mode)

зі значенням параметра mode рівним GL_CW, а відмінити - з GL_CCW.

Щоб змінити метод відображення багатокутника використовується команда

void glPolygonMode (GLenum face, Glenum mode)

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

GL_FRONT для лицьових граней

GL_BACK для зворотних граней

GL_FRONT_AND_BACK для усіх граней

Параметр mode може бути рівний:

GL_POINT при такому режимі відображуватимуться тільки вершини багатокутників.

GL_LINE при такому режимі багатокутник представлятиметься набором відрізків.

GL_FILL при такому режимі багатокутники зафарбовуватимуться поточним кольором з урахуванням освітлення, і цей режим встановлений за умовчанням.

Крім того, можна вказувати, який тип граней відображувати на екрані. Для цього спочатку потрібно встановити відповідний режим викликом команди glEnable (GL_CULL_FACE), а потім вибрати тип граней, що відображуються, за допомогою команди

void glCullFace (GLenum mode)

Виклик з параметром GL_FRONT призводить до видалення із зображення усіх лицьових граней, а з параметром GL_BACK - зворотних (установка за умовчанням).

Завдання 1. Реалізувати простий графічний редактор, що дозволяє за допомогою миші малювати:

а) кольорові точки (розмір і колір точки задається, наприклад, натисненням клавіш '1 '-' 9'),

б) кольорові ламані (ламана закінчується, наприклад, при натисненні Enter; колір задається для кожної ламаної),

в) кольорові ламані (колір задається для кожної точки ламаної),

г) кольорові багатокутники (задається колір кожного багатокутника),

д) кольорові багатокутники (задається колір кожної вершини).

Завдання 2. Реалізувати простий графічний редактор, що малює багатокутники із зумовленого набору. Мишею задається положення багатокутника. Передбачити можливість вибору кольору.

Контрольні питання до лабораторної роботи №1

1. Сфери застосування комп'ютерної графіки.

2. Способи формування зображень на екрані.

3. Технічні засоби комп'ютерної графіки.

4. Побудова лінії в квадратному растрі.

5. Загальні вимоги до зображення відрізку.

6. Параметричний алгоритм малювання лінії.

7. Алгоритм Брезенхема малювання лінії.

8. Алгоритми побудови кола.

9. Алгоритм Брезенхема генерації кола.