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

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

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






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

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; просмотров: 381. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

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

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

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Уравнение волны. Уравнение плоской гармонической волны. Волновое уравнение. Уравнение сферической волны Уравнением упругой волны называют функцию , которая определяет смещение любой частицы среды с координатами относительно своего положения равновесия в произвольный момент времени t...

Медицинская документация родильного дома Учетные формы родильного дома № 111/у Индивидуальная карта беременной и родильницы № 113/у Обменная карта родильного дома...

Основные разделы работы участкового врача-педиатра Ведущей фигурой в организации внебольничной помощи детям является участковый врач-педиатр детской городской поликлиники...

Концептуальные модели труда учителя В отечественной литературе существует несколько подходов к пониманию профессиональной деятельности учителя, которые, дополняя друг друга, расширяют психологическое представление об эффективности профессионального труда учителя...

Конституционно-правовые нормы, их особенности и виды Характеристика отрасли права немыслима без уяснения особенностей составляющих ее норм...

Толкование Конституции Российской Федерации: виды, способы, юридическое значение Толкование права – это специальный вид юридической деятельности по раскрытию смыслового содержания правовых норм, необходимый в процессе как законотворчества, так и реализации права...

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