МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
Бердичівськийполітехнічний коледж
КОНТРОЛЬНА РОБОТА
з предмета“Комп’ютерна графіка”
Виконав: студент групи Пзс-504
Горпинич О.О.
Перевіриввикладач:Козік В.Ю.
м. Бердичів
2007 р.
1.Адитивнакольорова модель RGB
Ця модель використовується для опису кольорів, які можутьбути отримані за допомогою пристроїв, що основані на принципі випромінювання. Уякості основних кольорів вибрано червоний (Red), зелений (Green) та синій(Blue). Інші кольори та відтінки можуть бути отримані змішуванням певноїкількості кожного з основних кольорів.
Стисло історія системи RGB така. ТомасЮнг (1773-1829) узяв три ліхтарі і пристосував до них червоний, зелений і синійсвітлофільтри. Так були отримані джерела світла відповідних кольорів.Направивши на білий екран світло цих трьох джерел, вчений одержав такезображення (рис. 1.21).
/>
На екрані світло від джерел давало кольорові кола. У місцяхперетинання кіл спостерігалося змішування кольорів. Жовтий колір давалозмішування червоного й зеленого, блакитний — суміш зеленого Й синього, пурпурний— синього й червоного, а білий колір утворювався змішанням усіх трьох основнихкольорів. Якийсь час потому, Джеме Максвелл (1831-1879) виготовив першийколориметр, за допомогою якого людина могла порівнювати монохроматичний колір іколір змішування в заданій пропорції компонентів RGB. Регулюючи яскравістькожного з компонентів, що змішуються, можна домогтися вирівнювання кольорівсуміші й монохроматичного випромінювання. Це описується в такий спосіб:
/>
де r, g і Ь — кількості відповідних основних кольорів.
Співвідношення коефіцієнтів r, g i b Максвелл наочнопоказав за допомогою трикутника, згодом названого його ім'ям [1]. ТрикутникМаксвелла є рівнобічним, у його вершинах розташовуються основні кольори — R, GІ В (рис. 1.22). Із заданої точки проводяться лінії, перпендикулярні сторонамтрикутника. Довжина кожної лінії й показує відповідну величину коефіцієнта r, gчи Ь. Однакові значення r = g = Ь мають місце в центрі трикутника і відповідаютьбілому кольору. Слід також зазначити, що деякі кольори відображаються точкамизовні трикутника RGB — це означає від'ємне значення відповідного колірногокоефіцієнта. Сума коефіцієнтів дорівнює висоті трикутника, а при висоті, щодорівнює одиниці, r + g + b = 1.
/>
Як основні кольори, Максвелл використовував випромінюванняз такими довжинами хвиль: 630, 528 і 457 нм.
До теперішнього часу система RGB є офіційним стандартом.Рішенням Міжнародної Комісії з Освітлення — МКО (СІЕ — Commision Internationalde VEclairage) у 1931 році були стандартизовані основні кольори, які булорекомендовано використовувати в якості R, G і В. Це монохроматичні кольорисвітлового випромінювання з довжинами хвиль відповідно:
R — 700 нм, G — 546.1 нм, В — 435.8 нм.
Червоний колір виходить за допомогою лампи розжарювання зфільтром. Для одержання чистих зелених і синіх кольорів використовується ртутналампа. Також стандартизоване значення світлового потоку для кожного основногокольору [1].
Ще одним важливим параметром для системи RGB є колір,одержаний після змішування трьох компонентів у рівних кількостях. Це білийколір. Виявляється, для того, щоб змішуванням компонентів R, G і В одержатибілий колір, яскравості відповідних джерел не повинні бути рівними, азнаходитися у пропорції
/>
Якщо розрахунки кольору робляться для джерел випромінюванняз однаковою яскравістю, то зазначене співвідношення яскравостей можна врахувативідповідними масштабними коефіцієнтами [14].
Тепер розглянемо інші аспекти. Колір, створюванийзмішуванням трьох основних компонентів, можна представити вектором утривимірній системі координат R, G і В, зображеній на рис. 1.23.
/>
Чорному кольору відповідає центр координат — точка (0, 0,0). Білий колір виражено максимальним значенням компонентів. Нехай цемаксимальне значення уздовж кожної осі дорівнює одиниці. Тоді білий колір — цевектор (1, 1, 1). Точки, що лежать на діагоналі куба від чорного до білого,мають однакові значення координат: Ri= Gi= Bi. Це градації сірого — їх можнавважати білим кольором різної яскравості. Узагалі говорячи, якщо усі компонентивектора (r, g, b) помножити на однаковий коефіцієнт (k = 0… 1… 1), токолір (kr, kg, kb) зберігається, змінюється тільки яскравість. Тому для аналізукольору важливе співвідношення компонентів. Якщо в колірному рівнянні
/>
розділити коефіцієнти r, g i b на їхню суму:
/>
Це рівняння репрезентує вектори кольору (r', g', b'), щолежать в одиничнiй площині r' + g' + b' = 1. Іншими словами, ми перейшли від кубадо трикутника Максвелла.
У ході колориметричних експериментів були визначенікоефіцієнти (r', g', b'), що відповідають чистим монохроматичним кольорам.Найпростіший колориметр —це призма з білого гіпсу, грані якої освітлюютьджерелами світла. На ліву грань спрямоване джерело чистого монохроматичноговипромінювання, а права грань освітлюється сумішшю трьох джерел RGB.Спостерігач бачить одночасно дві грані, що дозволяє фіксувати рівність кольорів(рис. 1.24).
/>
Результати експериментів можна зобразити графічно (рис.1.25).
/>
Як бачимо, коефіцієнти r', g' і b' можуть бути іпозитивними, і від'ємними. Що це означає? Те, що деякі монохроматичні кольорине можуть бути представлені сумою компонентів R, G і B. Але як відняти те, чогонемає? Для вирівнювання кольору довелося додати до монохроматичноговипромінювання один з компонентів R, G чи В. Наприклад, якщо монохроматичневипромінювання для деякого значення /> розбавлялося червоним, те цеможна виразити так:
/>
Як виявилося, жоден колір монохроматичного випромінювання(за винятком самих кольорів R, G і В) не може бути представлений тількипозитивними значеннями коефіцієнтів змішування. Це наочно можна зобразити задопомогою колірного графіка, побудованого на основі трикутника Максвелла (рис.1.26).
/>
Верхня частина кривої лінії відповідає чистиммонохроматичним кольорам, а нижня лінія — від 380 нм до 780 нм — представляєтак називані пурпурні кольори (суміш синього й червоного), які не ємонохроматичними. Точки, що лежать усередині контуру кривої, відповідаютьреальним кольорам, а поза цим контуром — нереальним кольорам. Точки усерединітрикутника відповідають позитивним значенням коефіцієнтів r', g' та b' іпредставляють кольори, які можна одержати змішуванням компонентів RGB.
Таким чином, система RGB має неповне колірне охоплення —деякі насичені кольори не можуть бути представлені сумішшю зазначених трьохкомпонентів. У першу чергу, це кольори від зеленого до синього, включаючи усівідтінки блакитного — вони відповідають лівій частині кривої колірного графіка.Ще раз підкреслимо, що мова тут іде про насичені кольори, оскільки, наприклад,ненасичені блакитні кольори змішуванням компонент RGB одержати можна.Незважаючи на неповне охоплення, система RGB широко використовується в данийчас — у першу чергу, в кольорових телевізорах і дисплеях комп'ютерів.Відсутність деяких відтінків кольору не надто помітна.
Ще одним фактором, що сприяє популярності системи RGB, є їїнаочність — основні кольори знаходяться в трьох чітко помітних ділянкахвидимого спектра.
Крім того, однією з гіпотез, що пояснюють колірний зірлюдини, є трикомпонентна теорія, яка стверджує, що в зоровій системі людини єтри типи світлочутливих елементів. Один тип елементів реагує на зелений, іншийтип — на червоний, а третій тип — на синій колір. Така гіпотеза висловлюваласяще Ломоносовим [14], її обґрунтуванням займалися багато вчених, починаючи з Т.Юнга. Утім, трикомпонентна теорія не є єдиною теорією колірного зору людини.
2. Об’ємніоб’єкти, Tess-, NURBS – об’єкти бібліотеки Opengl
В OpenGL передбачені деякі стандартні, найчастішевикористовувані тривимірні об'єкти. Набір таких форм представлений у бібліотеціGLU (Utility Library), що реалізована у вигляді модуля glu32.dll й єневід'ємною частиною OpenGL. Вона містить у собі кілька функцій керуванняпроекціями (одну з яких — gluPerspective — ми вже використовували), функціїроботи з полігонами, кривими та поверхнями типу B-сплайнів й інші функції.
Розглянемо функції gluCylinder, gluSphere, gluDisk ІgluPartialDisk .
Перераховані вище об'єкти названі «quadricobjects». Параметри slices і stacks визначають кількість плоских граней,використовуваних для апроксимації поверхні. Для того щоб нарисувати подібнийоб'єкт, потрібно викликати функцію gluNewQuadric, а після рисування звільнитипам'ять викликом функції gluDeleteQuadric
/>
За умовчанням кожен об'єкт рисується із суцільнимзаповненням. Змінити стиль показу можна викликом функції gluQuadricDrawStyle.Можна задати такі стилі показу: у вигляді точок, розташованих на вершинахбагатокутника; каркасне зображення; суцільне заповнення й силует (різновидкаркасного). Наприклад, виклик.
/>
/>
/>
/>
Об'єкти даного типу розташовуються у просторі в центрікоординат (0, 0, 0) з врахуванням матриці gl_modelview. Тому, щоб нарисуватизображення об'єкта в необхідному місці, потрібно відповідним чином змінити цюматрицю, наприклад, за допомогою функцій glTranslate і glRotate. Нижченаведенийприклад ілюструє показ об'єктів типу «quadric objects ».
Зображення, що створюється програмою Studex55, наведене нарис. 11.16.
При підготовці цього рисунка до друку був змінений коліртла на білий. Однак на екрані монітора значно краще виглядає темно-синій колір.У тексті програми:
/>
/>
/>
Для текстур використовуються растри. Вони можуть бутиодномірними чи двовимірними. Щоб накласти текстуру, необхідно виконати наступніоперації.
1. Відкрити в пам'яті масив, у якому буде зберігатися растртекстури. Число байтів масиву розраховується, виходячи з кількості бітів напіксел текстури. Розміри растру текстури обов'язково повинні дорівнюватиступеню двійки (плюс трохи пікселів на бордюр). Ця вимога створює деякінезручності для програміста, особливо у випадку, коли текстура читається здовільного растрового файлу. Утім, це не є нерозв'язною проблемою — будь-якийрастр текстури можна або обрізати, або розтягнути (стиснути) до необхіднихрозмірів.
2. Заповнити масив текстури. Тут варто враховувати те, вякому форматі представлений растр текстури. Якщо піксели текстурипредставляються у форматі RGB (24 біта на піксел), то байти в масиві повиннірозташовуватися у вигляді трійок (R, G, В). Зазначимо, що в масивах DIB WindowsAPI колірні компоненти розташовуються у зворотному порядку, тобто (В, G, R).
3. Після того як масив відкритий, передати OpenGL адресумасиву й інші його параметри. Робиться це викликом функції glTexImage2D длядвовимірної текстури і glTexImage1D для одномірної.
4. Задати параметри фільтрації текстури (викликом функціїglTexParameter) для якісного відображення об'єктів різних розмірів.
5. Перед безпосереднім рисуванням об'єктів встановити режимвикористання текстури. Робиться це викликом функції glEnable (GL_texture_2d) Дляоб'єктів типу «quadric objects » (куля, циліндр, диск) треба такожвикликати функцію
/>
6. При виводі полігональних граней (gl_triangles, gl_quadsі їм подібних) вказати відповідність текстурних координат і координат упросторі об'єктів. Зробити це можна викликом функцій із сімейства glTexCoord.Так, наприклад, функція glTexCoord2f (s, t) вказує на точку з текстурнимикоординатами s і t. Наступний виклик функції glVertex3f
На рис. 11.17. показаний приклад відображення координатчотирикутної грані.
/>
Можна припустити, що хазяїн цього замку вирішив вкритиплиткою стіни, щоб уберегти свою нерухомість від руйнівного впливу агресивногонавколишнього середовища. Так це було чи ні, але тут ми ще раз використовувалишаховий візерунок — вже для текстури. Растр текстури генерується тут «нальоту» й зберігається в масиві pixels. Це приклад синтетичної текстури,візерунок створюється найпростішим алгоритмом. Для створення реалістичнихзображень у якості текстури зазвичай використовуються цифрові фотографії.
/>
У загальному випадку текстури зручніше зберігати у файлахна диску. Це можуть бути досить складні зображення, виготовлені заздалегідь. Упрограмах для Windows растри можна створювати у вигляді ресурсів, які післякомпіляції записуються у виконувані файли, наприклад, у файли ЕХЕ. А можнавикористовувати й окремі файли стандартних форматів. В останньому випадкутекстури зручно багаторазово редагувати.
Розглянемо, як можна використовувати текстури, записані уфайлах BMP. Такі файли зберігають растр у форматі DIB (Device IndependentBitmap). Формат DIB схожий на формат текстури OpenGL, однак, є деяківідмінності. Так, у DIB використовується вирівнювання рядків на границюподвійного слова. Іншими словами, кількість байтів у рядку растра завждиповинна бути кратною чотирьом — якщо це не так, то додають зайві байти. Унашому випадку сприятливим фактором є те, що розміри текстур OpenGL повиннідорівнювати степеневі двійки. Починаючи з розмірів по горизонталі, щодорівнюють чотирьом, 24-бітні растри DIB автоматично розташовуються в пам'ятітак само, як і текстури OpenGL, — вирівнювання відсутнє.
Якщо використовувати 24-бітну глибину кольору, то більшістотною відмінністю DIB від формату текстур OpenGL є порядок розташуваннябайтів R,G і В. Для масивів текстур OpenGL повинне бути R-G-B, у той час як уDIB навпаки: B-G-R. Тому після читання файлу необхідно переставляти байти R іВ.
Наша наступна програма (studex57) ілюструє читання текстуриз файлу BMP. Ця програма є модифікацією попередньої програми (Studex56). Зміниторкнулися функції InitMyTexture. В її тіло вбудована функція читання файлівBMP, що названа ReadTextureBMP. Крім того, тут бажано використати текстуру більшоїроздільної здатності, наприклад, розмірами 256*128 — відповідно змінітьhorTexture та vertTexture.
Можливо, у цьому замку замало вікон і дверей. Але їхнескладно додати в текстуру за допомогою будь-якого растрового графічногоредактора, чи не так? Хоча, можливо, доведеться використовувати вже декількатекстур для різних стін.
Слід зазначити, що наведена вище функція ReadTextureBMP неє універсальною — вона не розрахована на інші різновиди формату файлів BMP. Цюфункцію необхідно істотно видозмінити, якщо передбачається читання, наприклад,ще й 256-кольорових растрів. Такі растри читати трохи складніше, оскількипотрібно завантажувати й установлювати палітру. Тим, хто не хоче власноручпрограмувати читання файлів, можна порекомендувати використовувати функціюauxDIBImageLoad 3 бібліотеки GIAUX.
3. Засобамибібліотеки Opengl забезпечити зміну кольору створеної точки при натисненнілівої кнопки миші
/>
(рис.1)
/>
(рис. 2)
unit Unit1;
interface
uses
Windows, Messages, SysUtils,Classes, Graphics, Controls, Forms, Dialogs,
OpenGL;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender:TObject);
procedure FormPaint(Sender:TObject);
procedure FormDestroy(Sender:TObject);
procedure FormKeyDown(Sender:TObject; var Key: Word;
Shift: TShiftState);
procedure FormResize(Sender:TObject);
procedure FormKeyPress(Sender:TObject; var Key: Char);
private
DC: HDC;
hrc: HGLRC;
ry: GLfloat;
tx: GLfloat;
quadObj: GLUquadricObj;
end;
var
frmGL: TfrmGL;
mode: (POINT, LINE, FILL,SILHOUETTE) = FILL;
gluobj: (SPHERE, CONE, CYLINDER,DISK) = SPHERE;
orientation: (OUTSIDE, INSIDE) =OUTSIDE;
normals: (NONE, FLAT, SMOOTH) =SMOOTH;
implementation
{$R *.DFM}
procedure TfrmGL.FormPaint(Sender:TObject);
begin
glClear (GL_COLOR_BUFFER_BIT orGL_DEPTH_BUFFER_BIT); // очистка буфера цвета
glPushMatrix;
glRotatef (ry, 0.0, 1.0, 0.0);
glTranslatef (tx, 0.0, 0.0);
case mode of
POINT: gluQuadricDrawStyle(quadObj, GLU_POINT);
LINE: gluQuadricDrawStyle(quadObj, GLU_LINE);
FILL: gluQuadricDrawStyle(quadObj, GLU_FILL);
SILHOUETTE: gluQuadricDrawStyle(quadObj, GLU_SILHOUETTE);
end;
case orientation of
INSIDE: gluQuadricOrientation(quadObj, GLU_INSIDE);
OUTSIDE: gluQuadricOrientation(quadObj, GLU_OUTSIDE);
end;
case normals of
NONE: gluQuadricNormals (quadObj,GLU_NONE);
FLAT: gluQuadricNormals (quadObj,GLU_FLAT);
SMOOTH: gluQuadricNormals(quadObj, GLU_SMOOTH);
end;
case gluobj of
SPHERE: gluSphere (quadObj, 1.5,10, 10);
CONE: gluCylinder (quadObj, 0.0,1.0, 1.5, 10, 10);
CYLINDER: gluCylinder (quadObj,1.0, 1.0, 1.5, 10, 10);
DISK: gluDisk (quadObj, 0.0, 1.5,10, 5);
end;
glPopMatrix;
SwapBuffers(DC);
end;
procedure SetDCPixelFormat (hdc:HDC);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOWor PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat(hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat,@pfd);
end;
procedureTfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75,1.0); // цвет фона
glLineWidth (1.5);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
glColor3f (1.0, 0.0, 0.0);
quadObj := gluNewQuadric;
ry := 0.0;
tx := 0.0;
end;
procedureTfrmGL.FormDestroy(Sender: TObject);
begin
gluDeleteQuadric (quadObj);
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
procedureTfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close;
If Key = VK_LEFT then begin
ry := ry + 2.0;
InvalidateRect(Handle, nil,False);
end;
If Key = VK_RIGHT then begin
ry := ry — 2.0;
InvalidateRect(Handle, nil,False);
end;
If Key = VK_UP then begin
tx := tx — 0.1;
InvalidateRect(Handle, nil,False);
end;
If Key = VK_DOWN then begin
tx := tx + 0.1;
InvalidateRect(Handle, nil,False);
end;
If Key = 49 then begin
Inc (mode);
If mode > High (mode) then mode:= Low (mode);
InvalidateRect(Handle, nil,False);
end;
If Key = 50 then begin
Inc (gluobj);
If gluobj > High (gluobj) thengluobj := Low (gluobj);
InvalidateRect(Handle, nil,False);
end;
If Key = 51 then begin
If orientation = INSIDE
then orientation := OUTSIDE
else orientation := INSIDE;
InvalidateRect(Handle, nil,False);
end;
If Key = 52 then begin
Inc (normals);
If normals > High (normals)then normals := Low (normals);
InvalidateRect(Handle, nil,False);
end;
end;
procedureTfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth,ClientHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 2, 9);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
// этот фрагмент нужен дляпридания трёхмерности
glTranslatef(0.0, 0.0, -5.0); //перенос объекта — ось Z
glRotatef(30.0, 1.0, 0.0, 0.0); //поворот объекта — ось X
glRotatef(70.0, 0.0, 1.0, 0.0); //поворот объекта — ось Y
InvalidateRect(Handle, nil,False);
end;
procedure TfrmGL.FormKeyPress(Sender:TObject; var Key: Char);
begin
if key = '-' then mx:=mx+1;
if key = '+' then mx:=mx-1;
InvalidateRect(Handle, nil,False);
end;
end.
Список використаної літератури
1. Блінова Т.О., Порєв В.М.Комп’ютерна графіка / За ред. В.М.Горєва. – К.: Видавництво “Юніор”, 2004. –456с., іл.
2. С.В.Глушаков, Г.А.КрабеКомпютерная графика, Харьков 2002
3. OpenGl, технология ставшая символов, Учебник в примерах.
4. Конспект лекцій з предмету«Комп’ютерна графіка».