Генерация 3D ландшафта на базе нелинейных фракталов
Разработка приложения для демонстрации фрактальной генерации 3D ландшафта, требования к функциональным характеристикам и техническому обеспечению. Построение карты высот с помощью алгоритма Diamond-Square. Руководство пользователя, тестирование программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 22.12.2015 |
Размер файла | 1,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
СОДЕРЖАНИЕ
- 1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
- Введение
- 1.1 Назначение системы
- 1.2 Требования к программному проекту
- 1.2.1 Требования к функциональным характеристикам
- 1.2.2 Требования к надежности
- 1.2.3 Требования к эксплуатации
- 1.2.4 Требования к информационной и программной совместимости
- 1.2.5 Требования к техническому обеспечению
- 2. ИССЛЕДОВАЛЕЛЬСКАЯ ЧАСТЬ
- 2.1 Постановка задачи
- 2.2 Описание тематики
- 2.2.1 Язык фракталов
- 2.2.2 Представление данных о ландшафте
- 2.2.3 Построение карты высот на основе шума Перлина
- 2.2.4 Построение карты высот с помощью диаграммы Вороного
- 2.2.5 Построение карты высот с помощью алгоритма Diamond-Square
- 3. КОНСТРУКТОРСКАЯ ЧАСТЬ
- 3.1 Общие сведения
- 3.2 Описание логической структуры программы
- 3.2.1 Структура программы
- 3.2.2 Структуры данных модели
- 3.2.3 Функции для работы с приложением
- 3.3 Руководство программиста
- 3.3.1 Назначение программы
- 3.3.2 Условия выполнения программы
- 3.3.3 Тестирование программы
- 3.3.4 Обращение к программе
- 4. ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ
- 4.1 Входные данные
- 4.2 Выходные данные
- 4.3 Руководство пользователя
- 4.3.1 Назначение программы
- 4.3.2 Требования к аппаратной и программной средам
- 4.3.3 Выполнение программы
- СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- ПРИЛОЖЕНИЕ
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ
Введение
Данный проект представляет собой приложение, позволяющее создавать 3D ландшафт при помощи нелинейных фракталов.
1.1 Назначение системы
Разрабатываемое приложение предназначено для демонстрации фрактальной генерации 3Dландшафта. Приложение также может применяться в качестве модуля для создания ландшафта в 3D играх.
1.2 Требования к программному проекту
1.2.1 Требования к функциональным характеристикам
Для реализации поставленной задачи приложение должно обладать следующими функциями:
- создание карты высот;
- прорисовка полигонов ландшафта;
- смешивание текстур на основе карты высот;
- наложение текстур;
- создание меню;
- создание свободной камеры.
1.2.2 Требования к надежности
Надежное функционирование программы должно обеспечивается ограничением, накладываемым на набор входных данных (коды нажатых клавиш игнорируются, если эти клавиши не являются управляющими в приложении). ландшафт фрактальный генерация
1.2.3 Требования к эксплуатации
Эксплуатация программного обеспечения может выполняться без специальной подготовки пользователем, имеющим базовые навыки работы с компьютером в системе семейства MSWindows.
1.2.4Требования к информационной и программной совместимости
Инструмент, используемый для создания данного проекта - Unity3d 4.6.1. Среда проектирования, используемая при разработке данного проекта - MonoDevelop. Для работы с приложением требуется установленная операционная система WindowsXP или более поздняя версия, приложение совместимо только с ОС семейства Windows. Работа продукта основана на библиотеках DirectX, и требует их установки.
1.2.5 Требования к техническому обеспечению
Для нормального функционирования данного программного продукта необходимо наличие:
- оперативной памяти не менее 256 Мб
- процессора, с частотой не менее 1ГГц
- не менее 212Мб свободного места на жестком диске
- устройства ввода (клавиатура/мышь)
- видеокарты совместимой с DirectX 9.0
- монитора
2. ИССЛЕДОВАЛЕЛЬСКАЯ ЧАСТЬ
2.1 Постановка задачи
Реализовать программу, позволяющую создавать 3D ландшафт при помощи нелинейных фракталов. Программа должна осуществлять вывод на экран, созданного 3D ландшафта и его демонстрации при помощи свободной камеры. Должен быть предоставлен пользователю понятный и удобный интерфейс для работы с программой. Инструмент, используемый для разработки данной программы - Unity3d 4.6.1. Среда проектирования - MonoDevelop. Язык программирования - C#.
2.2 Описание тематики
2.2.1 Язык фракталов
Фрактал - функциональное отображение или множество, получаемое бесконечным рекурсивным процессом и обладающее тремя следующими свойствами: дробной размерностью Хаусдорфа-Безиковича, самоподобием и недифференцируемостью.
Фракталы дают чрезвычайно компактный способ описания объектов и процессов. Если рассматривать эти объекты в различном масштабе, то постоянно обнаруживаются одни и те же фундаментальные элементы. Эти повторяющиеся закономерности определяют дробную, или фрактальную, размерность структуры. Фрактальная геометрия описывает природные формы, изящнее и точнее, чем евклидова геометрия.
Фракталы -- это прежде всего язык геометрии. Однако их главные элементы недоступны непосредственному наблюдению. В этом отношении они принципиально отличаются от привычных объектов евклидовой геометрии, таких, как прямая линия или окружность. Фракталы выражаются не в первичных геометрических формах, а в алгоритмах, наборах математических процедур. Эти алгоритмы трансформируются в геометрические формы с помощью компьютера.
Существуют две основные группы фрактальных языков: линейные и нелинейные. Алгоритмы линейных фракталов аналогичны по форме тем алгоритмам, которые определяют линии на плоскости. Язык нелинейных фракталов гораздо богаче и разнообразнее. Нелинейные фракталы порождают большое разнообразие геометрических форм с помощью довольно простого алгоритма, тесно связанного с современной теорией хаоса.
2.2.2 Представление данных о ландшафте
Существует несколько основных принципов представления данных для хранения информации о ландшафтах:
· Первый - использование регулярной сетки высот (карта высот - HeightMap).
· Второе - использование иррегулярной сетки вершин и связей, их соединяющих (т.е. хранение простой триангулизированной карты).
· Третий - хранение карты ландшафта, но в данном случае хранятся не конкретные высоты, а информация об использованном блоке. В этом случае создается некоторое количество заранее построенных сегментов, а на карте указываются только индексы этих сегментов.
В своем проекте я выбрал способ представления ландшафтов при помощи карты высот. Карта высот хранится в файлах изображений. Это позволяет легко вносить изменения и более-менее наглядно просматривать данные. Координатами на плоскости будет положение конкретного пикселя на картинке, а координата высоты будет представлена цветом (чем выше значение, прямая зависимость от яркости пикселя - тем больше значение высоты для этой точки). С помощью этого способа можно представить достаточно обширные пространства.
Плюсы данного подхода:
· Простота реализации: легкость нахождения координат (и высоты) на карте, простая генерация ландшафта по карте высот.
· Наглядность: в любой программе просмотра графических файлов можно сразу увидеть или изменить всю информацию.
· Скорость: благодаря конвейерной архитектуре процессора, просчет и вывод таких карт высот производится очень быстро.
Также есть минусы:
· Большое количество избыточных данных (особенно для поверхностей, близких к плоским).
При разработки данной программы возник вопрос: откуда брать информацию для генерации карты высот? Конечно же можно просто загружать монохромное изображение и на его основе генерировать ландшафт. Но если нужно каждый раз генерировать разные карты высот (например, для компьютерных игр или демонстрационных программ, таких как эта), то существуют следующие методы:
· Шум Перлина;
· Диаграмма Вороного;
· Алгоритм Diamond-Square.
Далее рассмотрим их подробнее.
2.2.3 Построение карты высот на основе шума Перлина
Шум Перлина (PerlinNoise) -- математический алгоритм по генерированию процедурной текстуры псевдослучайным методом. Используется в компьютерной графике для увеличения реализма или графической сложности поверхности геометрических объектов. Также может использоваться для генерации эффектов дыма, тумана и т.д.
Шум Перлина -- это градиентный шум, состоящий из набора псевдослучайных единичных векторов (направлениях градиента), расположенных в определенных точках пространства и интерполированных функцией сглаживания между этими точками. Для генерации шума Перлина в одномерном пространстве необходимо для каждой точки этого пространства вычислить значение шумовой функции, используя направление градиента (или наклон) в указанной точке.
Функция «Perlin noise» проводит генерацию текстур методом генерации псевдослучайных чисел, однако все визуальные детали текстуры имеют одинаковый размер. Это свойство делает шум Перлина легко управляемым; множество масштабированных копий шума Перлина могут быть вставленными в математические выражения для создания самых разнообразных процедурных текстур.
Изображение - вне зависимости от диапазона значений его элементов - полностью накрывается сеткой, представляющей диапазон вещественных чисел. Таким образом, создается шум на сетке, представляющей по всему изображению значения между 0 и 4. Каждое число порождает линию сетки, а значит, все стороны каждого квадрата последней имеют длину, равную одной единице. Выбранный масштаб влияет на сложность шума. Большое число квадратов на сетке изображения создает более «плотно упакованный» шум, подобный белому шуму на экране плохо настроенного телевизора. Меньшее число квадратов на сетке порождает «клубящийся» шум, внешне похожий на облака.
В каждой точке на сетке строится случайный вектор нормали. Это обычный двумерный вектор единичной длины, который указывает в случайном направлении в пределах каждого из квадратов. Традиционный способ создания таких векторов - организация справочной таблицы из 256 векторов, которые охватывают полный круг, и последующий случайный выбор одного из них для каждой точки на сетке. Это гарантирует распределение векторов, которые могут с равной вероятностью указывать в любом направлении. Далее для каждого пикселя изображения находится та из ячеек сетки, где он находиться. Таким образом, определяется значение, которое основано исключительно на данных этой ячейки. Следующий шаг - создать четыре диагональных вектора, соединяющих углы ячейки с текущим пикселем.
Каждый угол ячейки сетки теперь является базой для двух векторов - случайного единичного вектора и вектора в направлении пикселя, который необходимо построить. Для каждой пары таких векторов находиться скалярное произведение. Оно даст скалярное значение высоты каждого из углов сетки. Далее необходимо объединить эти четыре значения и найти высоту пикселя, который надо сгенерировать. Делать это можно по-разному, получая различные результаты, однако чаще всего используется взвешенная интерполяция четырех значений с учетом близости текущей позиции к каждому углу сетки.
Рисунок 2.1. Пример изображения шума Перлина, полученный сложением двух октав.
Основным плюсом использования шумовой функции при генерации ландшафта является то, что нет необходимости хранить карту высот, а достаточно лишь использовать данные справочной таблицы векторов, - все остальное для восстановления конечной карты высот ландшафта сделает шумовая функция.
Данный способ даёт ошеломляюще реалистичные результаты, но он довольно неплох для создания пустынь или равнин.
2.2.4 Построение карты высот с помощью диаграммы Вороного
Диаграмма Вороного конечного множества точек S на плоскости представляет такое разбиение плоскости, при котором каждая область этого разбиения образует множество точек, более близких к одному из элементов множества S, чем к любому другому элементу множества. Диаграмма Вороного имеет тесную связь и взаимно-однозначное соответствие с триангуляцией Делоне. А именно, если соединить рёбрами точки, области Вороного которых граничат друг с другом, полученный граф будет являться триангуляцией Делоне.
Простой алгоритм построения:
Рассмотрим серединный перпендикуляр отрезка, соединяющего некоторую пару точек и . Этот перпендикуляр разбивает плоскость на две полуплоскости и , причём область Вороного точки целиком содержится в одной из них, а область точки -- в другой. Область Вороного точки совпадает с пересечением всех таких полуплоскостей: .Таким образом, решение задачи сводится к вычислению такого пересечения для каждой точки . Алгоритм может быть реализован с вычислительной сложностью .
Алгоритм Форчуна:
Алгоритм основан на применении заметающей прямой. Заметающая прямая -- это вспомогательный объект, представляющий собой вертикальную прямую линию. На каждом шаге алгоритма диаграмма Вороного построена для множества, состоящего из заметающей прямой и точек слева от неё. При этом граница между областью Вороного, прямой и областями точек состоит из отрезков парабол (так как геометрическое место точек, равноудалённых от заданной точки и прямой -- это парабола). Прямая движется слева направо. Каждый раз, когда она проходит через очередную точку, эта точка добавляется к уже построенному участку диаграммы. Добавление точки к диаграмме при использовании двоичного дерева поиска имеет сложность , всего точек , а сортировка точек по -координате может быть выполнена за , поэтому вычислительная сложность алгоритма Форчуна равна .
Рекурсивный алгоритм:
Основная идея рекурсивного алгоритма заключается в использовании метода динамического программирования. Исходное множество точек разбивается на два подмножества и , для каждого из них строится диаграмма Вороного, а затем полученные диаграммы объединяются в одну. Разбиение множества осуществляется при помощи прямой, разделяющей плоскость на две полуплоскости, так, чтобы в обеих полуплоскостях находилось примерно одинаковое количество точек. Объединение диаграмм Вороного множеств и может быть выполнено за время , поэтому вычислительная сложность алгоритма равна .
Построения ландшафта на основе диаграммы Вороного начинается со случайного размещения точек на карте высот. Затем по этим точкам строится диаграмма Вороного (и, соответственно, триангуляция Делоне), а на ней выполняется несколько итераций релаксации Ллойда, чтобы избавиться от слишком мелких полигонов. Его суть сводится к созданию сетки, как на рисунке 2.2. Главное её свойство -- это её нерегулярность. Это позволяет построенному на её основе ландшафту не выглядеть слишком «квадратным».
Рисунок 2.2. Диаграмма Вороного, построенная алгоритмом Форчуна.
Рисунок 2.3. Ландшафт, построенный при помощи диаграммы Вороного.
2.2.5 Построение карты высот с помощью алгоритма Diamond-Square
Самым же распространенным и дающим одни из самых реалистичных результатов является алгоритм diamond-square (или square-diamond), расширение одномерного алгоритма midpoint displacement на двумерную плоскость. Ландшафты, получающиеся с его помощью, называют фрактальными.
Рисунок 2.4. Построение ландшафта алгоритмом midpoint displacement.
Начнем с более простого алгоритма midpoint displacement. Как уже сказано, он работает не на двумерной плоскости, а на одномерном отрезке (поэтому с его помощью можно, например, создать линию горизонта). Изначально мы любым образом задаем высоту на концах отрезка и разбиваем его точкой посередине на два под-отрезка. Эту точку мы смещаем на случайную величину и повторяем разбиение и смещение для каждого из полученных под-отрезков. И так далее -- пока отрезки не станут длиной в один пиксель (Рисунок 2.4). Важное замечание: случайные смещения должны быть пропорциональны длинам отрезков, на которых производятся разбиения. Например, мы разбиваем отрезок длиной -- тогда точка посередине него должнаиметьвысоту
( и -- высоты на левом и правом конце отрезка, а константа определяет «шероховатость» (roughness) получающейся ломаной и является главным параметром в данном алгоритме).
Обобщим этот алгоритм для двумерной карты высот. Начнем с присвоения случайных высот четырем углам всей карты целиком и разобьём её (для удобства предположим, что мы работаем с квадратной картой, причем её сторона является степенью двойки) на четыре равных квадрата. В каждом из них известно значение в одном из углов. Точка в центре получается усреднением высот всех 4 угловых точек, а каждая серединная точка на стороне большого квадрата -- усреднением пары точек, лежащих на концах соответствующей стороны. Осталось применить немного шума -- сдвинуть случайным образом центральную точку вверх или вниз (в пределах, пропорциональных стороне квадрата) -- и повторять рекурсивно эти действия для полученных под-квадратов (Рисунок 2.5).
Рисунок 2.5. Построение карты высот двумерным алгоритмом midpoint displacement.
Это ещё не diamond-square -- данный алгоритм, как правило, тоже называют алгоритмом midpoint displacement и несмотря на то, что он дает уже относительно приемлемые результаты, в получившейся карте высот без особого труда можно заметить линейность.
Алгоритм diamond-square -- тот самый, который позволяет получать «настоящие» фрактальные ландшафты -- отличается от двумерного midpoint displacement тем, что состоит из двух шагов. Первый -- т. н. «square» -- точно так же определяет центральную точку в квадрате путем усреднения угловых и добавлением собственно displacement'а -- случайного отклонения. Второй же шаг -- «diamond» -- призван определить высоту точек, лежащих на серединах сторон. Здесь усредняются не две точки -- «сверху» и «снизу» (если говорить о точках на вертикальной стороне), но и пара точек «слева» и «справа» -- то есть еще две полученных на шаге «square» центральных точки. Важно заметить, что эти две высоты, которые были получены на предыдущем шаге, должны быть уже посчитаны -- поэтому расчет нужно вести «слоями», сначала для всех квадратов выполнить шаг «square» -- затем для всех ромбов выполнить шаг «diamond» -- и перейти к меньшим квадратам (Рисунок 2.6).
Кроме необходимости использовать, обход в ширину вместо обхода в глубину, есть ещё одна тонкость -- ситуация на краях ландшафта. Дело в том, что на этапе «diamond» алгоритм использует высоту точек, которых находятся за пределами текущего квадрата и, возможно, всей карты. Варианта два: либо считать эти высоты равными 0 (или 1, или любой другой константе), либо представить, что плоскость свернута в тор и, пытаясь узнать высоту точки, лежащей на 64 пикселя левее левой границы карты, мы узнаем высоту точки, отстоящей на 64 точки от правой границы. Реализуется очень просто (как, впрочем, и первый вариант) -- поможет взятие координат по модулю, равному размеру карты.
Алгоритм Diamond-Square дает наиболее реалистичные результаты, хотя и не лишен некоторых недостатков. Например, создав карту, которая хорошо выглядит при сильном приближении -- при просмотре целиком можно увидеть множество мелких островков (а то и вовсе сплошной шум) вместо нескольких больших материков и океанов. Самоподобия не выходит. Исправить это можно различным комбинированием фрактальных ландшафтов разного масштаба. Их значения можно перемножать, складывать, использовать различные коэффициенты или, например, привнести данные, полученные с помощью диаграммы Вороного.
Рисунок 2.6. Построение карты высот алгоритмом Diamond-Square.
3. КОНСТРУКТОРСКАЯ ЧАСТЬ
3.1 Общие сведения
Данный курсовой проект представляет собой программу, созданную при помощи инструмента Unity3d 4.6.1в среде MonoDevelop на языке C# с полным её описанием. Цель проекта - реализация приложения для генерации фрактальных ландшафтов и их демонстрации.
3.2 Описание логической структуры программы
3.2.1 Структура программы
Программа состоит из следующих модульных частей:
· MainMenu.unity - сцена меню;
· MainTerrain.unity - сцена ландшафта;
· Menu.cs - скрипт реализации графического пользовательского интерфейса меню;
· TerrainGenerator.cs - скрипт генерации 3Dландшафта;
· Options.cs - статичный класс, используемый для передачи параметров между сценами.
· TerrainShader.shader - шейдер, смешивающий текстуры камня и травы по карте высот.
3.2.2 Структуры данных модели
3.2.2.1 Константные значения
· WIDTH - количество пикселей ландшафта по ширине.
· HEIGTH - количество пикселей ландшафта по длине.
3.2.2.2 Переменные для работы с приложениями
· float R - коэффициент скалистости.
· int Grain - коэффициент зернистости.
· bool Flat - наличие равнин.
· float WH - площадь terrain в пикселях.
· Color32[] cols - массив для хранения цвета пикселя.
· Texture2D texture - текстура для хранения карты высот.
· Materialmaterial - материал для наложения на ландшафт.
3.2.2.3 Переменные для работы с интерфейсом программы
· boolisShowMenu - флаг отображения главного меню.
· boolisShowGenerator - флаг отображения опций генерации ландшафта.
3.2.2.4Реализация пользовательского интерфейса программы
ФункцияvoidStart ()
Обработчик события запуска меню, вызывается при запуске приложения:
· присваивается значение true флагу отображения главного меню.
ФункцияvoidUpdate()
Обработчик события обновления меню, вызывается каждый кадр.
ФункцияvoidOnGUI ()
Обработчик событий элементов графического пользовательского интерфейса, вызывается каждый кадр:
· производится инициализация элементов меню.
· обработка нажатий на кнопки.
· инициализация основных параметров для генерации ландшафта.
3.2.3 Функции для работы с приложением
3.2.3.1 Функции доступа к полям класса Options
Схема 3.1 UML-диаграмма класса Options.
ФункцияfloatgetR()
Данная функциявозвращает значение поля «коэффициент скалистости».
ФункцияintgetGrain()
Данная функциявозвращает значение поля «коэффициент зернистости».
ФункцияboolgetFlat()
Данная функциявозвращает значение поля «наличие равнин».
Функцияvoid setR(float R)
Данная функцияполучает значение коэффициента скалистости и присваивает его полю класса.
Функцияvoid setGrain(int Grain)
Данная функцияполучает значение коэффициента зернистости и присваивает его полю класса.
Функцияvoid setFlat(bool Flat)
Данная функцияполучает значение флага наличия равнин и присваивает его полю класса.
3.2.3.2 Функции генерации ландшафта
ФункцияvoidStart ()
Обработчик события запуска генерации ландшафта, реализация алгоритма Diamond-Square:
· получение основных параметров для генерации ландшафта;
· инициализация текстуры карты высот;
· создание карты высот;
· задание высоты вершинам по карте высот;
· наложение текстур при помощи шейдера;
ФункцияvoidUpdate()
Обработчик события обновления меню, вызывается каждый кадр:
· выход в меню при нажатии на клавишу «Esc»;
Функцияfloat displace(float num)
Возвращает случайный коэффициент смещения для высоты.
Функцияvoid drawPlasma(float w, float h)
Функция закрашивания пикселя цветом, согласно алгоритму Diamond-Square.
Функцияvoid divide(float x, float y, float w, float h, float c1, float c2, float c3, float c4)
Рекурсивная функция отрисовки ландшафта.
3.3 Руководство программиста
3.3.1 Назначение программы
Даннаяпрограмма написанапри помощи инструмента Unity3d 4.6.1в среде MonoDevelop на языке C#. Она позволяет генерировать фрактальный 3D ландшафт.
3.3.2 Условия выполнения программы
Программа может быть запущена на любом компьютере, на котором установлена одна из операционных систем WindowsXP/Vista/7/8/8.1 и библиотеки DirectX 9.0. Программа занимает 212 Мбдискового пространства и требует видеокарты совместимой с DirectX 9.0.
3.3.3 Тестирование программы
Для тестирования программы следует произвести следующие действия:
· Запустить файл «terrain.exe ».
· Выбрать разрешение экрана и нажать кнопку «Play!».
· Нажать кнопку «Генерация ландшафта».
· Передвигая ползунки и устанавливая флажок, выбрать параметры генерации ландшафта: коэффициент скалистости, коэффициент зернистости и наличие равнин.
· Нажать кнопку «Начать» и подождать около 20 сек. до отображения сгенерированного ландшафта.
· Использовать клавиши «W», «A», «S», «D» и «Пробел» для перемещения камеры, и мышь для поворота камеры.
· Нажать клавишу «Esc»для выхода в меню.
· Для выхода из программы в меню выбрать кнопку «Выход».
3.3.4 Обращение к программе
Для обращения к программе необходимо запустить файл «terrain.exe »с гибкого или жёсткого магнитного диска.
4. ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ
4.1 Входные данные
Входными данными являются коды клавиш «W», «A», «S», «D» и «Пробел» на клавиатуре и перемещение и нажатие левой кнопки мыши.
4.2 Выходные данные
Выходными данными является графическая информация, выводимая на экран.
4.3 Руководство пользователя
4.3.1 Назначение программы
Программный продукт должен предназначаться для демонстрации созданного 3D ландшафта.
4.3.2 Требования к аппаратной и программной средам
Условия выполнения программы, полученной в результате реализации данного проекта, должны отвечать следующим требованиям:
· программа должна выполняться в одной из операционных систем WindowsXP/Vista/7/8/8.1 с установленными библиотеками DirectX 9.0;
· программа может выполняться на компьютере с процессором не ниже Intel/AMD не ниже 1ГГц;
· для нормального функционирования программы необходим минимальный размер оперативной памяти 256 Мб;
· для программы необходимо наличие 212Мб свободного места на жестком диске;
· для работы с программой необходимо наличие устройств ввода (клавиатура, «мышь»);
· для отображения результатов работы программы необходимо наличие устройства вывода (монитор) и видеокарты совместимой с DirectX 9.0;
4.3.3 Выполнение программы
4.3.3.1 Запуск программы.
Запуск программы происходит после двойного щелчка кнопкой мыши по иконке приложения. После запуска приложения появится окно выборанастроекграфики(Рисунок 4.1.).
Рисунок 4.1. Окно выбора настроек графики.
Далее в пункте Screen resolution выбрать разрешение монитора, в пункте Graphics quality выбрать качество графики. Для того чтобы приложение отображалось в окне, поставить галочку напротив пункта Windowed. После выбора настроек нажать кнопку «Play!». На экране появится главное меню программы (Рисунок 4.2).
Рисунок 4.2. Главное меню программы
4.3.3.2 Выбор параметров генерации ландшафта
Чтобы приступить к генерации ландшафта сначала нужно задать параметры генерации. Для этого нужно выбрать пункт меню «Генерация Ландшафта». На экране отобразится меню выбора параметров генерации ландшафта (Рисунок 4.3).
Рисунок 4.3. Меню выбора параметров генерации ландшафта.
Передвигая ползунки и устанавливая флажок, выбрать параметры генерации ландшафта:
· коэффициент скалистости - чем больше значение, тем выше вершины гор;
· коэффициент зернистости - чем выше значение, тем больше полигонов будет использоваться для отрисовки ландшафта;
· наличие равнин - при установке флажка напротив этого значения будут созданы плоские участки ландшафта (равнины).
После выбора параметров нужно выбрать пункт меню «Начать» и подождать около 20 сек. до отображения ландшафта (Рисунок 4.4).
Рисунок4.4. Сгенерированный ландшафт.
4.3.3.3Управление камерой
Для перемещения камеры использовать на клавиатуре клавиши «W», «A», «S», «D» и «Пробел»,вращение камеры производится при помощи мыши, для выхода в меню нажать на клавиатуре кнопку «Esc».
4.3.3.4Выход из программы
Завершение программы происходит после выбора в главном меню (Рисунок 4.2) пункта «Выход».
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
[1] Jacob Olsen Realtime Procedural Terrain Generation // Department of Mathematics And Computer Science (IMADA) University of Southern Denmark. - October 31, 2004.
[2] Jeff W. Murray C# Game Programming Cookbook for Unity 3D. - New-York: CRC Press, 2014. - 429 с.
[3] Авдеева С.М., Куров А.В. Алгоритмы трехмерной машинной графики: Учебное пособие. - М.: Изд-во МГТУ им. Н.Э. Баумана, 1996. - 60 с.: ил.
[4] Г.Снук Создание 3D-ландшафтов в реальном времени с использование C++ и DirectX 9. КУДИЦ-ОБРАЗ, 2006. - 368 с.
[5] Курс лекций «СМиКА» Белов Ю.С.
[6] Ричард М. Кроновер Фракталы и Хаос в Динамических Системах. Основы теории.. - М.: Постмаркет, 2000. - 352 с.
[7] Алгоритм «diamond-square» для построения фрактальных ландшафтов // Хабрахабр URL: http://habrahabr.ru/post/111538/ (дата обращения: 28.03.2015).
[8] Генерация ландшафтов в Unity3d // Хабрахабр.ру URL: http://habrahabr.ru/post/226635/ (дата обращения: 28.03.2015).
ПРИЛОЖЕНИЕ
Menu.cs
usingUnityEngine;
usingSystem.Collections;
public class Menu : MonoBehaviour {
public float heigthVertex = (float) 0.3; //2
public float grainIntensivity = 8;
publicboolb_IsFlat = true;
//public static Options opt;
boolb_IsShowMenu,b_IsShowGamePlay,b_IsShowOptions;
// Use this for initialization
void Start () {
b_IsShowMenu = true;
}
// Update is called once per frame
void Update () {
}
voidOnGUI()
{if(b_IsShowMenu)
{GUILayout.BeginArea(new Rect(Screen.width/2-100,Screen.height/2-50,200,100));
GUILayout.BeginVertical();
if(GUILayout.Button("ГенерацияЛандшафта"))
{b_IsShowMenu = false;
b_IsShowGamePlay = true;
}GUILayout.FlexibleSpace();
if(GUILayout.Button("Выход"))
{Application.Quit();
}GUILayout.EndVertical();
GUILayout.EndArea();
}
else if(b_IsShowGamePlay)
{
int _heigth = Screen.height/2 - 100;
int _width = Screen.width/2 - 255;
GUI.Label(new Rect(_width + 180, _heigth, 200, 20),"Коэффициентскалистости");
heigthVertex = GUI.HorizontalSlider(new Rect(_width, _heigth + 25, 500, 20), heigthVertex, 0, 1);//3
GUI.Label(new Rect(_width + 510, _heigth + 20, 50, 20), heigthVertex.ToString());//4
GUI.Label(new Rect(_width + 180, _heigth + 50, 200, 20),"Коэффициент зернистости");
grainIntensivity = GUI.HorizontalSlider(new Rect(_width, _heigth + 75, 500, 20), grainIntensivity, 1, 32);//3
GUI.Label(new Rect(_width + 510, _heigth + 70, 50, 20), Mathf.RoundToInt(grainIntensivity).ToString());//4
b_IsFlat = GUI.Toggle(new Rect(_width + 180, _heigth + 100, 200, 30), b_IsFlat,"Генерироватьравнины");
if(GUI.Button(new Rect(_width + 200, _heigth + 140, 100, 30), "Начать"))
{
Options.setR(heigthVertex);
Options.setGrain(Mathf.RoundToInt(grainIntensivity));
Options.setFlat(b_IsFlat);
//opt = new Options(heigthVertex, Mathf.RoundToInt(grainIntensivity), b_IsFlat);
Application.LoadLevel("MainTerrain");
}
if(GUI.Button(new Rect(20, Screen.height - 40, 100, 30), "<<Назад"))
{b_IsShowGamePlay = false;
b_IsShowMenu = true;
}
}
}
}
TerrainGenerator.cs
usingUnityEngine;
usingSystem.Collections;
public class TerrainGenerator : MonoBehaviour {
public float R; // Коэффициентскалистости
public int GRAIN=8; // Коэффициент зернистости
public bool FLAT = false; // Делатьлиравнины
public Material material;
private int width=2048;
private int height=2048;
private float WH;
private Color32[] cols;
private Texture2D texture;
void Start ()
{
R = Options.getR();
GRAIN = Options.getGrain();
FLAT = Options.getFlat();
int resolution = width;
WH = (float)width+height;
// Задаёмкартувысот
Terrain terrain = FindObjectOfType<Terrain> ();
float[,] heights = new float[resolution,resolution];
// Создаёмкартувысот
texture = new Texture2D(width, height);
cols = new Color32[width*height];
drawPlasma(width, height);
texture.SetPixels32(cols);
texture.Apply();
// Используемшейдер
material.SetTexture ("_HeightTex", texture);
// Задаём высоту вершинам по карте высот
for (inti=0; i<resolution; i++) {
for (int k=0;k<resolution; k++){
heights[i,k] = texture.GetPixel(i,k).grayscale*R;
}
}
// Применяемизменения
terrain.terrainData.size = new Vector3(width, width, height);
terrain.terrainData.heightmapResolution = resolution;
terrain.terrainData.SetHeights(0, 0, heights);
print ("OK");
}void Update()
{
if(Input.GetKey(KeyCode.Escape)){
if(Time.timeScale == 0){
Time.timeScale = 1;
Application.LoadLevel("MainMenu");
}
else {
Time.timeScale = 0;
// Считаем рандомный коэффициент смещения для высоты
float displace(float num)
{float max = num / WH * GRAIN;
returnRandom.Range(-0.5f, 0.5f)* max;
}// Вызовфункцииотрисовки с параметрами
voiddrawPlasma(float w, float h)
{float c1, c2, c3, c4;
c1 = Random.value;
c2 = Random.value;
c3 = Random.value;
c4 = Random.value;
divide(0.0f, 0.0f, w , h , c1, c2, c3, c4);
}// Рекурсивнаяфункцияотрисовки
void divide(float x, float y, float w, float h, float c1, float c2, float c3, float c4)floatnewWidth = w * 0.5f;
floatnewHeight = h * 0.5f;
if (w < 1.0f && h < 1.0f)
{float c = (c1 + c2 + c3 + c4) * 0.25f;
cols[(int)x+(int)y*width] = new Color(c, c, c);
}else
{float middle =(c1 + c2 + c3 + c4) * 0.25f + displace(newWidth + newHeight);
float edge1 = (c1 + c2) * 0.5f;
float edge2 = (c2 + c3) * 0.5f;
float edge3 = (c3 + c4) * 0.5f;
float edge4 = (c4 + c1) * 0.5f;
if(!FLAT){
if (middle <= 0)
{middle = 0;
}else if (middle > 1.0f)
{middle = 1.0f;
}divide(x, y, newWidth, newHeight, c1, edge1, middle, edge4);
divide(x + newWidth, y, newWidth, newHeight, edge1, c2, edge2, middle);
divide(x + newWidth, y + newHeight, newWidth, newHeight, middle, edge2, c3, edge3);
divide(x, y + newHeight, newWidth, newHeight, edge4, middle, edge3, c4);
Options.cs
// <auto-generated>
// Этоткодсозданпрограммой.
// Исполняемая версия:4.0.30319.34209
//// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
public static class Options
{private static float _R; //коэффициентскалистости
private static int _Grain; //коэффициент зернистости
private static bool _Flat; //наличиеравнин
public static float getR(){return _R;}
public static intgetGrain(){return _Grain;}
public static boolgetFlat(){return _Flat;}
public static void setR(float R){_R = R;}
public static void setGrain(int Grain){_Grain = Grain;}
public static void setFlat(bool Flat){_Flat = Flat;}
}TerrainShader.shader
Shader "Custom/TerrainShader" {
Properties {
_HeightTex ("HeightMap Texture", 2D) = "white" {}
_MainTex ("Grass Texture", 2D) = "white" {}
_RockTex ("Rock Texture", 2D) = "white" {}
}SubShader {
Tags { "RenderType"="Opaque" }
LOD 2048
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _RockTex;
sampler2D _HeightTex;
struct Input {
float2 uv_MainTex;
float2 uv_RockTex;
float2 uv_HeightTex;
};
void surf (Input IN, inoutSurfaceOutput o) {
float4 grass = tex2D(_MainTex, IN.uv_MainTex);
float4 rock = tex2D(_RockTex, IN.uv_RockTex);
float4 height = tex2D(_HeightTex, IN.uv_HeightTex);
o.Albedo = lerp(grass, rock, height);
}ENDCG
}FallBack "Diffuse"
Размещено на Allbest.ru
...Подобные документы
Генерирование на основе имеющихся карт Кавказа ландшафта на базе алгоритма Diamond-Square. Визуализация получившихся карт высот с помощью библиотек glut и glaux OpenGL. Суть алгоритма Diamond-Square, этапы его реализации. Скриншоты созданной программы.
курсовая работа [1,4 M], добавлен 27.05.2013Понятие фрактала, принципы создания изображения. Разработка алгоритма и режимов генерации ландшафта. Описание программы FracLandscapes.exe. в среде разработки Delphi 10. Примеры построения ландшафта с использованием различных режимов и количества изгибов.
курсовая работа [688,9 K], добавлен 04.05.2014Изучение основных алгоритмов генерации различных видов фракталов. Выбор языка и среды программирования. Характеристика структурных элементов растрового графического редактора фракталов. Описание интерфейса приложения, порядок редактирования изображений.
курсовая работа [1,2 M], добавлен 04.04.2014Описание экспертной системы по подбору кадров. Требования к функциональным характеристикам программы. Состав и параметры технических средств ЭВМ. Структура входных данных. Руководство программиста и пользователя. Тестирование программного средства.
курсовая работа [897,0 K], добавлен 13.11.2016Проектирование приложения, предназначенного для демонстрационного показа операций сдвигов чисел влево и вправо на n-битов и их результатов. Требования к функциональным характеристикам, параметрам технических средств. Компиляция и компоновка программы.
курсовая работа [712,4 K], добавлен 08.11.2013Выбор языка программирования. Требования к информационному и техническому обеспечению. Реализация базы данных. Разработка алгоритма работы программного обеспечения. Форма идентификации пользователя. Руководство пользователя. Типы элементов диалога.
дипломная работа [1,3 M], добавлен 05.07.2013Проектирование Windows-приложения, которое позволяет проводить тестирование знаний по разделу математики "Логарифмы". Создание дополнительного класса диалоговых окон, нового пользовательского интерфейса программы. Требования к техническому обеспечению.
курсовая работа [1,9 M], добавлен 02.07.2011Метод последовательных приближений. Требования к аппаратным ресурсам и программным средствам разработки. Руководство пользователя, тестовые примеры. Тестирование приложения: ввод вычислений, рисование графика функции. Особенности применения программы.
курсовая работа [773,7 K], добавлен 27.08.2012Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.
курсовая работа [1,5 M], добавлен 17.01.2011Понятие фрактала и фрактальной геометрии. Роль фракталов в машинной графике, самоподобие как основное свойство. Области применения фракталов. Учение о сложных нелинейных динамических системах (теория хаоса). Интеграция детерминированных фракталов и хаос.
курсовая работа [1,0 M], добавлен 20.08.2009Общие сведения о языке ассемблера. Назначение команды прерывания INT число. Описание логической структуры программы: алгоритм работы, используемые методы, входные и выходные данные. Структура и тестирование программы. Руководство оператора программы.
курсовая работа [90,0 K], добавлен 01.12.2009Технико-экономические показатели деятельности организации. Требования к информационной и программной совместимости. Описание нормативно-справочной информации. Требования к функциональным характеристикам. Руководство пользователя и программиста.
отчет по практике [43,4 K], добавлен 23.02.2011Автоматизация промежуточного и финального контроля результатов обучения учащихся различных учебных заведений. Тестирование, основанное на диалоге вычислительной системы с пользователем. Реализация приложения генерации тестов из базы данных на языке РНР.
курсовая работа [234,1 K], добавлен 04.08.2009Разработка приложения, позволяющего автоматизировать документооборот предприятия по списанию основных средств. Мероприятия по защите и обеспечению целостности базы данных. Разработка клиентского приложения. Запросы к базе данных, руководство пользователя.
курсовая работа [700,0 K], добавлен 14.01.2015Блок-схема работы программы генерации ключевой информации, внешний вид ее основного окна. Построение гистограмм распределения элементов и проверки серий. Тестирование программы на работоспособность и возможность получения криптографически стойких ключей.
презентация [561,0 K], добавлен 16.10.2013Выбор, обоснование и описание используемых алгоритмов и понятий машинной графики. Типы, структуры данных и функции, использованные при реализации программного комплекса. Тип и структура файла для хранения ландшафта. Связи между модулями программы.
курсовая работа [2,8 M], добавлен 24.06.2009Разработка программного приложения по автоматизированному учету поступающего довольствия. Описание среды программирования. Тестирование и отладка приложения. Анализ результатов решения. Инструкция пользователю. Требования к техническому обеспечению.
дипломная работа [946,0 K], добавлен 18.07.2014Определение необходимых модулей программы, структуры файла базы данных. Описание разработки программы, отладка и тестирование. Разработка приложения Organizer.exe, меню и руководство пользователя. Алгоритм обработки событий главного меню (расписания).
курсовая работа [901,8 K], добавлен 11.02.2014Общие требования к изображению отрезка с помощью цифрового дифференциального анализатора. Сравнительный анализ обычного и несимметричного алгоритмов и алгоритма Брезенхема для генерации векторов (соединения двух точек изображения отрезком прямой).
презентация [65,3 K], добавлен 14.08.2013Требования к программному средству. Спецификация качества программного обеспечения. Требования к эргономике и технической эстетики. Стадии и этапы разработки, порядок контроля и приемки. Проектирование архитектуры приложения, руководство пользователя.
курсовая работа [381,6 K], добавлен 20.06.2012