.
Тепер для позиціонування камери викликаємо gluLookAt наступним чином:
gluLookAt (eye [0], eye [1], eye [2], center [0], center [1], center [2], 0, 1, 0);
Тут eye - позначення E, center - позначення С. Даний виклик виконуємо в режимі пересування по сцені (в термінах програми - в «режимі польоту»), а виклик, описаний на початку розділу - в режимі огляду.
3.2 Отрісовка моделі
Використовуючи дерево моделі, отрисовку можна виконати таким чином: 1) якщо поточний вузол листовий, малюємо відповідне зображення, що накладається на полігон; використовуються функції OpenGL для роботи з текстурами - glBindTexture, glTexCoord2f [4]; 2) якщо поточний вузол внутрішній, рекурсивно викликаємо функцію отрисовки для дочірніх вузлів. У додатку А наведено лістинг функції отрисовки моделі.
У додатку А наведено вихідний код описаного алгоритму отрисовки.
3.3 Ефект туману
У OpenGL існують розвинені засоби забезпечення ефекту туману. Фактично його забезпечення зводиться лише до послідовної установці параметрів туману за допомогою функцій glFogf, glFogfv, glFogi, glHint і викликом GL_ENABLE (GL_FOG). [5]
3.4 Ефект снігопаду
Ефект снігопаду можна реалізувати, організувавши велику колекцію частинок - точок - і імітуючи їх рух. Загальна схема наведена на рис. 3.1. Спочатку «сніжинки» генеруються в «Верхньому шарі атмосфери» - підпросторі, яке знаходиться вище поля зору, і тим самим невидимо. Далі з кожним тиком таймера «сніжинки» зміщуються вниз на задану величину, і в «Нижньому шарі атмосфери», що знаходиться в полі зору, виникає ілюзія падіння сніжинок. Спочатку їх небагато, як і при початку реального снігопаду, потім їх кількість дещо збільшується і незабаром стабілізується - більше немає «сніжинок», що знаходяться в «Верхньому шарі атмосфери». Якщо якась із сніжинок досягла «землі», то вона переміщається на «кордон шарів». Це переміщення непомітно для користувача, оскільки «сніжинок» дуже багато - в даному проекті генерується 4 тис. Точок. Переміщати сніжинку в «верхній шар атмосфери» після її «приземлення» недоцільно - коли частина сніжинок вже «приземлилася», а частина ще «падає», у верхній частині «Нижнього шару атмосфери» виявиться помітна «пролом», де протягом ряду тиків таймера не буде «сніжинок».
Рис. 3.1 - Загальна схема імітації снігопаду
Важливим є питання про співвідношення висот «шарів атмосфери». Якщо висота верхнього менше висоти нижнього, то відбудеться наступне. У деякий момент всі «сніжинки» вже минуть частина «Нижнього шару атмосфери» поблизу «Кордони шарів», але жодна ще не «приземлиться». В результаті користувач помітить, як вгорі поля зору є область, де взагалі немає сніжинок, тобто «снігопад» виглядатиме вкрай неприродно. Такої проблеми немає, якщо згадані висоти рівні.
Для підвищення ефективності отрисовки «сніжинок» відсікаємо ті, які знаходяться в «Верхньому шарі атмосфери». Введення перевірки на відсіч призводить до деяких витрат часу, але вони незрівнянно менше, ніж виклик функції отрисовки для тих точок, які свідомо не видні.
У додатку Б наведено вихідний код описаного алгоритму.
3.5 Динамічне освітлення
За допомогою функцій glLightf і glLightfv [6] створюємо джерела світла з необхідними характеристиками. За допомогою таймера міняємо характеристики джерел, в даному проекті змінюється колір. Щоб підвищити реалістичність освітлення, доцільно забезпечити спадання інтенсивності освітлення в міру віддалення від джерела. Найпростіший спосіб - задати лінійний закон загасання, викликавши функцію glLightf з другим параметром GL_CONSTANT_ATTENUATION і потім з GL_LINEAR_ATTENUATION [2], в якості третього параметра передаючи необхідні коефіцієнти.
Зміну квітів можна організувати таким чином. Нехай є N джерел і M можливих комбінацій кольорів, K - номер поточної комбінації. У масиві A зберігаються кольору джерел, точніше, їх коди. Очевидно, що коди квітів можуть повторюватися. Елемент A [NK + p] містить код кольору, яка повинна придбати p-ая лампа при виборі K-ой комбінації (p=0 ... N - 1, K=0 ... M - 1). При черговому тику таймера міняємо номер поточної комбінації, потім для p-ой лампи (p=0 ... N - 1) встановлюємо колір A [NK + p], де K-номер нової комбінації.
Додаток А
Отрісовка моделі, представленої деревом
Для структури даних Node, описаної в розділі 2.2, передбачається рекурсивний метод Draw. Щоб отрисовать модель, потрібно викликати метод для кореня дерева.
Node :: Draw ()/* отрисовка ...