Основи програмування OpenGL в Borland С + + Builder і
Delphi. Найпростіші об'єкти h2>
Луковкін Сергій p>
Розглядаючи будь-який тривимірний об'єкт, ми завжди
визначаємо його розташування і розміри щодо деякої звичної, і зручною
зараз системи координат, пов'язаної з реальним світом. Така
вихідна система координат в комп'ютерній графіці є правобічної і
називається світовою системою координат .... p>
Для того, щоб можна було зобразити об'єкт на екрані, його
необхідно попередньо перевести (або перетворити) в іншу систему
координат, яка пов'язана з точкою спостереження і носить назву видовий системи
координат. Ця система координат є лівосторонньої. І, нарешті, будь-яке
тривимірне зображення ми завжди малюємо на двовимірному екрані, який має свою
екранну систему координат. (Цей абзац я списав у Ю. Тихомирова). P>
правостороння
система координат (світова) p>
лівостороння
система координат (видова) p>
p>
p>
За замовчуванням, площину xOy паралельна екрану, а вісь Z
спрямована у світових координатах до нас, у видових - від нас. p>
Перехід до нових координатах h2>
У OpenGL всі об'єкти малюються на початку координат, тобто в
точці (0,0,0). Для того, щоб зобразити об'єкт в точці (x1, y1, z1),
треба перемістити початок координат в цю точку, тобто перейти до нових
координатах. Для цього в OpenGL визначені дві процедури: p>
glTranslate [fd] (Dx, Dy, Dz) - зрушує початок координат на
(Dx, Dy, Dz) p>
glRotate [fd] (j, x, y, z) - повертає систему координат на
кут j (в градусах) проти годинникової стрілки навколо вектора (x, y, z) p>
ПРИМІТКА: [fd] - означає, що в кінці може бути або
буква "f", або "d". p>
Тепер варто сказати ще про дві процедури: p>
glPushMatrix p>
glPopMatrix p>
Перша призначена, для збереження, а другий - для
відновлення поточних координат. Дуже зручно за допомогою glPushMatrix зберегти
поточні координати, потім зрушуватися і звертатися як завгодно, а після, викликом
glPopMatrix, повернутися до вихідних координатах. Параметрів у цих процедур немає. P>
Частина 2. Найпростіші фігури h2>
Найпростіші об'ємні фігури h2>
У прикладі з минулої статті ми створили сферу. Для цього ми
використовували механізм з glu32.dll. Алгоритм був такий: p>
1. Створюємо об'єкт типу GLUquadricObj p>
2. Ініціалізіруем його функцією gluNewQuadric p>
3. Встановлюємо стиль фігури функцією
gluQuadricDrawStyle (quadObj, GLU_FILL). Стиль може бути GLU_FILL, GLU_LINE,
GLU_SILHOUETTE або GLU_POINT. Що кожен з них означає, перевірте самі. P>
4. Робимо з quadObj (об'єкта типу GLUquadricObj) сферу,
циліндр, конус, диск або частину диска. Для цього визначені такі функції: p>
· gluSphere (quadObj, radius, slices, loops). Три останніх
параметри - це радіус і кількість розбиття впоперек і вздовж осі Z
відповідно. p>
· gluCylinder (quadObj,
baseRadius, topRadius, height, slices, loops). Після
quadObj йдуть наступні параметри: радіус нижньої основи, радіус верхнього
підстави, висота і кількість розбиття впоперек і вздовж осі Z відповідно.
Очевидно, що ця функція задає як циліндр, так і конус. P>
· gluDisk (quadObj,
innerRadius, outerRadius, slices, loops). Тут
після quadObj вказуються внутрішній і зовнішній радіуси диска. p>
· gluPartialDisk
(quadObj, innerRadius, outerRadius, slices, loops, startAngle, sweepAngle). Тут додаються два параметри: кут (в градусах), з
якого почнеться малювання диска, і кут, яким малювання закінчиться. p>
5. Звільняємо пам'ять, зайняту під quadObj функцією
gluDeleteQuadric (quadObj). p>
Тепер ви можете малювати прості тривимірні фігури! p>
Примітиви h2>
Будь-яку тривимірну фігуру, яка б складна вона не була,
можна розбити на двомірні (плоскі) складові. Ці складові я і буду
називати примітивами, хоча деякі автори вважають, що примітивами слід
обізвати вищеперелічені тривимірні фігури. p>
Примітиви визначаються однією або декількома точками,
які в OpenGL задаються всередині командних дужок glBegin/glEnd: p>
С + + p>
void glBegin (mode); p>
void glEnd (); p>
Delphi p>
procedure glBegin (mode); p>
procedure glEnd; p>
Параметр mode показує, які примітиви будуть малюватися.
Доступні наступні значення: p>
GL_POINTS p>
Кожна вершина - окрема точка p>
GL_LINES p>
Кожна пара вершин - окрема лінія. Якщо
число вершин непарній, то остання ігнорується p>
GL_LINE_STRIP p>
Послідовність пов'язаних відрізків.
Перші дві вершини - перший відрізок. Третя вершина визначає другий відрізок
з початком в кінці першого і кінцем в цій вершині і т.д p>
GL_LINE_LOOP p>
Аналогічний GL_LINE_STRIP, тільки остання
вершина з'єднується відрізком з перших. p>
GL_TRIANGLES p>
Кожна трійка вершин - окремий трикутник p>
GL_TRIANGLE_STRIP p>
Група пов'язаних трикутників. Перші три
вершини - перший трикутник. Друга, третя і четверта вершини - другий
трикутник і т.д. p>
GL_TRIANGLE_FAN p>
Також група пов'язаних трикутників. Перші
три вершини - перший трикутник. Перша, друга і четверта вершини - другий
трикутник і т.д. p>
GL_QUADS p>
Кожні чотири вершини - окремий
чотирикутник. p>
GL_QUAD_STRIP p>
Група пов'язаних чотирикутників. Перші
чотири вершини - першого чотирикутник. Третя, четверта, п'ята і шоста
вершини - другий чотирикутник і т.д. p>
GL_POLYGON p>
Малює окремий опуклий багатокутник
(один). p>
Особливу увагу потрібно приділити GL_QUAD_STRIP. Тут не
зовсім зрозумілий, але дуже зручний порядок вказівки вершин: p>
p>
У кожного примітиву є мінімальне число вершин. Якщо
вказане число вершин менше мінімального для даного примітиву, то примітив
не малюється. p>
Залишилося тільки сказати, як задати вершину. Для цього
визначена наступна процедура: p>
glVertex [2 3 4] [s i f
d] [v] (coord) p>
Вершина визначається чотирма параметрами: координати x, y,
z і параметр w - коефіцієнт, на який ділиться кожна з координат, тобто w
визначає масштаб. За замовчуванням z = 0, w = 1, тобто коли ви викликаєте, наприклад,
glVertex2f (1,1) насправді викликається glVertex4f (1,1,0,1). p>
З кожною вершиною пов'язані деякі дані: p>
· Поточний колір - колір вершини (остаточний колір вираховується
з урахуванням світла). Колір задається процедурою glColor * p>
· Поточні координати текстури - координати текстури,
відповідні цієї вершини. Задаються процедурою glTexCoord * p>
· Поточна нормаль - вектор нормалі, що відповідає даній
вершині. Здається процедурою glNormal * p>
· Поточна позиція растру - використовується для визначення
положення растра при роботі з пікселями і бітовими масивами. задається
процедурою glRasterPos * p>
ПРИМІТКА: замість зірочки '*' ставляться відповідні
суфікси; таке скорочення прийнято в багатьох документація з OpenGL. p>
Точки h2>
Намалювати точку дуже просто. Наступний код зображує 10
точок різного розміру. p>
С + + p>
void TForm1:: Draw () p>
( p>
glClear (GL_DEPTH_BUFFER_BIT
or GL_COLOR_BUFFER_BIT); p>
glColor3f (1,1,1);
p>
Byte i; p>
for (i = 0; i