220.50K
Category: informaticsinformatics

Технології програмування КС (лекція 3)

1.

Технології програмування КС
лекція 3 (частина 2)
Проф. Цимбал О.М., кафедра ТАВР,
ХНУРЕ, Харків, Україна

2.

Команди відображення графічних примітивів OpenGL
Прямокутники можна побудувати і glRect*():
void glRect[d f i s] (type X1, type Y1, type X2, type Y2);
Для роботи потребується вказання двох діагональних вершин – (X1, Y1) та (X2, Y2).
glColor3f(0.0,0.0,1.0); // синій колір
glRectf(3.0,3.0,6.0,6.0); // діагональні вершини (3.0, 3.0) та (6.0, 6.0)
// rectangles
glColor3f(0.0,0.5,1.0);
glRecti(0,0,5,3);
glColor3f(1.0,0.5,0.0);
glRecti(-1,0,-5,-3);

3.

Команди відображення графічних примітивів OpenGL
Шаблон пунктирних або штрих-пунктирних ліній задається:
void glLineStipple(GLint factor, GLushort pattern);
де factor – масштабний коефіцієнт розтягування шаблону (значеннями від 1 до 256), а
pattern – 16-розрядна послідовність нулів та одиниць - штрихування лінії.
Лінія з точок (пунктир) - 0x0101, штрихова лінія – 0x00FF, штрих-пунктирна – 0x1C47.
Для використання штрихування необхідно за допомогою функції glEnable() включити
відповідний режим роботи OpenGL-програми.
glEnable(GL_LINE_STIPPLE);
glLineStipple(13.0,0x1C47);
glLineWidth(13.0);
glBegin(GL_LINES);
glColor3f(0.0,0.0,1.0);
glVertex3f(5.0f,0.0f,0.0f); glVertex3f(0.0f,5.0f,0.0f);
glColor3f(1.0,0.0,0.0);
glVertex3f(0.0f,0.0f,0.0f); glVertex3f(5.0f,5.0f,0.0f);
glEnd();
glDisable(GL_LINE_STIPPLE);

4.

Функції побудови складених об’єктів
Для реалізації OpenGL у Microsoft Windows існує (у заголовковому файлі glaux.h)
наявність функцій, що забезпечують побудову складених графічних об’єктів із
каркасними (Wire) та твердотільними (Solid) тривимірними моделями.
void auxWireSphere(GLdouble);
// сфера
void auxWireCube(GLdouble);
// куб
void auxWireBox(GLdouble, GLdouble, GLdouble); // призма
void auxWireTorus(GLdouble, GLdouble); // тор
void auxWireCylinder(GLdouble, GLdouble); // циліндр
void auxWireIcosahedron(GLdouble);
// ікосаедр
void auxWireOctahedron(GLdouble);
// октаедр
void auxWireTetrahedron(GLdouble);
// тетраедр
void auxWireDodecahedron(GLdouble);
// додекаедр
void auxWireCone(GLdouble, GLdouble); // конус
void auxWireTeapot(GLdouble);
// чайник

5.

OpenGL як кінцевий автомат
OpenGL є кінцевим автоматом, який може переводитися у різні стани та залишатися
у певному стані, доки цей стан не буде змінено новою командою.
Змінними стану забезпечується керування кольором об’єктів, поточною
візуалізацією, перетвореннями проекцій, шаблонами штрихування ліній, режимами
введення багатокутників, пакування пікселів, контролювати властивості матеріалів,
встановлювати розташування та визначати режими роботи джерел освітлення тощо.
За замовчуванням більшість режимів є неактивними (більше 40 режимів).
Для увімкнення та вимкнення режимів використовуються прості команди:
void glEnable(GLenum cap);
void glDisable(GLenum cap);
GL_BLEND – керування змішуванням; GL_DEPTH_TEST – керування тестом глибини;
GL_FOG – керування туманом;
GL_LINE_STIPPLE – штрихування ліній;
GL_TEXTURE_2D – 2D-текстури;
GL_LIGHTING – керування освітленням.
glEnable(GL_LINE_STIPPLE) можна увімкнути штрихування ліній, а командою
glDisable(GL_LIGHTING) вимкнути освітлення робочої сцени візуалізації.
gllsEnabled(GLenum cap) - перевірка стану: (); // повертають GL_TRUE та GL_FALSE

6.

