Студопедия — Короткі теоретичні відомості. Прямий метод визначення координат вершин одиничного куба полягає у використанні масиву з двома індексами
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

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






Прямий метод визначення координат вершин одиничного куба полягає у використанні масиву з двома індексами, такого як

GLint points [8] [3] = { 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0,

0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1};

Або можна спочатку визначити тип даних координат точки в тривимірному просторі, а потім задавати координати кожної вершини як елемента масиву з одним індексом, наприклад, так:

typedef GLint vertex3 [3];

vertex3 pt [8] = {0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0,

0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1 };

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

glBegin (GL_POLYGON) або glBegin (GL_QUADS).

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

void quad (GLint nl, GLint n2, GLint n3,Glint n4){

glBegin (GL_QUADS);

glVertex3iv (pt [nl]);

glVertex3iv (pt [n2]);

glVertex3iv (pt [n3]);

glVertex3iv (pt [n4]);

glEnd ();

}

void cube (){

quad (6 2 3 7)

quad (5 1 0 4)

quad (7 3 1 5)

quad (4 0 2 6)

quad (2 0 1 3)

quad (7 5 4 6)

}

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

1. Викликати функцію glEnableClientState (GL_VERTEX_ARRAY), щоб активізувати можливість створення масиву вершин в OPENGL.

2. Скористатися функцією glVertexPointer, яка задає місцезнаходження і формат даних для координат вершин.

3. Зобразити сцену за допомогою стандартної процедури – glDrawElements, яка може обробляти декілька примітивів за допомогою невеликої кількості звернень до функцій.

Наприклад:

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(3, GL_INT, 0, pt);

GLubyte vertIndex[ ]={6,2, 3, 7, 5, 1, 0, 4, 7, 3, 1, 5, 4, 0, 2, 6, 2, 0, 1, 3, 7, 5, 4, 6};

glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,vertlndex);

Команда glEnableClientState (GL_VERTEX_ARRAY) активізує можливість (у даному випадку створення масиву вершин) з боку клієнта системи клієнт-сервер. Оскільки дані про рисунок зберігаються у клієнта (на машині, що запускає головну програму), то масив вершин також повинен знаходитися там. Cервер віддає команди і виводить рисунок на екран. Клієнтом і сервером може бути одна машина. Можливість пакета OPENGL створювати масив вершин відключається за допомогою наступної команди.

glDisableClientState (GL_VERTEX_ARRAY);

Перший параметр функції glVertexPointer позначає число координат, яке задається для кожної вершини. Другий параметр – символьна константа GL_INT задає тип даних для координат вершин. Інші типи даних описуються за допомогою символьних констант GL_BYTE, GL_SHORT, GL_FLOAT і GL_DOUBLE. Третій параметр задає зсув (у байтах) між сусідніми вершинами. Даний аргумент дозволяє використовувати в одному масиві різні типи інформації, такі як координати і кольори. Оскільки в прикладі задається тільки інформація про координати, параметру зсуву присвоюється значення 0. Останній параметр указує масив вершин, у якому містяться значення координат.

У масив vertIndex записуються всі індекси вершин куба. Вони є індексами масиву pt, відповідними значенням координат вершин. Даний список індексів застосовується як останній параметр функції glDrawElements. Він використовується примітивом GL_QUADS як перший параметр при зображенні набору чотирикутних поверхонь куба. Другий параметр позначає кількість елементів У масиві vertIndex. Для чотирикутника потрібно тільки чотири вершини, необхідно задати 24. Функція glDrawElements зображує сторону куба, утворену наступними чотирма вершинами, і так до тих пір, поки не будуть оброблені всі 24 вершини. Таким чином буде отримано зображення всіх граней куба. Третій параметр функції glDrawElements задає тип значень індексів. У прикладі індексами є невеликі цілі числа, тип даних описується як GL_UNSIGNED_BYTE. При позначенні індексів можуть використовуватися ще два типи даних — GL_UNSIGNED_SHORT і GL_UNSIGNED_INT.

Щоб спростити обробку опису сцени, до масиву вершин окрім значень координат можна ввести коди кольору й інші параметри об'єкта. Доступ до них можна отримати за допомогою функції glDrawElements.

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

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

