Міністерство освіти та науки України
Вид материала | Документы |
Содержание3.1. Основні поняття ЗD-графіки 3.2. Основні прийоми для роботи з світлом в 3D 3.3 Алгоритми рельєфного текстурування 3.3.2 Normal mapping 3.3.3 Parallax mapping 3.3.4 Relief mapping 3.3.5 Простий Relief Mapping 3.3.6 Багатошаровий Relief Mapping 3.4 Основні прийоми для роботи з текстурами в 3D 3.5 Основні поняття про шейдер та види шейдерів 3.6. Генерація тривимірних ландшафтів Уявлення даних про ландшафт Перший варіант - використання карти висот Другий спосіб - іррегулярна сітка Спосіб третій - посегментна карта висот Текстури для ландшафтів Другий варіант Генерація ландшафту Генерація ландшафтів з використанням Холмового алгоритму (Hill Algoritm) Як згенерувати один горб ... 4 5 6 7 3.1. Основні поняття ЗD-графіки В процесі роботи з ЗD-графікою[1] використовуються наступні компоненти: ЗD-акселератор, чи ЗD-прискорювач (ЗD-accelerator) – відеокарта, здатна брати на себе обробку тривимірної графіки, звільняючи в такий спосіб центральний процесор від цієї рутинної роботи. ЗD-конвейер( чи конвеєр рендеринга 3D-pіpelіne, чи renderіng pіpelіne)- багатоступінчастий процес перетворення внутрішніх дані програми в зображення на екрані. Звичайно включає як мінімум трансформацію і висвітлення, текстурування і растерізацію. ЗD-сцена - частина віртуального тривимірного світу, що підлягає рендерингу в даний момент часу. Рендеринг (renderіng) - процес візуалізації тривимірного зображення. Складається з безлічі етапів, у сукупності називаних конвеєром. Тексел (texel) - це піксель, але не екрану, а текстури. Мінімальний її елемент. Тесселяція (tesselatіon) - процес розподілу складних полігонів і кривих поверхонь, описаних математичними функціями, на прийнятні для ЗD-акселератора трикутники. Крок цей найчастіше необов'язковий, скажемо, ЗD-моделі в більшості ігор звичайно і так уже складаються з трикутників. Але від, наприклад, закруглені стіни в Quake ІІІ: Arena - приклад об'єкта, для якого теселяція необхідна. Точка, чи вершина (vertex) - точка в просторі, завдань трьома координатами (х, у, z). Окремі точки рідко використовуються, Але смороду є основою для більш складних об’єктів: ліній, трикутників, крапкових спрайтів. Крім самих координат, до крапки можуть "прив'язуватися" інші дані: координати текстури, властивості висвітлення і туману і т.д.. Трансформація - загальний термін для позначення процесу багатоступінчастого перетворення ЗD-обєктів у двовимірне зображення на екрані. Являє собою переклад набору вершин з однієї системи координат в іншу. Трикутник (trіangle) - Практично вся тривимірна графіка складається з трикутників як найпростіших і зручних для обробки примітивів - три точки завжди однозначно задають площину в просторі, чого не скажеш про більш складні багатокутники. Всі інші багатокутники і криволінійні поверхні розбиваються на трикутники (по суті - плоскі ділянки), які потім використовуються для обчислення освітлення і накладення текстур. Процес цей називається теселяція. Z-буфер (Z-buffer) - Z-буферизація – це один з методів видалення невидимих ділянок зображення. При його використанні для шкірного пікселя на екрані в пам'яті-відео-пам'яті зберігається відстань від цієї крапки до спостерігача. Сама відстань називається глибиною сцени, а ця ділянка пам'яті - Z-буфером. При висновку чергового пікселя на екран його глибина порівнюється зі збереженої в Z-буфері глибиною попереднього пікселя з такими ж координатами, і якщо вона більше, ті поточний пиксел не малюється - він буде невидимим. Якщо ж менше, ті його колір заноситися в буфер кадру (frame buffer), а нова глибина - у Z-буфер. У такий спосіб гарантується перекривання далеких об'єктів більш близькими. Антіаліасинг (antіalіasіng) - метод боротьби з "східчастим" ефектом і різкими границями полігонів, що виникають через недостатній дозвіл зображення. Найчастіше реалізується шляхом рендеринга зображення в дозволі, набагато більшому встановленого, з наступною інтерполяцією в потрібне. Томові антіаліасинг дотепер дуже вимогливий до обсягу відеопам'яті і швидкості ЗD-акселератора. Кадровий буфер (frame buffer) - ділянка відео пам’яті, у до-тором виробляється робота з формування зображення. Звичайно використовуються два (рідше три) буфери кадри: один (передній, чи front-buffer) відображається на екрані, а в другий (задній, чи back-buffer) виконується рендеринг. Як тільки черговий кадр зображення буде готовий, вони поміняються ролями: другий буфер буде показань на екрані, а перший перемальований заново. Піксель (pіxel) - окрема точка на екрані, мінімальний елемент зображення. Характеризується глибиною кольору в бітах, що визначає максимально можлива кількість квітів, і власне значенням кольору. Простір («space», чи система координат) - деяка частина тривимірного світу, у якій відлік ведеться від якогось свого початку координат. Обов'язково є система світових (world) координат, відносно початку якої виміряються положення й орієнтація всіх інших об'єктів у 3D-Світі, при цьому в шкірного з них є своя система координат. 3.2. Основні прийоми для роботи з світлом в 3D: Карти освітлення (lіghtmap) [1] - це простий і дотепер що часто застосовується метод імітації висвітлення, що полягає в накладенні на основну текстуру ще однієї - карти освітленості, світлі і темні місця якої відповідно освітлюють чи затінюють зображення базової. Карти освітленості розраховуються заздалегідь, ще на етапі створення 3D-Світ, і зберігаються на диску. Цей метод добре підходить для великих, статичних освітлених поверхонь. Освітлення (lіghtіng) - процес розрахунку кольору і ступені освітленості пікселя шкірного трикутника в залежності від розташованих поруч джерел світла з використанням одного з методів затінювання. Часто застосовуються наступні методи:-плоске затінення (flat shadіng). Трикутники мають однакову освітленість по всій поверхні; -затінення Гуро (Gouraud shadіng). Інформація про рівень освітленості і кольорі, розрахована для окремих вершин трикутника, просто інтерполюється по поверхні всього трикутника; -затінення Фонга (Phong shadіng). Висвітлення розраховується індивідуально для шкірного пікселя. Найбільш якісний метод. 3.3 Алгоритми рельєфного текстурування 3.3.1 Рельєфне текстурування (bump mappіng) Ефект додання поверхні шорсткостей рельєфу [2] за допомогою додаткової текстури, називаною картою рельєфу (bump map). Геометрія поверхні при цьому не міняється, так що ефект добре розрізнимо тільки при наявності динамічних джерел світла. Першим методом створення рельєфності об'єкту став Bump Mapping, в просторіччі просто «бамп». Сенс технології в тому, що нерівності об'єкту задаються однією-єдиною картинкою (вона називається бамп-картою), що складається з градацій сірого кольору (від 0 до 255). Чим біліше піксель (ближче до коду 255), тим більше він «підведений» над поверхнею, темнішому пікселю (ближче до 0) відповідає більш «поглиблене» положення. Для свого часу бамп був дуже хороший, але вимоги до зображення невблаганно росли. І ось вже технологія, яка враховує тільки напрям світла і ступінь підведеної/поглибленої пікселів, не може забезпечити потрібної якості картинки. Та ще і «пластиковості» як показано на Рис..11., властива бампу, давала про себе знати. Частково тому, а частково і тому, що карти Bump Mapping майже завжди доводиться створювати уручну (якісного алгоритму автоматизації даної роботи як не було, так і немає), розробники все рідше використовують його в своїх розробках. 3.3.2 Normal mapping На зміну бампу [2] прийшло друге покоління алгоритмів рельєфного текстурування. Воно отримало назву Normal Mapping як показано на Рис.12 (іноді, досить рідко, його називають «нормалом» або «нормалями»). Головна відмінність Normal Mapping від бампа - вища точність обчислення, яка досягається за рахунок додавання в карту даних про орієнтацію нормалей (перпендикулярів) поверхні. Ще одна важлива особливість - Normal Mapping карти можна генерувати в автоматичному режимі, а не малювати довгими зимовими вечорами в Photoshop. Сенс нормала досить простий: на основі текстури високополігональної моделі будується так звана карта різниці, яка, будучи накладеною на низькополігональний об'єкт, робить його незвичайно важким на багатополігональній. Начебто полігонів мало, а картинка виглядає, немов в ній їх багато мільйонів. У карті нормалей колір кожного пікселя задає орієнтацію нормалі в даній точці поверхні. Просторовим координатам (X,Y,Z) відповідає трійка квітів (R,G,B). Значення R, G, B варіюються в межах від 0 до 255, причому 127 відповідає нулю. Тобто блакитний колір (127, 127, 255) описує просто гладку поверхню, а вони на низькополігональній і високополігональній моделі однакові. Це пояснює, чому карти нормалей мають в основному блакитний колір, а деталі виділяються іншими кольорами. Звернете увагу, в карті нормалей альфа-канал зображення містить стандартну карту Bump Mapping. У комп'ютерних іграх карти нормалей зробили справжній переворот. Ажіотаж став підніматися кілька років тому навколо гри Doom III, де використання normal mapping просто шокувала уява якістю картинки. Проте, раніше Doom вся своя «нормальна» краса показала гра Far Cry. Технологія нормалей провела революцію в створенні комп'ютерних ігор, мабуть, більшу, ніж свого часу бамп. Тепер всі об'єкти не тільки виглядають об'ємними, але і виглядають реалістично, а не гламурно-пластиковими. Зараз складно знайти екшен або навіть стратегію, ядро якої не використав би карти нормалей. Це стандарт де-факто. Наприклад, у відомому послідовнику Doom 3 - Quake 4 - для створення карт нормалей використовувалися високополігональні моделі персонажів, що складаються з більше 5 (!) мільйонів полігонів. Проекти в найближчому майбутньому також використовуватимуть карти нормалей для своїх потреб. Наприклад, в Unreal Engine 3.0 якість персонажів буде здатна довести до нестями саме завдяки normal mapping. Це був ворожий персонаж з прийдешнього хіта Gears of War. Ще одна гра на цьому ж движку, яка побачить світло наступного року - це Unreal Tournament 2007. І скріншот демонструє візуальну якість реального персонажа з цієї гри. Напевно, не менш вражає використання карт нормалей і в такому очікуваному всіма Crysis. Втім, складність використовуваних в ній шейдерів явно не обмежиться normal mapping і зробить крок набагато далі. І хоча перевага Normal Mapping очевидно, приходить час, коли і він перестає влаштовувати девелоперів. 3.3.3 Parallax mapping Головний недолік бампа [2] і нормалей в тому, що рельєфні деталі, що описуються відповідними картами, насправді плоскі. Вони не міняють своїх контурів, під яким би кутом гравець на них не подивився. Коли персонаж стоїть на місці, все здорово, картинка виглядає об'ємною, та варто йому небагато поворушитися, зміститися буквально на підлогу віртуальних метра убік, і ілюзія глибини розсівається - око людини ловить невідповідність освітлення і перспективи, що змінилася. З приходом нових шейдерних моделей і покоління графічних прискорювачів, стало можливим ускладнити самі шейдери і поліпшити і графічне представлення рельєфних поверхонь. Одна з нових технологій називається Parallax Mapping (у Unreal Engine 3.0 він іменується Virtual Displacement Mapping). Її головне нововведення - вона примушує дрібні деталі виглядати по справжньому об'ємними. Ще 2 року назад був розроблений графічний мод для Doom III, який замінював шейдер normal mapping на parallax mapping. Платою за додаткову реалістичність стали збільшені до Radeon 9500/GeForce FX вимоги до відеосистеми. Але parallax mapping знайшов своє застосування не тільки у фанатськом творчості. Знаменитий шутер FEAR використовував parallax mapping для імітації кульових вибоїн в стінах, завдяки чому бої придбали вражаючий ступінь руйнівності, схожий з однією з фінальних перестрілок в «Матриці». Також повсюдне і масове застосування даної технології обіцяється у всіх іграх на движку Unreal Engine 3.0, що майже напевно гарантує надзвичайну візуальну якість ігрового простору. Паралакс імітує об'ємність за рахунок просторового спотворення рельєфу щодо камери (тобто головній осі погляду). 3.3.4 Relief mapping Але навіть паралакс [2] не ідеальний, адже він об'єкт не змінює контура дрібних об'єктів, а тільки всього рельєфу цілком. Тому об'єкт з детальною поверхнею має досить грубі контури і відкидає не дуже реалістичну тінь. Це видно в тому ж Doom 3. Проблему зумів вирішити бразильський аспірант Технологічного університету Мануель Олівейр і його колеги (сайт: www.inf.ufrgs.br/~oliveira). Нову розробку назвали Relief Mapping або Per-Pixel Displacement Mapping, вона включає цілих три алгоритми візуалізації поверхні. 3.3.5 Простий Relief Mapping Це найпростіший з нових алгоритмів Relief Mapping [2]. Він розроблений як оптимальна заміна Normal/Parallax Mapping. Як і попередники, Relief Mapping не міняє контурів самого об'єкту, зате робить деталі на 100% об'ємними, здатними відкидати тінь один на одного. Найбільш ефективне застосування даного шейдера (а Relief Mapping по суті своїй саме шейдер) - поверхні, які не дозволяють безпосередньо побачити їх контури. Наприклад, стіни будівель і коридорів, поверхні скель і відкритих майданчиків: ви ж не можете зануритися в тріщину скелі, щоб зрозуміти, що вона насправді плоска, а не об'ємна. Це стало очевидно і для колеги Олівейра - Фабіо Полікарпо, який створив графічні модіфікациідля Doom 3 і Quake 4, замінюючі там Normal Mapping на Relief Mapping. Relief Mapping, що міняє контури об'єкту Другий алгоритм Relief Mapping рвонув як атомна бомба: це найреалістичніший ефект рельєфної поверхні, розрахований в реальному часі. Причому що повністю міняє контури самого об'єкту, тому його ще називають True Per-Pixel Displacement Mapping. Абсолютно недосяжний раніше фокус, тепер реалізований за допомогою високорівневої мови шейдеров DIRECTX 9.0c. На малюнку нижче показаний елементарний примітив (циліндр), на який накладений рельєф по трьом різним алгоритмам. Вже зараз ясно, що Displacement Mapping виведе графіку комп'ютерних ігор на новий рівень всього через два-три роки. Головна проблема всіх ігор - горезвісна незграбність, яка завжди впадає в очі і незмінно заважає зануренню у віртуальність, - буде повністю переможена. 3.3.6 Багатошаровий Relief Mapping Третій, найнеймовірніший алгоритм - Quad Depth Relief Mapping [4] (також званий Multilayer Relief Mapping) робить те, що здається взагалі неможливим. Уявіть собі простій прямокутний полігон, на який накладається декілька особливих текстур рельєфу, оброблюваних спеціальним шейдером. При цьому майже з усіх боків (окрім вигляду, коли полігон проектується в лінію) замість полігону б бачите абсолютно правильний об'ємний об'єкт! Зовсім немає. Для відтворення ефекту використовується всього три текстури: карта глибини і дві хитрим чином карти нормалей, що згенерували. Все текстури 32-бітові, так що альфа-канал на малюнках не відображений. Ще один наочний приклад використання нової технології - складні багатошарові поверхні. Тут багатошаровому relief mapping немає рівних. Ось тільки системні вимоги нової технології поки що досить високі. У нас в редакції, на Pentium 4 3.2 ГГц/1 Гб DDR-2/GeForce 6600GT PCI-E простенькі демки видавали близько 75 кадрів в секунду, але якщо мова йде про повноцінній грі... Сучасні комп'ютери поки не готові до пришестя Relief Mapping, але пройде рік-два, і ситуація зміниться. Адже для розробників ігор карти рельєфу це не якесь туманне майбутнє, а сувора реальність. Вже зараз важ арсенал Relief Mapping доступний у вигляді плагінів для 3DS Max 6-9 (за виключення плагіна багатошарової рельєфності, який створений поки тільки для Max 6-8). 3.4 Основні прийоми для роботи з текстурами в 3D: Процедурні текстури [2] - це такі текстури, що генеруються різними алгоритмами на літу", а не малюються художниками заздалегідь. Процедурні текстури можуть бути як статичними (дерево, метала й ін.), так і анімованими (вода, вогонь, хмари). Перевагами процедурних текстур є відсутність повторюваного малюнка і менші витрати відеопам'яті для анімації. Але є і недолік необхідний розрахунок з використанням CPU чи шейдерів. Текстурування, чи накладення текстур (texturіng, чи texture mappіng) - найпоширеніший метод реалістичного моделювання поверхонь - накладення на них текстур із зображенням. При цьому, звичайно ж, враховуються відстань, перспектива, орієнтація трикутника. Текстура (texture) - це двовимірне зображення bіtmap, "натягається" на 3D-об'єкт. За допомогою текстур задаються всілякі параметри матеріалу, з якого складається об'єкт: його малюнок(найбільш традиційне застосування), ступінь освітленості різних його частин (карта освітленості, чи lіght-map), здатність відбивати світло (specular map) і розсіювати його (dіffuse map), нерівності (bump map) і ін. Фільтрація текстур (texture fіlterіng) - метод поліпшення якості текстурування при зміні відстані до спостерігача. Найпростіший метод - білінійна (bіlіnear) фільтрація - використовує усереднене значення кольору чотирьох суміжних текселов текстури. Більш складний - трилінійна (trі-lіnear) фільтрація - задіє також інформацію з MІP-рівнів. Найсучасніший і якісний (а заодно і самий повільний) метод - анізотропна (anіsotropіc) фільтрація, що підраховує результуюче значення, застосовуючи цілий набір (звичайно від 8 до 32) текселів, розташованих поруч. Мультитекстурування (multіtexturіng) - накладення декількох текстур за один прохід акселератора. Наприклад, основної текстури, карти освітленості і карти з детальною текстурою. Сучасні відеокарти вміють обробляти як мінімум 3-4 текстури за раз. Якщо мультитекстурування не підтримується (чи необхідно накласти більше шарів текстур, чим це може зробити акселератор "в один прийом"), те використовується кілька проходів, що природно, набагато повільніше. Карти середовища (envіronment mappіng) - імітація поверхонь, що відбивають, за допомогою спеціальної текстури - карти середовища, що представляє собою зображення що оточує об'єкт світу. Детальні текстури (detaіl textures) - прийом, що дозволяє уникнути розпливання текстур на близькій відстані від об'єкта і домогтися ефекту дрібного рельєфу поверхні без надмірного збільшення розміру текстур. Для цього використовується основна текстура нормального розміру, на яку накладається менша - з регулярним шумовим малюнком. Альфа-канал (alpha chanel) і альфа-змішування (alpha-blendіng) - у текстурі поряд з інформацією про колір у RGB-форматі для шкірного пікселя, може зберігатися ступінь його прозорості, називаний альфа-каналом. При рендеринзі колір намальованих раніше пікселів буде з різним ступенем "проступати" і змішуватися з кольором виведеного пікселя, що дозволяє одержати зображення з різним рівнем прозорості. Це і називається альфа-змішуванням. Такий прийом використовується дуже часто: для моделювання води, скла, туману, Дмитрика, вогню й інших напівпрозорих об'єктів. Dіsplacement mappіng (текстурування картами зсуву) - метод моделювання дрібних деталей рельєфу. При його використанні спеціальною текстурою - картою зсуву задаються, наскільки різні частини поверхні будуть опуклими чи втисненими щодо базового трикутника, до якого застосовується цей ефект. На відміну від рельєфного текстурування цей метод є "чесним" і дійсно змінює геометричну форму об'єкта. Поки тільки деякі новітні ЗD-акселератори безпосередньо підтримують карти зсуву. MIP-mappіng - допоміжний метод поліпшення якості і підвищення швидкості текстурування, що полягає в створенні декількох варіантів текстури зі зменшеним дозволом (наприклад, 128 х 128,64 х64, 32 х 32 і т.д. ), називаних MІP- рівнями. У міру видалення об'єкта будуть вибиратися вусі більш "дрібні" варіанти текстури. 3.5 Основні поняття про шейдер та види шейдерів Шейдер (шейдер) [2] - це невеличка програма для графічного процесора (GPU) акселератора, що задає йому спосіб обробки тривимірної графіки. Depth of Fіeld (глибина різкості Рис..13.) - "Кіноефект", що імітує глибину різкості (фокусна відстань) реальної кінокамери, при цьому об'єкти, що знаходяться у фокусі, мають чіткий вид, а інші виглядають розмитими. Motіon-blur (тимчасовий антіаліасинг) - досить нова методика більш реалістичної передачі Рухів за рахунок "змазування" зображення об'єктів у напрямку їхнього переміщення. Глядачі звикли до даного ефекту, характерному для кіно, тому без нього картинка здається нежива навіть при високих FPS. Реалізується motіon-blur через багаторазову відмальовку об'єкта в кадр у різних фазах чи його ж Рухові "розмазуванням" зображення вже на піксельному рівні. 3.6. Генерація тривимірних ландшафтів Тривимірними ландшафтами [20] сьогодні в комп'ютерних іграх вже давно нікого не здивуєш. Пригадати хоч би такі ігри як Warhammer: Dark Omen, Алоди 3, або яку-небудь сучасну стратегію в 3d. А чи замислювалися ми, як ці ландшафти представляються в комп'ютері, будуються в пам'яті або малюється на екрані монітора? Уявлення даних про ландшафт Існує декілька основних принципів представлення даних для зберігання інформації про ландшафти: Перший - використання регулярної сітки висот (або ще інша назва Карта Висот - Heightmap). · Друге - використання іррегулярної сітки вершин і зв'язків, що їх сполучають (тобто зберігання простій тріангулізірованій карті). · Третій - зберігання карти ландшафту, але в даному випадку зберігаються не конкретні висоти, а інформація про використаний блок. В цьому випадку створюється деяка кількість заздалегідь побудованих сегментів, а на карті указуються тільки індекси цих сегментів. Перший варіант - використання карти висот Дані представлені у вигляді двомірного масиву. Вже задано дві координати (x, у - по висоті і ширині масиву), і третя координата задається значенням в конкретній комірці, це висота, як на Рис.14. Рис.14 Представлення двомірного масиву Зазвичай карту висот зберігають у файлах картинок. Це дозволяє легко вносити зміни і більш-менш наочно проглядати дані. Тоді двома координатами буде положення конкретного пікселя на картинці, а третя координата буде представлена кольором (чим вище значення, пряма залежність від яскравості пікселя - тим більше значення висоти для цієї точки). Зазвичай такі картинки містяться в монохромному варіанті, але можна використовувати і всі барви веселки. Другий варіант дає нам більше градацій висоти, чим передбачувані 256 градацій у разі монохромного уявлення. Карта висот 3д-вигляд ландшафту За допомогою цього способу можна представити достатньо обширні простори. Але у нього є один істотний недолік - дуже багато описи для крапок, а також, в деяких випадках, спостерігається надмірність даних (наприклад, коли у вас задається проста площина, то, в цьому випадку, для побудови простій площині використовуватиметься безліч крапок, хоча можна б було обійтися трьома. Хоча і ця сама надмірність може піти нам на користь, наприклад, при вертиксному освітленні. У цього методу існує і декілька плюсів: наочність, в будь-якій програмі переглядання графічних файлів можна відразу побачити всю інформацію; · простота зміни цих самих даних, так як існує безліч програм для роботи з растровою графікою; · і ще одне, в таких картах можна зберігати не тільки дані про висоту. Наприклад, припустимо, що для зберігання висоти ми використовуємо 16 біт, тобто дві колірні компоненти, це виходить 256x256=65536 градацій висоти. Останні 8 біти ми можемо використовувати для зберігання інформації про які-небудь особливості ландшафту, наприклад, розташування будівель, будов, мостів, рослинності і так далі. · Ще одна ідея використання карт висот. Зберігатимемо, також числові, значення, але тепер не висот, а блоків (назвемо їх ландшафтними). Можна заздалегідь створити деяку кількість карт висот невеликого розміру (скажемо 8x8 або 16x16 пікселів), а в нашій карті блоків висот зберігати ідентифікатор існуючого блоку. Це дає значно більший розмір карти і, отже, ландшафту. Правда тут потрібно буде звернути особливу увагу на місця з'єднання блоків. Тобто, виходить, що у нас перший спосіб представлення даних для побудови ландшафту плавно перекочував в третій! · З деяких інших плюсів можна згадати легкість знаходження координат (і висоти!) на карті. · І ще один плюс - оскільки вершинні точки розташовані регулярно і достатньо близько, можна правильніше і достатньо акуратно проводити динамічне освітлення (часто, освітленість вершини безпосередньо залежить від відстані від цієї вершини до джерела освітлення). Це і є та сама користь від надмірності даних. Другий спосіб - іррегулярна сітка Ще один спосіб представлення даних для ландшафтів - іррегулярна сітка вершин і зв'язків тих, що їх сполучають. Часто такі рішення застосовуються в спеціалізованих пакетах для ігор (наприклад, редактор рівнів для Серйозного Сема) або спеціальних пакетах для роботи з тривимірною графікою (типу 3dmax, Maya). І зберігаються у вигляді тривимірних моделей. Це дає основний виграш в порівнянні з картами висот: використовується значно менше інформації для побудови ландшафту. Нам необхідно зберігати тільки значення висот кожної вершини і зв'язку ці вершини сполучають. Це дає нам виграш в швидкості при передачі величезних масивів інформації по AGP, в процесі візуалізації ландшафту. Але окрім плюсів у цього способу є і безліч недоліків: алгоритми побудови ландшафтів в основному призначені для регулярних карт висот. Оптимізація таких алгоритмів під цей спосіб зажадає значних зусиль; · Складнощі при динамічному освітленні - вершини розташовані достатньо далеко один від одного і нерівномірно; · Зберігання, перегляд, модифікація такого ландшафту також представляє складнощі. При використанні карт висот ви користуєтеся достатньо простими і "стандартними" засобами піксельної графіки. Хоч би тим же MS Paint'ом. Тут же вам буде потрібно більш наворочені і "вагомі" пакети. На Рис.15. зображає даний принцип: Рис.15. «Іррегулярна сітка» Спосіб третій - посегментна карта висот У даному способі також використовуються карти висот. Тільки замість висот в ній зберігаються індекси ландшафтних сегментів. Як ці сегменти представлені, в принципі, ролі не грає. Вони можуть бути і регулярними, і іррегулярними (причому можна використовувати і ті та інші одночасно). Плюсів це дає нам наступні переваги: Можливість представлення величезних відкритих просторів; · Окрім самих ландшафтів в таких блоках можна зберігати і інформацію про будівлі, будови, рослини, специфічні ландшафтні рішення (наприклад, печери або скелі, що нависають один над одним); · Можливість створення декількох варіантів одного і того ж сегменту, але при різному ступені деталізації. Залежно від швидкості або завантаженості комп'ютера можна вибирати більш менш деталізовані варіанти (так звані ландшафти LOD - LOD - Level Of Detail). Мінусів у такого способу теж вистачає: · Перший мінус - проблема стиковки різних сегментів. · Другий - неочевидність даних. Поглянувши на картинку, не можна вмить уявити, як це повинно буде виглядати в грі. · Отже, встає і проблема модифікації. Якщо при першому варіанті можна використовувати Paint, в другому 3dmax, то тут вам, швидше за все, буде потрібно самому писати редактор Текстури для ландшафтів Текстури для ландшафтів можна розділити на три частини приблизно стіалогичним чином. По-перше - можна використовувати всього одну текстуру для всього ландшафту. Це дозволяє працювати всього з одним ресурсом, при цьому процедура рендерінга ландшафту довільного розміру міститиме в кращому разі 2-і рядки, в гіршому - 5-6 рядків. У даному варіанті текстуризації підходить для ігор з достатньо великими просторами, де не дуже важливі деталі. Але при необхідності в більш деталізованих текстурах для ландшафту у нас виникає проблема. Щоб добитися більшої детальності, нам необхідно збільшувати розміри текстур. А це призводить до зниження швидкості і збільшення затримок. При використанні для текстурізації одиночної текстури, ми маємо два можливі варіанти:
Це дає можливість вибору формату вершин для ландшафту. У другому випадку нам однозначно доведеться використовувати текстуровані вершини. У першому ж випадку все набагато цікаво: ми можемо використовувати не текстуровані вершини, а забарвлені. При цьому текстуру ми використовуємо як ресурс, сховище інформації про кольори конкретних вершин. Це може дати нам великий приріст швидкості, а при використанні величезних (саме величезних, а не великих близько 5000x5000 пікселів і більш) ландшафтів і текстур дозволить добитися більшої деталізації (хоча у такому разі швидкість сильно залежатиме від розміру, адже при розмірі в 5000 на 5000 одиниць для зберігання ландшафту буде потрібно 5000x5000=25000000 вершин помножити на об'єм пам'яті для однієї вершини рівний 36 байт, 12 на три координати - тип float + 24 на колір, тип DWORD. Отримуємо, що для зберігання інформації про такий ландшафт нам буде потрібно 25000000x36=900000000 байт!!! Це приблизно 900 мб! При цьому ландшафт у нас представлений 49980002 полігонами! Тому, поки краще такими величезними ландшафтами не користуватися). Другий варіант використання текстур схожий з третім варіантом представлення ландшафту. Можна для одного ландшафту використовувати не одну текстуру, а багато. При цьому ми можемо добитися практично будь-якої деталізації. Але унаслідок використання безлічі текстур, ми отримуємо в нагороду, не то, щоб реальну проблему, а головний біль по управлінню ними. Що негайно позначається на швидкості роботи програми при достатньо великій кількості текстур. Крім того, виникає і проблема правильної стиковки текстур. Генерація ландшафту Для генерація ландшафтів розглядається виключно ландшафти з регулярною сіткою. Це дозволить для їх генерації використовувати достатньо прості алгоритми, наприклад, алгоритму, мова про котрий йде нижче. Ось використаний алгоритм: Створюєм двомірний масив необхідного розміру;
Далі заповнюється випадковими значеннями ще декілька точок в початковому масиві (зразкова кількість точок всього - tsize*tsize, потрібно заповнити tsiza*10 точок), конкретна точка вибирається випадковим чином;
На другому кроці заповнюєм масив випадковими значеннями – наприклад їх межі приблизно від -300 до +300. У передостанньому кроці знову використовується випадкові значення - в даному випадку їх в межі від -500 до +500. Це дозволяє добитися достатньо порізаного ландшафту як на Рис.16 Рис.16 «Приклад лашафту» Генерація ландшафтів з використанням Холмового алгоритму (Hill Algoritm) Це простий ітераційний алгоритм, заснований на декількох вхідних параметрах. Алгоритм викладений в наступних кроках: Створюється двомірний масив і ініціалізували його нульовим рівнем (заповнюється всі осередки нулями);
Як згенерувати один горб Перший, другий і четвертий кроки тривіальні, п'ятий і шостий розглянем далі. Фактично горб - це в нашому випадку половина кулі, чим більше радіус - тим більше горб (і вище). Математично це схоже на перевернуту параболу, приклад формули: тут (x1, y1) - задана точка, r - вибраний радіус, (x2, y2) - висота горба. От як виглядає одиночний горб на Рис..17: Рис..17 «Одиночний горб» Що б згенерувати ландшафт повністю необхідно побудувати безліч таких горбів. Але є ще дві речі на яких необхідно звернути увагу. Перше - необхідно ігнорувати негативні значення висоти горба. Друге - при генерації подальших горбів краще додавати набутого значення для даного горба до вже існуючих значень. Це дозволяє побудувати правдоподібніший ландшафт, ніж правильно обкреслені округлі горби, приклад, як виглядає ландшафт при великій кількості ітерацій на Рис.18: Рис.18 «Приклад ландшафту при великій кількості ітерацій» Нормалізація Ландшафту При генерації значень для ландшафту потрібно враховували виходи цих значень за деякі межі (наприклад - якщо потім ландшафт зберігатиметься в монохромній картинці, то необхідно, щоб всі значення знаходилися в межі від 0 до 256). Для цього необхідно провести нормалізацію значень. Математично нормалізація - це процес набуття значень з однієї межі, і переклад його в інші межі. От як це виглядає графічно на Рис. 19: Рис. 19 «Приклад нормалізації до і після» Щоб нам це зробити проводяться наступні дії: спершу проходиться по всьому масиву і запам'ятовують найбільше і найменше значення; · після того, як дізналися ці значення, потрібно наново пройти по всьому ландшафту і провести нормалізацію конкретних значень в межі від 0 до 1. У вигляді формули це виглядає так: Після цього готовий ландшафт, нормалізований і готовий до подальшого використання. " Долинізація" ландшафту Взагалі кажучи, даний ландшафт вже можна використовувати, але якщо придивитися, то в нім достатні мало долин. Схили горбів надмірно круті, хочеться зробити їх пологішими. У цьому допоможе попередній крок - нормалізація. Всі значення у нас зараз знаходяться в межах від 0 до 1. Ідея "долинізацїї" полягає в наступному - узяти від кожного значення квадратний корінь. Це більшою мірою впливає на середні значення, практично не зачіпаючи мінімумів і максимумів. Графічно це виглядає так Рис. 20: Рис. 20 «Приклад графіка долинізації до і після» А ось, як це вплинуло на ландшафт Рис.21: Рис.21. «Приклад долинізації до і після» Тепер з цим алгоритмом можна закінчити. В основному, розглянуті алгоритми призначені для створення простого горбистого або гористого ландшафту. Але існують і інші типи ландшафтів. Наприклад, острови (точніше за групу островів), озерні ландшафти. Їх можна реалізувати досить просто: створюється простий, достатньо горбистий ландшафт;
Практично просто пройтись весь масив висот і змістити їх на якесь значення. Є ще один тип ландшафтів - одиночні острови або гірські плато (як часто показують в американських фільмах), залежно від того, де потім "розмістити" воду. Модифікація холмового алгоритму для островів У багатьох випадках можна використовувати вже розглянуті алгоритми для генерації ландшафтів. Але іноді необхідно згенерувати острови, або острів. У цьому нам допоможе той же алгоритм, правда злегка модифікований. У початковому алгоритмі вибирали центральну точку випадковим чином, і вона могла розташовуватися в будь-якій частині ландшафту. Тепер же потрібно, щоб горби були розташовані ближче до центру. Щоб зробити це, вводяться дві змінні (які потім потрібно випадковим чином змінювати), назвем їх відстань і кут. Відстань означатиме, як далеко від центру знаходиться центральна точка для одиночного горба. Воно може змінюватися від нуля (прямо по центру карти висот) до половини величини карти висот мінус радіус горба. Це дозволить уникнути ситуацій перетину горбів з краєм карти висот. Кут показуватиме, в якому напрямі від центру нам потрібно буде поставити горб. Змінюється в межах від 0 до двох Пі. Використовуючи ці два значення, можна отримати значення (x, у) для центральної точки конкретного горба і використовувати їх як і в простому алгоритмі. От як нам можна набути значень для x і у: тут size - розмір карти висот, distance - відстань, theta - кут. Радіус повинен бути менше половини розміру карти висот. Попрацювавши з цими величинами, можна отримати досить пристойно виглядаючий острів як на Рис..22: Рис. 22 «Приклад острова» Ось і весь алгоритм. Все гранично просто, і острів дійсно схожий на острів. Хоча немає, чогось не вистачає. Ну звичайно ж - острів-то де розташований? У воді як це показано на Рис. 23. Рис.24 Ось і розглянуті деякі алгоритми побудови карт висот для ландшафтів. Потрібно розглянути ще деякі супутні операції: Згладжування (або по-іншому - розмиття). Низькочастотний фільтр для зменшення ефектів угловатості. При багатократному застосуванні дозволяє добитися дуже гладких контурів ландшафту. (Є аналог в програмі Adode Photoshop - фільтр Blur). 4. Опис програмного середовища Delphi. Пакет Delphi[8,9] – продовження лінії компіляторів мови Pascal компанії Borland. Pascal як мова дуже проста, а строгий контроль типів даних сприяє ранньому виявленню помилок і дозволяє швидко створювати надійні і ефективні програми. Корпорація Borland постійно доповнювала мову. Колись у версію 4.0 були включені засоби роздільної трансляції, пізніше, починаючи з версією 5.5, з'явилися об'єкти, а до складу шостої версії пакету ввійшла повноцінна бібліотека класів Turbo Vision, що реалізовує віконну систему в текстовому режимі роботи відеоадаптера. Це був один з перших продуктів, що містили інтегроване середовище розробки програм. В класі інструментальних засобів для початківців програмістів продуктам компанії Borland довелося конкурувати з середовищем Visual Basic корпорації Microsoft, де питання інтеграції і зручності роботи були вирішені краще. Колись, ще на початку 70-х років Н. Вірт опублікував повідомлення про Pascal, це був компактний, з невеликою кількістю основних понять і зарезервованих слів мова програмування, націлена на навчання студентів. Мова, на якій належить працювати користувачу Delphi, відрізняється від початкового не тільки наявністю безлічі нових понять і конструкцій, але й ідейно: в ньому замість мінімізації числа понять і використовування найпростіших конструкцій (що, безумовно, добре для навчання, але не завжди виправдано в практичній роботі), перевага віддається зручності роботи професійного користувача. Як мову Turbo Pascal природно порівнюють з його найближчими конкурентами – численними варіаціями на тему мови Basic (в першу чергу з Visual Basic корпорації Microsoft) і з C++. Я вважаю, що Turbo Pascal істотно перевершує Basic за рахунок повноцінного об'єктного підходу, що включає розвинуті механізми інкапсуляції, наслідування і поліморфізм. Остання версія мови, яка вживається в Delphi, по своїх можливостях наближається до C++. З основних механізмів, властивих C++, відсутнє тільки множинне наслідування. (Втім, цим красивим і могутнім механізмом породження нових класів користується лише невелика частина програмістів, які пишуть на С++.) Плюси застосування мови Pascal очевидні: з одного боку, на відміну від Visual Basic, заснованого на інтерпретації проміжного коду, для нього є компілятор, генерований машинний код, що дозволяє одержувати значно більш швидкі програми. З іншою – на відміну від C++ синтаксис мови Pascal сприяє побудові дуже швидких компіляторів. Середовище програмування нагадує пакет Visual Basic. У вашому розпорядженні декілька окремих вікон: меню і інструментальні панелі, Object Inspector (в якому можна бачити властивості об'єкту і пов'язані з ним події), вікна візуального будівника інтерфейсів (Visual User Interface Builder), Object Browser (дозволяюче вивчати ієрархію класів і проглядати списки їх полів, методів і властивостей), вікна управління проектом (Project Manager) і редактора. Delphi містить повноцінного текстового редактора типу Brief, призначення клавіш в якому відповідають прийнятим в Windows стандартам, а глибина ієрархії операцій Undo необмежена. Як це стало вже обов'язковим, реалізовано колірне виділення різних лексичних елементів програми. Процес побудови додатку достатньо простий. Потрібно вибрати форму (в поняття форми входять звичайні, діалогові, батьківські і дочірні вікна MDI), задати її властивості і включити до неї необхідні компоненти (видимі і, якщо знадобиться ті, що не відображаються): меню, інструментальні панелі, рядок стану і т. п., задати їх властивості і далі написати (за допомогою редактора початкового коду) обробники подій. Object Browser. Вікна типу Object Browser сталі невід'ємною частиною систем програмування на об'єктно-орієнтованих мовах. Робота з ними стає можливою відразу після того, як ви скомпілювали додаток. Projeсt Manager – це окреме вікно, де перераховуються модулі і форми, що становлять проект. При кожному модулі указується маршрут до каталогу, в якому знаходиться початковий текст. Жирним шрифтом виділяються змінені, але ще не збережені частини проекту. У верхній частині вікна є набір кнопок: додати, видалити, показати початковий текст, показати форму, задати опції і синхронізувати вміст вікна з текстом файлу проекту, тобто з головною програмою на мові Pascal. Опції, включаючи режими компіляції, задаються для всього проекту в цілому. В цьому відношенні традиційні make-файли, що використовуються в компіляторах мови С, значно гнучкіші. Visual Component Library (VCL) Багатство палітри об'єктів для побудови призначеного для користувача інтерфейсу – один з ключових чинників при виборі інструменту візуального програмування. При цьому для користувача має значення як число елементів, включених безпосередньо в середовище, так і доступність елементів відповідного формату на ринку. |