Команди візуалізації OpenGL
•Основним призначенням комп’ютерної графіки є створення двовимірного
зображення тривимірних об’єктів..
•Перетворення тривимірних координат об’єктів у піксельні точки на екрані включає
операції моделювання, візуалізації, вибору кадру (viewing), отримання проекцій.
•До операцій візуалізації належать обертання (rotation), паралельне перенесення
(translation), масштабування (scaling), дзеркальне відображення (reflecting),
отримання ортогональних та перспективних проекцій.
•Для виведення сцени використовується комбінація декількох перетворень.
•Оскільки виведення графічної інформації відбувається у прямокутне вікно, об’єкти
(або частини об’єктів), що знаходяться за межами цього вікна, мають відсікатися. У
тривімірній графіці відсікання виконується за допомогою відкидання об’єктів, що
знаходяться по один бік площини відсічення.
•Відповідність між перетвореними координатами та пікселями екрана
забезпечується операцією перетворення порту перегляду (viewport).

7.

Команди візуалізації OpenGL
Для отримання необхідної сцени під час візуалізації виконуються операції
перетворення - аналоги отримання знімку фотокамерою.
Перелік кроків отримання знімку:
•встановити штатив, направити камеру на сцену для вибору кадру (view transformation);
•встановити бажану композицію сцени, що фотографується, для перетворення
моделі (modeling transformation);
•обрати об’єктив камери та визначити масштаб для перетворення проекції (project
transformation);
•визначити наскільки завеликою має бути кінцевий знімок для перетворення порту
перегляду (viewport transformation).

8.

Команди візуалізації OpenGL
У OpenGL вершини завжди задаються чотирма координатами.
Використовуються однорідні координати, що надають можливість подання усіх видів
координатних перетворень у єдиній формі. В однорідній системі координат
положення точки P(x, y, z) записується у вигляді P(W·x, W·y, W·z) або P(X, Y, Z, W) для
будь-якого масштабного множника.
Узагальнена матриця перетворень тривимірних координат розміру 4 x 4 має вигляд:
a
b
c
p
d h l
a d
e i m при цьому підматриця b e
f j n – зміну масштабу,
c f
q r s
l
Вектор m
n
h
i здійснює лінійні перетворення
j зсув та обертання.
здійснює паралельне перенесення,
вектор p q r здійснює перспективне перетворення,
скалярний елемент s – загальну зміну масштабу.

9.

Команди візуалізації OpenGL (матричні перетворення)
void CSDialog::rotateMatrix(double angle, double x, double y, double z)
{ double fi=pi*angle/180.0;
double rotate[16];
if(x==1.0){ double rotateX[16]= {1.0,0.0, 0.0, 0.0,
0.0,cos(fi),-sin(fi),0.0,
0.0,sin(fi), cos(fi),0.0,
0.0,0.0, 0.0, 1.0};
for(int i=0;i<16;i++)rotate[i]=rotateX[i];
}
if(y==1.0){ double rotateY[16]={cos(fi),0.0,sin(fi),0.0,
0.0, 1.0, 0.0, 0.0,
-sin(fi),0.0,cos(fi),0.0,
0.0, 0.0, 0.0, 1.0};
for(int i=0;i<16;i++)rotate[i]=rotateY[i];
}
if(z==1.0){
double rotateZ[16]= {cos(fi),-sin(fi),0.0,0.0,
sin(fi), cos(fi),0.0,0.0,
0.0, 0.0, 1.0,0.0,
0.0, 0.0, 0.0,1.0};
for(int i=0;i<16;i++)rotate[i]=rotateZ[i];
}
multMatrix(curMatrix2,rotate);
}

10.

Матричні перетворення у OpenGL
Будь-яка матриця може бути встановлена як поточна за допомогою команди glMatrixMode():
void glMatrixMode(GLenum mode); // mode визначає, який набір матриць обрано.
Значення параметра
Коментар
GL_MODELVIEW Послідовність операцій над матрицями застосовується до матриці вигляду
GL_PROJECTION Послідовність операцій над матрицями застосовується до матриці проекції
GL_TEXTURE
Послідовність операцій над матрицями застосовується до матриці текстури
Визначення (завантаження) елементів матриці забезпечує glLoadMatrix*():
void glLoadMatrix [f d] (GLtype *m); // m – покажчик на 4x4-матрицю
// (типу float або double)
void glLoadIdentity() замінює поточну матрицю на одиничну
(матрицю ідентичності).
glMultMatrix*() здійснює операцію перемноження матриці
m (розміром 4x4) на поточну матрицю:
void glMultMatrix [f d] (GLtype *m);
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
a1 a5 a9 a13
a a a
a
2
6
10
14
a3 a7 a11 a15
a
a
a
a
8
12
16
4
English     Русский Rules