Щоб створити таблицю відображень, необхідно створити набір команд OPENGL з пари функцій glNewList/glEndList. Наприклад, так.

glNewList (listID, listMode);

glEndList ();

Параметру listID, що позначає ім'я таблиці, присвоюється додатне ціле значення. Параметру listMode присвоюється значення символьної константи OPENGL (GL_COMPILE або GL_COMPILE_AND_EXECUTE). Для зберігання таблиці використовується команда GL_COMPILE. Команди виконуються відразу після того, як потрапляють до таблиці.

Щоб реалізувати одну таблицю відображення, використовується оператор

glCallList (listID);

Приклад створення і реалізації таблиці відображення:

const double TWO_PI = 6.2831853;

GLuint regHex;

GLdouble theta; GLint x, y, k;

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

regHex = glGenLists(1);

//Таблиці відображення присвоюється ідентифікатор.

glNewList (regHex, GL_COMPILE);

glBegin (GL_POLYGON);

for (k =0; k < 6; k++){

theta = TWO_PI * k /6.0;

x = 200 + 150 * cos(theta);

y = 200 + 150 * sin(theta); glVertex2i (x,y); }

glEnd ();

glEndList();

glCallList(regHex);

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

Декілька таблиць відображень можна реалізувати за допомогою наступних двох операторів.

glListBase (offsetValue);

glCallLists (nLists, arrayDataType, listІDArray);

Параметр nLists – ціле число таблиць, параметр listIDArray — це масив, що складається з ідентифікаторів таблиць відображень. У загальному випадку, масив listIDArray може містити будь-яку кількість елементів, при цьому недійсні ідентифікатори таблиць відображень просто ігноруються. Елементи масиву listIDArray можуть задаватися в різних форматах даних, параметр arrayDataType – тип даних, наприклад, GL_BYTE, GL_INT, GL_FLOAT, GL_3_BYTES або GL_4_BYTES. Щоб визначити ідентифікатор таблиці відображень, слід додати значення елементу масиву listIDArray до цілого значення параметра offsetValue, яке задається у функції glListBase. За замовчанням значення параметра offsetValue дорівнює 0.

Цей механізм дозволяє з’єднувати групи зв'язаних таблиць відображень, ідентифікатори яких утворюються із символьних назв або кодів. Характерний приклад – набір, що утворює шрифт, де кожен ідентифікатор таблиці відображень – це ASCII-код символу. Параметр offsetValue з функції glListBase – опис декількох наборів-шрифтів, з його допомогою можна отримати певний шрифт, описаний у масиві listІDArray.

Видалення набору наступних таблиць відображень:

glDeleteLists (startID, nLists);

Параметр startID дає значення ідентифікатора першої таблиці відображень, параметр nLists задає кількість таблиць, які слід видалити. Наприклад, за допомогою оператора – glDeleteLists (5, 4) будуть видалені чотири таблиці відображень з ідентифікаторами 5, 6, 7 і 8. Значення ідентифікатора, відповідного неіснуючій таблиці відображення, ігнорується.

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

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

glutReshapeFunc (winReshapeFcn);

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







Дата добавления: 2015-10-19; просмотров: 385. Нарушение авторских прав; Мы поможем в написании вашей работы!



Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

Тема 2: Анатомо-топографическое строение полостей зубов верхней и нижней челюстей. Полость зуба — это сложная система разветвлений, имеющая разнообразную конфигурацию...

Виды и жанры театрализованных представлений   Проживание бронируется и оплачивается слушателями самостоятельно...

Что происходит при встрече с близнецовым пламенем   Если встреча с родственной душой может произойти достаточно спокойно – то встреча с близнецовым пламенем всегда подобна вспышке...

Характерные черты немецкой классической философии 1. Особое понимание роли философии в истории человечества, в развитии мировой культуры. Классические немецкие философы полагали, что философия призвана быть критической совестью культуры, «душой» культуры. 2. Исследовались не только человеческая...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит...

Кран машиниста усл. № 394 – назначение и устройство Кран машиниста условный номер 394 предназначен для управления тормозами поезда...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия