ті вказується в двох місцях. Але при такій організації даних можна передбачити ситуацію, коли ця загальна стіна виглядає по-різному з боку кожної з клітин - наприклад, з одного боку це просто дерев'яна стіна, з іншого боку на стіні щось намальовано.
ModelInfo/* структура ДАНІ ПРО МОДЕЛЬ ЛАБІРИНТУ */
{Nx, Nz;/* Розміри (всього буде Nx * Nz клітин) */FIELDS [10] [10];/* Дані про клітинах */
.../* методи */
};
Структура даних вузол дерева моделі - у разі листа зберігає вершини відповідного полігону і номер зображення, який накладається на полігон, а в разі внутрішнього вузла - покажчики на дочірні вузли і лічильник дочірніх вузлів. Теоретично дерево моделі можна представити за допомогою двох типів вузлів - корисні (листя, зберігають полігони) і допоміжні (внутрішні вузли, зберігають посилання на інші вузли), але з точки зору програмної реалізації простіше обмежитися одним типом вузлів, в якості полів передбачивши всі можливі даних- як посилальні, так і корисні. У цьому випадку ознакою листа є нульове значення лічильника дочірніх вузлів.
Node/* структура даних ВУЗОЛ ДЕРЕВА МОДЕЛІ */
{D Square [4];/* Вершини відповідного полігону (потрібні тільки для листя) */texture_type;/* Номер зображення, яке слід накласти на полігон (потрібен тільки для листя) */n_children;/* Кількість дітей (для листя дорівнює 0, для інших вузлів чого завгодно) */* Children [100];/* Діти (не використовується при обробки листя) */Draw ();/* Отрисовка для поддерева, де поточний вузол - корінь */() {n_children=0; }/* Конструктор */
};
У файлі лабіринт, що містить mxn клітин, доцільно зберігати як таблицю з mxn четвірок номерів. У кожній четвірці - номери зображень стін відповідної клітини. Якщо якась стіна відсутня, відповідний номер набуває спеціальне значення (в даній роботі - нульове).
2.3 Переваги та недоліки підходу
Переваги запропонованого представлення моделі у вигляді дерева наступні:
) одноманітна обробка різних частин моделі;
) простота програмної реалізації;
) простота отримання самих різних даних про моделі - все можна звести до обходу дерева;
) простота модифікації моделі до більш складної - складність ієрархії об'єктів і число рівнів ієрархії обмежено лише об'ємом доступної пам'яті.
Недолік також є - це далеко не оптимальне використання пам'яті. Навіть при оптимальній організації окремих вузлів дерева внутрішні вузли самі по собі не зберігають корисних даних. При розмірі лабіринту mxn є (3 + mn) внутрішніх вузлів. Кількість корисних вузлів не менше mn і не більше 5mn. Якщо ж врахувати, що будь-яка клітина лабіринту не може бути оточена стінами з усіх боків (інакше в неї не можна потрапити), то кількість корисних вузлів може досягати 4mn, тобто частка допоміжних вузлів складе не менше 20% від загального числа вузлів.
3. Розробка графічних алгоритмів
.1 Управління оглядом сцени
Щоб розглянути сцену з різних сторін, потрібно ввести параметр, варіювання якого дозволить як би обійти сцену по колу. Можна ввести кут огляду і скористатися функцією gluLookAt:
(DX, DY, DZ, DX + d * sin (fi), 0, DZ - d * cos (fi), 0, 1, 0);
Тут (DX, DY, DZ) - точка, звідки ми дивимося, d - відстань до точки, в яку ми дивимося. DY слід вибрати так, щоб камера була трохи вище стін лабіринту - тоді ми бачимо, що знаходиться всередині лабіринту. Варіюючи параметр fi, ми можемо «облетіти» лабіринт, побачивши його з усіх боків.
Для пересування по сцені вводимо поняття точки глядача, що задається вектором, цільової точки, що задається вектором, швидкості переміщення v і кута повороту w. Точка E визначає, де знаходиться глядач (перші 3 параметра функції gluLookAt), крапка C - куди він дивиться (друга три параметри gluLookAt), від параметра v залежить зсув координат E і C при імітації кроків вперед і назад. Параметр w визначає мінімальний кут повороту напрямку руху і повинен бути досить малий, в іншому випадку повороти будуть різкими і неприродними. Напрямок руху визначається як вектор, проведений між точками E і C, і буде позначатися як.
Щоб зміститися вперед, потрібно змістити вперед координати x і z точок E і C на величини і. Очевидно, що зміщення назад - зворотна операція. Для повороту напрямку руху потрібно виконати перетворення
Для повороту в інший бік потрібно замінити w на -w.
Найпростіше виконується зміна висоти огляду - потрібно лише змінити ey на фіксовану величину...