Текст
                    Федеральное государственное бюджетное образовательное
учреждение
высшего профессионального образования
«Саратовский государственный технический университет
имени Гагарина Ю.А.»
Факультет Международный факультет прикладных информационных
технологий
Специальность Информационные технологии в медиаиндустрии
Кафедра Прикладные информационные технологии
ДИПЛОМНАЯ РАБОТА
Разработка программного обеспечения генерации программных
объектов с использованием шаблонов проектирования
Выполнила студентка группы ИТМ-51
Лежнина Анна Владимировна
Руководитель работы
к.т .н ., доцент каф. ПИТ
Ермаков Александр Вадимович
Допущен к защите
Протокол
.
Зав. кафедрой _______________________ Долинина О.Н.
Саратов 2014


2 Оглавление Введение ..................................................................................................... 5 1. ОБЗОР ЗАДАЧ МОДЕЛИРОВАНИЯ ШАБЛОННЫХ ................. 7 3D ОБЪЕКТОВ......................................................................................... 7 1.1. Основные понятия ....................................................................... 7 1.2 . Моделирование объектов в среде Unity3D ............................. 8 1.3 . Типы задач шаблонного 3D моделирования и существующее ПО ........................................................................... 10 1.3 .1 . Генератор деревьев «Sapling» ......................................... 10 1.3.2. Генератор персонажей «Character Generator» .................. 11 1.3.3. Генератор волосяного покрова «XGen» ........................... 13 1.4. Требования к созданию генератора архитектурных объектов для среды разработки трехмерных приложений ........................... 14 2. ТЕХНИКИ ШАБЛОННОГО ПРОЕКТИРОВАНИЯ АРХИТЕКТУРНЫХ 3D ОБЪЕКТОВ ................................................ 16 2.1. Процедурное генерирование..................................................... 16 2.1.1. Инструмент «ProBuilder» для моделирования объектов в среде Unity3D ................................................................................ 17 2.2. Порождающие шаблоны ООП.................................................. 18 2.2.1. Шаблон «абстрактная фабрика»........................................ 19 2.2.2. Инструмент генерирования гладиаторских арен «Arena Generator»....................................................................................... 22 2.2.3. Шаблон «фабричный метод» ............................................. 23 2.2.4. Инструмент «Procedural Shapes» для заполнения шаблонными объектами местности в среде Unity3D................ 25 2.2 .5 . Шаблон «строитель» ......................................................... 26 2.2.6. Инструмент «City Generator» для заполнения шаблонными объектами местности в среде Unity3D ......................................... 29
3 2.3 . Обоснование выбора методов решения задачи моделирования шаблонного проектирования архитектурных 3D-объектов ...................................................................................... 30 3. ОПИСАНИЕ ПРАКТИЧЕСКОЙ РЕАЛИЗАЦИИ ........................... 34 ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ................................................... 34 3.1. Инструмент для разработки трехмерных приложений Unity3D 34 3.2. Описание поддерживаемых языков программирования в среде Unity3D................................................................................................ 35 3.2.1. Javascript................................................................................. 35 3.2.2. Boo ......................................................................................... 35 3.2.3. C# ........................................................................................... 36 3.2.4. Обоснование выбора языка программирования ................... 37 3.3. Среда разработки MonoDevelop ................................................... 37 3.4. Выбор среды 3D-моделирования ................................................. 38 3.4.1 Autodesk 3Ds Max ................................................................... 38 3.4.2. Blender.................................................................................... 38 3.4.3. Обоснование выбора редактора 3D графики ................... 40 3.5 . Выбор векторного редактора ................................................. 40 3.5.1. Adobe Illustrator ...................................................................... 40 3.5.2. CorelDRAW ........................................................................... 41 3.5.3. Inkscape .................................................................................. 41 3.5.4. Обоснование выбора векторного редактора.......................... 42 3.6. Структура приложения................................................................. 42 3.6.1. Информационные потоки работы процедурного генератора зданий ............................................................................................. 44 3.6.2. Графический интерфейс пользователя .............................. 47 3.6.3. Тип плана здания ................................................................... 49 3.6.4. Набор продуктов.................................................................... 50 3.6.5. Построение панели ................................................................ 50
4 3.6.6. Построение секции ............................................................. 53 3.6.7 . Возведение стен сегмента .................................................. 55 3.6.8. Создание фасада .................................................................. 56 3.6.9. Создание здания .................................................................. 57 Заключение .............................................................................................. 59
5 ВВЕДЕНИЕ Трехмерная визуализация достаточно прочно вошла в общий цикл процесса разработки многих объектов в сфере строительства, массмедиа, промышленного проектирования. Более того, успешная защита проектов, поиск инвесторов, первичная оценка и многие другие этапы разработки уже невозможно представить без качественной визуализации. Визуализация может выступать как вспомогательное средство на ранних этапах разработки разного рода проектов, а может стать готовым проектом. Одной из распространенных и критически важных категорий в сфере архитектурной визуализации является моделирование ландшафта и проектирование строительных конструкций. Для решения задач такого рода существуют различные инструменты разработки трехмерных приложений. Одним из самых востребованных на сегодня является редактор Unity3D. Этот редактор в полном объеме реализует функционал классического трехмерного редактора, позволяя связать его с программным кодом, написанным на языке С#. Это преимущество позволяет разрабатывать приложения под различные платформы, предоставляет широкий спектр возможностей, как для написания сценариев, так и для моделирования трехмерных объектов. Каждый созданный на Unity3D проект можно использовать при последующей разработке, как специализированный модуль. Unity3D имеет большое количество специализированных модулей, предоставляющих возможность решать проблемы проектирования сложных объектов. Среди таких модулей существуют и те, которые позволяют заполнять пространство виртуального мира. Особенно часто разработчики сталкиваются с задачей построения объектов архитектуры. Для решения этой задачи специалистам по моделированию приходится создавать каждый архитектурный объект в редакторе вручную, что
6 приводит к серьезным временным затратам. Однако на моделируемой сцене часто присутствуют объекты, которые должны быть разными, но состоять из шаблонных деталей и не требовать высокого уровня детализации. Создание таких объектов предлагается выполнять программно, в соответствии с заранее заданными параметрами. Такой подход позволяет ускорить разработку городских 3D ландшафтов. Однако в настоящее время с помощью существующих программных продуктов невозможно в полной степени автоматизировать задачу моделирования архитектурных объектов в среде разработки трехмерных приложений Unity3D. Таким образом, было принято решение разработать инструмент, который бы позволил максимально упростить процесс генерации архитектурных объектов, что значительно сократило бы издержки на разработку трехмерных приложений. Целью дипломной работы является разработка программного обеспечения (ПО) в среде Unity3D, которое должно предоставлять пользователю следующие возможности:  генерировать архитектурные объекты в режиме реального времени;  создавать объекты с учетом предоставленых системе данных об ограничительных рамках, в которые будет вписана итоговая конструкция;  задавать значения параметров генерации через меню пользователя. Кроме того, разрабатываемое ПО должно обеспечивать расстановку окон и дверных проемов на основании предоставленных ранее шаблонов. Результатом работы ПО выступает 3D-модель жилого здания, созданная в соответствии с заданными пользователем параметрами и шаблонными объектами – элементами здания. Разработанное ПО может использоваться как инструмент ускорения разработки моделей больших городских ландшафтов.
7 1. ОБЗОР ЗАДАЧ МОДЕЛИРОВАНИЯ ШАБЛОННЫХ 3D ОБЪЕКТОВ 1.1. Основные понятия В компьютерной графике создание каждого графического объекта, будь то персонаж или элемент ландшафтного дизайна - процесс трудоемкий. Полноценное создание нового объекта предполагает полную прорисовку множества его элементов. Для упрощения работы используют шаблонные объекты. Эти объекты созданы ранее и содержат базовые формы и элементы, решающие определенный тип задач. Понятие «шаблон», в зависимости от контекста и сферы применения, имеет различное значение. Так шаблон проектирования в разработке ПО – это «повторяемая архитектурная конструкция, представляющая собой решение часто возникающей пробле мы проектирования» [1]. В компьютерной графике шаблон – это заготовка формы, графического изображения. При создании анимации шаблон – это графический объект, часть персонажа, повторяемый элемент. В любом случаи шаблон – это заготовка, которая будет использоваться повторно для решения той задачи, для которой предназначалась изначально. Шаблонные объекты активно используются для решения основной на сегодняшний день задачи компьютерной графики - построения объектов сложной конфигурации [2]. Создание таких объектов в трехмерном пространстве позволяет представить картину более полно, усилить восприятие от просмотра, в отличие от двумерного изображения. Именно поэтому 3D сейчас активно развивается в таких направлениях, как компьютерные игры, научная, инженерная и образовательная визуализация.
8 Одной из часто встречающихся, как в компьютерных играх, так и в инженерных задачах, является задача визуализации архитектурных объектов. Как правило, такие объекты состоят из большого количества элементов, что значительно затрудняет процесс моделирования. Возникает необходимость в использовании дополнительных средств, позволяющих автоматизировать процесс конструирования 3 D-модели. Такие средства автоматизации называют специализированными модулями (инструментами) и разрабатывают специально для сред разработки трёхмерных приложений [3]. К таким средам относят: Unreal Engine, CryEngine, Unity3D. Каждая из перечисленных сред позволяет моделировать процессы, создавать симуляторы, компьютерные игры, но более востребованной на сегодняшний день является среда Unity3D. 1.2 . Моделирование объектов в среде Unity3D Unity3D [4] – это мощный мультиплатформенный инструмент разработки интерактивных браузерных и настольных приложений с двумерной и трехмерной графикой, обрабатываемой в реальном времени. Данная среда по функционалу не уступает другим средам разработки трехмерных приложений и обладает рядом преимуществ: позволяет разрабатывать приложения под различные платформы, предоставляет широкий спектр возможностей, как для написания сценариев, так и для моделирования трехмерных объектов. Программирование графики в Unity3D осуществляется с помощью следующих языков программирования:  JavaScript;  Boo (диалект Phyton);  C# на основе .NET.
9 Среду разработки трехмерных приложений Unity3D помимо решения задач моделирования и создания компьютерных игр применяют для создания демонстрационных рекламных роликов, визуализации архитектуры. Также на Unity3D разрабатывают обучающие симуляторы. Таблица 1 отражает сравнительные характеристики наиболее известных и схожих по функционалу с Unity3D редакторов трехмерных приложений. К таковым относят Unreal Engine и CryEngine. Таблица 1 Анализ сред разработки трехмерных приложений Инструмент для разработки ПО Характеристика Unity3D Unreal Engine CryEngine Высокая производительность скриптов + - + Выбор из нескольких языков написания скриптов + - - Некоммерческая лицензия + + + Наличие русифицированной документации + - - Возможность разработки собственных специализированных модулей + - - Высокие аппаратные требования - + + Исходя из данных, представленных в таблице 1 , можно сделать вывод о том, что при использовании некоммерческой версии
10 наибольший комплекс функций предоставляет среда Unity3D. В связи с этим, принято решение о реализации рассматриваемой задачи с использованием данного ПО. 1.3 . Типы задач шаблонного 3D моделирования и существующее ПО К задачам трёхмерного моделирования относят создание форм моделей элементов архитектуры, ландшафта, живых существ, элементов декора и т.д . Порой такие модели являются прототипами существующих в реальном мире объектов. Для создания трехмерных моделей можно использовать:  редакторы создания 3D-моделей (например, 3DsMax, Blender, Maya и т.д .);  среды разработки трехмерных приложений (например, Unity3D, Unreal Engine, CryEngine.) . Каждый из способов используется для решения определенных задач. Так в первом случае, при использовании редактора создания 3D- моделей процесс моделирования происходит вручную. Существуют вспомогательные средства – специализированные модули, позволяющие облегчить процесс создания модели благодаря использованию шаблонных элементов . Во втором случае создание объекта происходит по алгоритму , заданному разработчиком проекта. Алгоритм определяет способ компоновки элементов - шаблонных объектов, из которых будет состоять конечная модель. Ниже приведен анализ некоторых из существующих генераторов, решающих задачи моделирования объектов. 1.3 .1 . Генератор деревьев «Sapling» Специализированный модуль «Sapling» позволяет генерировать деревья в редакторе Blender. При работе с данным модулем
11 пользователю предоставляется возможность изменять ти п дерева (его видовую принадлежность). Так, например, в случае выбора типа, соответствующего виду «ива», результат может быть таким, как на рисунке 1.1 . Генерация дерева осуществляется в соответствии с параметрами, которые система предлагает задать пользоват елю. Интерфейс модуля «Sapling» позволяет выбрать тип дерева, размер, количество ветвей, количество, размер и положение листьев. Рисунок 1.1 Результат работы генератора деревьев «Sapling» (Источник: [5]) Созданные с помощью модуля деревья можно использовать как части ландшафта при моделировании местности. Таким образом, «Sapling» позволяет минимизировать временные затраты при моделировании объектов ландшафтного дизайна. 1.3.2. Генератор персонажей «Character Generator» Модуль «Character Generator» – генератор, позволяющий создавать трехмерные модели персонажей без работы с полигональной сеткой
12 объекта, что позволяет значительно сократить время, необходимое для создания 3D-персонажей. Данный генератор создан компанией Autodesk. «Character Generator» предоставляет возможность настраивать внешний вид персонажа. На рисунке 1.2 представлен результат работы данной программы. Модуль Character Generator достаточно прост в использовании, и создает нового персонажа путем совмещения нескольких заранее заложенных образов. Для этого в системе предоставлен обширный каталог шаблонов тел, лиц, причесок, одежды. Полученная в результате модель может быть экспортирована в 3DMax, Maya, или в Unity3D. Рисунок 1.2 Результат работы «Character Generator» (Источник: [6]) Инструмент «Character Generator» позволяет разработчикам не затрачивать силы на моделирование персонажей и быть независимыми от специалистов по 3D-моделированию.
13 1.3.3. Генератор волосяного покрова «XGen» Генератор волосяного покрова «XGen» создан по системе «Character Animation Studio Tools» и является специализированным модулем для продукта Maya компании Autodesk. Рисунок 1.3 отображает процесс работы модуля «XGen» в программе Maya. Данный модуль позволяет моделировать волосяной покров, к которому можно отнести как человеческий волос, так и шерсть животных. С помощью данного инструмента можно управлять процессом создания полигонов, из которых строится покров. «XGen» позволяет генерировать позиции каждого элемента волосяного покрова, применять эффект намокших волос, менять длину, структуру волос, изменять окрас. Рисунок 1.3 Процесс работы модуля ««XGen» в программе Maya» (Источник: [7]) Модуль «XGen» можно применять и для моделирования травы. При работе с анимацией данный модуль позволяет сымитировать падение предмета в траву, либо создать эффект сгибающейся травы, если по ней идет персонаж.
14 1.4. Требования к созданию генератора архитектурных объектов для среды разработки трехмерных приложений Для создания собственного инструмента генерирования, в первую очередь, необходимо определить шаблонные объекты, из которых может состоять конечный объект генерирования. Большинство существующих генераторов разрабатывается как специализированные модули, и их использование возможно в средах трехмерного моделирования. Разработанный генератор должен определять:  ограничительные рамки для параметров генерирования;  положение в 3D-мире сгенерированного объекта;  из каких элементов состоит объект и каким образом эти элементы размещаются. Как отмечалось ранее, сферы применения трехмерной визуализации многочисленны. Достаточно часто встречается задача генерации ландшафтов (в том числе гороских). Важными объектами моделирования при этом являются архитектурные конструкции, а именно жилые здания. Процесс моделирования объектов такого рода является довольно сложным и многоэтапным, в связи с этим существует задача автоматизации процесса моделирования жилых зданий. В рамках данной дипломной работы ключевое внимание будет уделено сфере архитектурной визуализации. Для решения задачи моделирования строительных объектов было решено разработать ПО, позволяющее автоматизировать данный процесс. Объектами генерирования разрабатываемого ПО будут выступать модели жилых зданий. В качестве шаблонных объектов в модели жилого здания нами определены следующие элементы:  модели окон;
15  модели дверей;  модели балконов. Для разработки ПО генерации моделей жилых зданий была выбрана технология Unity3D, т.к . данная среда поддерживает разработку скриптов на объектно-ориентированных языках и не требовательна к аппаратным ресурсам.
16 2. ТЕХНИКИ ШАБЛОННОГО ПРОЕКТИРОВАНИЯ АРХИТЕКТУРНЫХ 3D ОБЪЕКТОВ В разработке приложений под термином «генерирование» понимают процесс, результатом которого является объект, созданный с учетом определенных условий, объединяющий в себе параметры, выбранные случайным образом из представленного изначально множества. Процесс генерирования включает следующие этапы: 1. анализ и формулировка проблемы; 2. определение характеристик, свойственных объектам выбранной категории; 3. определение зависимости между входными параметрами генерирования, и параметрами объекта-результата; 4. определение правил, по которым должно происходить порождение, генерирование нового объекта. Для реализации механизма генерирования 3D-моделей были определены некие вспомогательные техники. Так выделяют следующие техники генерирования трехмерных моделей:  процедурная генерация;  порождающие шаблоны ООП (объектно-ориентированного проектирования). Рассмотрим подробнее каждую из приведённых техник и проанализируем их работу на примере конкретных приложений и специализированных модулей предназначенных для решения задач генерирования архитектурных объектов. 2.1. Процедурное генерирование «Процедурная генерация» — процесс создания программных объектов управляемый алгоритмом, реализованным в виде процедуры или
17 функции. В компьютерной графика такой подход используется при генерации объектов с линейной структурой [8]. Данная техника предполагает использование большого количества ресурсов, как временных, так и кадровых, поскольку разработка алгоритма, по которому происходит создание полигональной сетки объектов 3D- моделирования – процесс довольно долгий и сложный. На основе данной техники разработчики создают специализированные инструменты для моделирования 3D объектов, что является альтернативой непосредственной разработке моделей человеком. При написании алгоритма, по которому будет происходить генерирование необходимо определиться с шаблонными объектами, из которых должна состоять результирующая модель генерирования [9]. Все шаблонные объекты должны быть созданы заранее. Готовые процедурные генераторы позволяют специалистам по моделированию тратить время только на модификацию и детальную прорисовку наиболее важных объектов. Ключевым преимуществом процедурной генерации является сокращение затрат на разработку. Например, инструмент для моделирования и рендеринга растительности, значительно сокращает время, необходимое для моделирования ландшафта. Рассмотрим достоинства и недостатки техники процедурной генерации на примере инструмента «ProBuilder». 2.1.1. Инструмент «ProBuilder» для моделирования объектов в среде Unity3D Данный инструмент разработан для конструирования в среде Unity3D. С помощью данного инструмента можно создавать целые игровые уровни прямо в редакторе Unity3D. Конструирование происходит за счет работы с базовой геометрией. В основу построения архитектуры
18 данного приложения была заложена техника процедурной генерации. Рисунок 2.1 отображает интерфейс инструмента «ProBuilder». Рисунок 2.1 Интерфейс «ProBuilder» (Источник: [10]) Использование «ProBuilder» значительно увеличивает скорость и качество работы. Уникальная способность «ProBuilder» – моделирование непосредственно в редакторе. Эта особенность делает данный инструмент идеальным для создания уровня, крупных объектов. Возможность моментального редактирования геометрии позволяет специалистам по 3D- моделированию не зависеть от среды для создания 3D моделей. Художник или программист сможет освоить работу с данным инструментом достаточно быстро, т.к. интерфейс «ProBuilder» является интуитивно понятным. Недостатком «ProBuilder» является отсутствие возможности задания моделей – шаблонных объектов, из которых будет конструироваться модель здания. Еще одним из недостатков является отсутствие автоматизации процесса создания модели здания – все элементы модели здания приходится создавать хоть и в самой среде разработки трехмерных приложений, но непосредственно пользователю, а не программно. 2.2. Порождающие шаблоны ООП Для решения задачи генерации новых объектов подходят порождающие шаблоны. Они создают объекты-продукты определённых
19 классов, используя технику абстрагирования процесса инстанцирования. Данная техника помогает построить программную сис тему таким образом, чтобы она не зависела от способа создания, внутреннего состояния этих объектов. Все порождающие шаблоны инкапсулируют знания о конкретных классах, которые применяются в системе. Они скрывают детали того, как эти классы создаются и стык уются. Единственная информация об объектах, известная системе, — это их интерфейсы, определенные с помощью абстрактных классов [11]. Таким образом, упрощается понимание самих процессов . Следовательно, порождающие шаблоны обеспечивают большую гибкость при решении вопроса о том, что создается, как, когда и кем. Ниже будут подробно рассмотрены порождающие шаблоны, позволяющие конструировать как сложные так простые объекты. В связи с тем, что среда Unity3D обладает наибольшим количеством преимуществ по сравнению с другими средами, рассматривать действие каждого шаблона ООП будем на примере конкретных реализованных для Unity3D инструментов. 2.2.1. Шаблон «абстрактная фабрика» Шаблон «абстрактная фабрика» предоставляет клиенту интерфейс, использование которого позволяет производить некие конкретные продукты. При этом шаблон скрывает от клиента информацию о конкретных классах продуктов. Данный шаблон содержит в себе набор абстрактных фабричных методов. Эти абстрактные методы описывают интерфейс взаимодействия с объектами-фабриками и имеют возвращаемое значение типа абстрактных продуктов, тем самым предоставляя возможность применять технику абстрагирования процесса
20 инстанцирования. Шаблон «абстрактная фабрика» позволяет избегать прямого создания объекта, отделяет код создания объекта. Шаблон рекомендуется использовать в случае, когда:  требуется создавать объекты различных типов и при этом налаживать между ними взаимодействие, образуя семейства;  входящие в семейства продукты должны использоваться вместе;  требуется построить подсистему, модуль или компонент таким образом, чтобы ее внутреннее устройство, т.е . состояние или поведение, настраивалось при ее создании. На рисунке 2.2 представлена диаграмма классов шаблона «абстрактная фабрика». Рисунок 2.2. Диаграмма классов шаблона «абстрактная фабрика» (Источник: [1]) Основные участники диаграммы классов, представленной на рисунке 2.2:  AbstractFactory – абстрактный класс фабрик; Содержит набор абстрактных методов для создания продуктов.
21  ConcreateFactory – конкретный класс-фабрика; В методах данного класса происходит создание конкретных продуктов.  AbstractProduct - абстрактные классы продуктов; Описывают интерфейсы взаимодействия с объектами-продуктами производных конкретных классов.  Product – продукт; Конкретные классы-продукты. Наследуются от абстрактных классов-продуктов. Объекты-продукты конкретных классов предполагается создавать в телах фабричных методов реализаций конкретных фабрик.  Client – клиент. Создает и использует продукты, пользуясь исключительно интерфейсом абстрактного класса AbstractFactory и AbstractProduct. AbstractFactory – базовый класс. Имеются производные от него классы – конкретные фабрики. Базовый абстрактный класс содержит в себе абстрактные методы, передает ответственность за реализацию, за расширение своей абстракции или за расширение своей функциональности производному классу [11]. Таким образом, базовый класс передает дальнейшую ответственность за обслуживание своим производным классам. Данная структура скрывает детали реализации отдельных классов и процесс создания экземпляров этих классов. Конкретные классы продуктов известны только конкретным фабрикам. Класс Client управляет экземплярами конкретных классов только через их абстрактный интерфейс. Конкретные фабрики связаны отношениями наследования с абстрактной фабрикой и связями отношений зависимостей с порождаемыми ими продуктами.
22 Конкретные классы абстрактных фабрик наследуются от абстрактной фабрики, и реализуют конкретные методы, порождающие продукты. Класс AbstractFactory не занимается созданием объектов- продуктов, ответственность за создание объектов-продуктов ложится на производные классы - на конкретные фабрики, т.е . класс AbstractFactory передоверяет создание объектов-продуктов своему подклассу ConcreateFactory [12]. Фактически продукты будут создаваться именно в фабричных методах производных конкретных классов фабрик. И конкретная фабрика возвращает ссылки на создаваемые ими экземпляры продуктов. Класс AbstractFactory содержит все абстрактные методы для создания продуктов именно фабричных методов, включает в себя название типа порождаемого продукта. Ниже рассмотрен результат работы приложения «Arena Generator», архитектура которого соответствует шаблону «абстрактная фабрика». 2.2.2 . Инструмент генерирования гладиаторских арен «Arena Generator» Специализированный модуль «Arena Generator» позволяет сгенерировать модель гладиаторской арены. С помощью данного модуля можно мгновенно создавать арену из шаблонных объектов. Пользователь имеет возможность настраивать перед генерированием параметры для будущей арены. К таким параметрам относится задание размера арены. Рисунок 2.3 отображает работу модуля «Arena Generator». Архитектура данного специализированного модуля выстроена таким образом, чтобы работа приложения обеспечивала генерирование гладиаторских арен с совершенно разными входными параметрами. К входным параметрам относят шаблонные объекты: стены, перегородки, лестницы, колонны, материал для крыши и т.д . Добиться данного
23 результата возможно в случае использования шаблона ООП «абстрактная фабрика». Работа такого шаблона подразумевает создание объектов по заданному алгоритму. Не смотря на это, результатом работы могут быть гладиаторские арены совершенно не похожие друг на друга, поскольку они создаются из разных наборов шаблонных объектов. Такие наборы в терминологии шаблона «абстрактная фабрика» определяют задание семейства. Рисунок 2.3 Результат работы «Arena Generator» (Источник: [13]) 2.2.3. Шаблон «фабричный метод» Шаблон «фабричный метод» имеет следующее назначение: определяет интерфейс для создания объекта, оставляя за подклассами решение о том, какой класс инстанцировать [14]. Рассмотрим диаграммы классов шаблона «фабричный метод», представленную на рисунке 2.4. Выделим её основных участников и опишем их обязанности. Участники:  Product – продукт;
24 Определяет интерфейс объектов, создаваемых фабричным методом.  ConcreteProduct - конкретный продукт; Реализует интерфейс Product.  Creator – создатель; Передоверяет своим подклассам определение фабричного метода, который будет возвращать экземпляр подходящего конкретного продукта. Также может вызывать «фабричный метод» (FactoryMethod), для создания объекта Product.  ConcreteCreator - конкретный создатель; Переопределяет «фабричный метод» (FactoryMethod), возвращающий объект ConcreteProduct. Рисунок 2.4 Диаграмма классов шаблона «фабричный метод» (Источник: [1]) Структура данного шаблона такова, что код имеет дело только с интерфейсом класса Product, поэтому он может работать с любыми определенными пользователями классами конкретных продуктов [15]. Данный шаблон можно использовать в случае, когда:  классу заранее неизвестно, объекты каких классов ему нужно создавать;
25  класс спроектирован так, чтобы объекты, которые он создает, специфицировались подклассами;  класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и содержит знание о том, какой класс принимает эти обязанности на себя [16]. Таким образом, фабричные методы избавляют проектировщика от необходимости встраивать в код зависящие от приложения классы. Код имеет дело только с интерфейсом класса Product, поэтому он может работать с любыми определенными пользователями классами конкретных продуктов. Все объекты, полученные с помощью фабричного метода, разделяют общий интерфейс Product. Ниже рассмотрен результат работы приложения «Procedural Shapes», архитектура которого соответствует шаблону «фабричный метод». 2.2.4. Инструмент «Procedural Shapes» для заполнения шаблонными объектами местности в среде Unity3D Данный инструмент разработан для создания примитивных геометрических объектов в среде Unity3D. С помощью данного инструмента можно получать объекты любой из предложенных форм в режиме реального времени. Генерирование происходит за счет переданных системе данных о размере фигуры. Рисунок 2.5 отображает результат работы инструмента «Procedural Shapes».
26 Рисунок 2.5 Результат работы «Procedural Shapes» (Источник: [17]) Созданные с помощью «Procedural Shapes» модели можно использовать для создания составной конструкции. Недостаток данного инструмента в том, что помимо предоставления трехмерных примитивов, алгоритм, позволяющий конструировать более сложные формы, отсутствует. Работа данного инструмента осуществляется за счет работы шаблона ООП «фабричный метод». Данный шаблон позволяет работать с объектами, каждый из которых создан по определенному сценарию. Так работа данного инструмента подразумевает создание простых объектов, каждый из которых принадлежит одной группе «примитивы». Но форма каждого примитива задаётся отдельным сценарием. 2.2.5. Шаблон «строитель» Шаблон «строитель» - отделяет конструирование сложного объекта от его представления таким образом, что в результате одного и того же процесса конструирования могут получаться разные представления [12]. Следующая диаграмма взаимодействий, изображенная на рисунке 2.6, иллюстрирует взаимоотношения строителя и распорядителя с клиентом.
27 Рисунок 2.6 . Диаграмма классов шаблона «строитель» (Источник: [1]) Участники диаграммы, представленной на рисунке 2.6:  Builder – строитель; Задает абстрактный интерфейс для создания частей объекта Product.  ConcreteBuilder - конкретный строитель: o Конструирует и собирает вместе части продукта посредством реализации интерфейса Builder. o Определяет создаваемое представление и следит за ним. o Предоставляет интерфейс для доступа к продукту.  Director – распорядитель; Конструирует объект, пользуясь интерфейсом Builder.  Product – продукт: o Представляет сложный конструируемый объект; ConcreteBuilder строит внутреннее представление продукта и определяет процесс его сборки. o Включает классы, которые определяют составные части, в том числе интерфейсы для сборки конечного результата из частей. Между участниками образуется следующая цепочка действий.
28 1. Клиент создает объект -распорядитель Director и конфигурирует его нужным объектом -строителем Builder. 2. Класс Director уведомляет строителя о том, что нужно построить очередную часть продукта. 3. Класс Bilder обрабатывает запросы класса Director и добавляет новые части к продукту. Объект Builder предоставляет распорядителю абстрактный интерфейс для конструирования продукта, за которым он может скрыть представление и внутреннюю структуру продукта, а также процесс его сборки [18]. Поскольку продукт конструируется через абстрактный интерфейс, то для изменения внутреннего представления достаточно всего лишь определить новый вид строителя. Каждый конкретный строитель ConcreteBuilder содержит весь код, необходимый для создания и сборки конкретного вида продукта. Код пишется только один раз, после чего разные распорядители могут использовать его повторно для построения вариантов продукта из одних и тех же частей. Шаблон строитель рекомендуется использовать, когда:  алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;  процесс конструирования должен обеспечивать различные представления конструируемого объекта. В отличие от порождающих шаблонов, которые сразу конструируют весь объект целиком, строитель делает это шаг за шагом под управлением распорядителя. И только когда продукт завершен, распорядитель забирает его у строителя. Поэтому интерфейс строителя в большей степени отражает процесс конструирования продукта, нежели другие порождающие шаблоны.
29 Ниже рассмотрен результат работы приложения «City Generator», архитектура которого соответствует шаблону «строитель». 2.2.6. Инструмент «City Generator» для заполнения шаблонными объектами местности в среде Unity3D Данный инструмент разработан для генерирования объектов, в совокупности которые образуют собой трехмерный город в среде Unity3D. С помощью данного инструмента можно заполнять указанную пользователем в редакторе Unity3D местность. Генерирование происходит за счет переданных системе шаблонных объектов: деревьев, домов, участков дорог. Рисунок 2.7 отображает результат работы инструмента «City Generator». Использование «City Generator» позволяет создавать целые трехмерные города в режиме реального времени. Данный инструмент, можно использовать, когда необходимо заполнить игровое пространство . Недостатком «City Generator» является отсутствие автоматизации процесса создания модели здания или дерева. Архитектура инструмента «City Generator» выстроена таким образом, что генерирование объектов происходит лишь с помощью заданных изначально шаблонных объектов. Т .е . какие бы параметры данного генератора мы не изменяли, пользователь может получать однообразные результаты генерации. Алгоритм данного приложения в данном случае лишает пользователя возможности получать совершенно новый дизайн города.
30 Рисунок 2.7 Результат работы «City Generator» (Источник: [18]) 2.3 . Обоснование выбора методов решения задачи моделирования шаблонного проектирования архитектурных 3D-объектов Использование шаблонов ООП в отличие от технологии процедурного генерирования позволит отделить логику приложения от конкретной реализации в специфической среде, что делает приложение гибким и дает возможность переносить данное программное обеспечение на другие среды разработки с минимальными временными затратами. Для того чтобы сделать разрабатываемое в рамках дипломной работы ПО устойчивым к изменениям в системе, было решено использовать готовые архитектурные решения – шаблоны объектно- ориентированного проектирования (ООП). Задачу создания, генерирования новых объектов решают порождающие шаблоны. В рамках дипломной работы результатом генерации должно быть здание - сложный составной объект, но пользователь должен иметь возможность задания технического плана здания (ТПЗ). В данном случае, при решении этой задачи необходимо учитывать следующие особенности:
31  генерируемые объекты должны быть отсортированы по группе отличий;  свойства и характеристики объекта должны принадлежать к определенному семейству;  объект необходимо создавать пошагово. Выбор шаблонов будем осуществлять в соответствии с поставленной задачей. Из порождающих шаблонов конструировать составной объект позволяют «абстрактная фабрика» и «строитель». В таблице 2 приведен сравнительный анализ шаблона «абстрактная фабрика» и «строитель». Таблица 2.Сравнительный анализ порождающих шаблонов: «абстрактная фабрика», «строитель» «Абстрактная фабрика» «Строитель» Порождает семейство объектов с определенными интерфейсами. Создает в несколько шагов один сложный (составной) объект. Интерфейс, реализуемый классами. Интерфейс строителя, реализуемый классами, и класс для управления процессом. Скрывает реализацию семейства объектов. Скрывает процесс создания объекта, порождает требуемую реализацию. Из представленных в таблице 2 данных можно сделать вывод, что «строитель» делает акцент на пошаговом конструировании объекта, а «абстрактная фабрика» на создании семейств объектов. Классы «абстрактной фабрики» могут быть реализованы с помощью «фабричного метода». Порождать семейства может только «абстрактная фабрика», что решает задачу задания типа генерируемого здания, поэтому данный шаблон будет являться основой для построения структуры приложения. Генерирование продуктов в «абстрактной фабрике» будем производить с помощью «фабричного метода».
32 Так, для решения поставленной в главе 1 задачи будем использовать составной шаблон, содержащий шаблоны «абстрактная фабрика» и «фабричный метод». Рисунок 2.8 отображает порядок взаимодействия между фабриками и конкретными продуктами выбранного составного шаблона. Остается вопрос о пошаговом создании генерируемых объектов. Решением будет задание порядка работы методов фабрик. Для этого в методе Run класса Client установим порядок вызова методов класса реализующего абстрактный интерфейс AbstractFactory. Реализация составного шаблона производится в следующей последовательности:  разработать интерфейс AbstractFactory «абстрактной фабрики»;  создать семейства объектов путем реализации абстрактного интерфейса AbstractFactory;  установить зависимость между продуктами и создающими их методами конкретной фабрики;  задать порядок работы методов конкретной фабрики в методе Run класса Client.
33 Рисунок 2.8. Диаграмма последовательности совместной работы шаблонов «абстрактная фабрика» и «фабричный метод» Для решения задачи генерации, необходимо определить набор фундаментальных поведений, с помощью композиции которых можно получить любое число более сложных.
34 3. ОПИСАНИЕ ПРАКТИЧЕСКОЙ РЕАЛИЗАЦИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 3.1. Инструмент для разработки трехмерных приложений Unity3D Среда разработки трехмерных приложений Unity3D поддерживает широкий диапазон платформ: Windows (XP / Vista / W7), MacOs X, iPhone, iPod, iPad, Xperia PLAY, PS3, Flash 3D player. Инструментарий Unity3D построен на использовании для разработки интерактивных приложений с дву- и трехмерной графикой, обрабатываемой в реальном времени. Все версии проекта Unity3D содержат:  интегрированный редактор проектов MonoDevelop;  поддерживают импорт графических и неграфических ресурсов (моделей, текстур, скриптов и т.д.);  встроенные ландшафты;  шейдерную систему, сочетающую простоту использования, гибкость и производительность. Разработчиками выпускаются две версии программного продукта: обычная версия и платная версия Unity3D Pro. Первая отличается ограниченным функционалом, вторая позволяет осуществить все этапы графического конвейера, включая рендер в текстуру, эффекты пост-процесса, удаление из процесса рендеринга невидимых вершин и полигонов. Для разработки ПО генерации объектов в рамках прикладной задачи была выбрана технология Unity3D, по той причине, что данный движок поддерживает разработку скриптов на объектно-ориентированных языках и не является требовательным к аппаратным ресурсам. Также по данной технологии существует множество учебных материалов. Для разработки приложения использовалась версия Unity3D 4.2.1.
35 3.2. Описание поддерживаемых языков программирования в среде Unity3D 3.2.1. Javascript Javascript [19] – прототипно-ориентированный скриптовый язык программирования, разработанный компанией Netscape. Javascript является диалектом языка EcmaScript и используется преимущественно как встраиваемый язык веб- браузеров. Хотя в последнее время получает все большее распространение в среде серверного программирования. Ключевые особенности языка:  динамическая типизация;  автоматическое управление памятью;  возможность использования парадигмы прототипного программирования;  возможность использования парадигмы функционального программирования. 3.2.2. Boo Boo [20] – объектно-ориентированный язык программирования для платформы .NET. Основное применения языка – использование в среде Unity для создания приложений с трехмерной графикой. Особенности языка:  быстрая компиляция;  высокая скорость выполнения и низкие затраты памяти;  строго – типизированный язык. Не смотря на то, что язык Boo появился в 2003 году, документация по языку до сих пор остается неполной, что вызывает негативные отзывы со стороны разработчиков.
36 3.2.3. C# Язык C# [21] является основным языком разработки под платформу .NET. Основные возможности языка C#:  Наличие сборщика мусора 1. В программах, написанные на C# разработчике нет необходимости следить за тем очисткой памяти, так как этим занимается специальный компонент Common Language Runtime (CLR) сборщик мусора (Garbage Collector).  Программирование на уровне атрибутов 2. Данная возможность позволяет дополнить логику обработки объектов программы за счет добавления специальных конструкций к описанию класса.  Перегрузка операторов 3. C# позволяет изменить возможность перегрузки операция для различных типов.  Поддержка обобщенных типов 4. Данный механизм позволяет наиболее эффективно отойти от использования повторного кода.  Language Integrated Query [22] (LINQ) 5. Использование технологии LINQ позволяет сделать обработку коллекций наиболее эффективной с точки зрения объемы исходного кода.  Упрощенная модель параллельного программирования Сейчас язык программирования C# представляет собой мощный инструмент разработки современных приложений, направленных на решения различных бизнес задач. Использование данного языка программирования для решения задач прикладного программировании позволяет в разы сократить
37 время разработки, по сравнению с использованием, например, классического С++. 3.2.4. Обоснование выбора языка программирования В качестве языка программирования в среде Unity был выбран C#, так как является мощным объектно-ориентированным языком и его инструменты предоставляют возможность реализации классических паттернов программирования без применения специфических конструкций. Так же язык имеет большую базу документации и развитое сообщество разработчиков. 3.3. Среда разработки MonoDevelop MonoDevelop [23] — свободная среда разработки, предназначенная для создания приложений C#, JavaScript, Boo, Nemerle, Visual Basic .NET, Vala, CIL, C и C++. На данный момент среда является частью проекта Mono и является одной из самых лучших IDE для разработки проектов на базе Mono. MonoDevelop обладает всеми основными возможностями, необходимыми для современной интегрированной среды разработки:  настраиваемая подсветка синтаксиса;  автоматическое дополнение кода;  выделение блоков кода с возможностью их сворачивания/разворачивания;  возможности рефакторинга;  удобная навигация по коду;  создание нескольких раскладок интерфейса и переключение между ними;  создание приложений с GUI, поддерживающим несколько языков;  автоматическое создание документации;  расширение возможностей за счет дополнений и внешних инструментов;
38  возможность интеграции с Microsoft Visual Studio и .NET Framework (в среде Microsoft Windows). Среда MonoDevelop встроена в Unity3D как средство написания скриптов. Данная среда разработки позволяет разрабатывать как настольные, так и веб – приложения под платформу .NET. В MonoDevelop как и в VisualStudio существует поддержка плагинов, которые загружаются в систему через репозитории, тем самым позволяя расширять функции среды разработки. 3.4. Выбор среды 3D-моделирования 3.4.1 Autodesk 3Ds Max Autodesk 3Ds Max [24] - ПО для 3D-моделирования, анимации и визуализации. Программа обладает полным набором функций для 3D- моделирования, анимации, имитации и визуализации, востребованных художниками, занимающимися производством игр, фильмов и графики движения. Autodesk 3Ds Max обеспечивает доступ к новым эффективным инструментам, повышает производительность и упрощает рабочие процессы, что позволяет художникам более эффективно работать со сложными компонентами в высоком разрешении. Autodesk 3Ds Max ориентирован прежде всего на архитектурную визуализацию. Данный инструмент имеет огромное количество инструментов для моделирования самых различных архитектурных проектов. Также возможно расширение данного функционала за счет установки сторонних плагинов. Это несомненно делает его наиболее популярным инструментом для создания прототипов в архитектурной среде. 3.4.2. Blender Blender [25] – свободный пакет программного обеспечения для трехмерного моделирования. Характерная особенность Blender – небольшой
39 размер, по сравнению с его аналогами. Так же Blender менее требователен к аппаратной части, по сравнении, к примеру, с 3Ds Max. Основный функции пакета:  Возможность работы с разнообразными графическими примитивами;  Возможность редактирования видео;  Возможность создания анимации;  Наличие встроенного инструмента для разработки приложения реального времени (в том числе видео игр). Blender имеет репутацию инструмента, наиболее сложного в освоении. По большей части это связано с тем, что в базовой поставке отсутствует документация. В таблице 3 представлено сравнение 3D-редакторов. Таблица 3 Сравнительная таблица 3D-редакторов 3D-редактор Характеристика 3Ds Max Blender Пробная / бесплатная лицензия + + Высокие аппаратные требования + - Инструменты для работы с архитектурными примитивами + - Обширная документация + - Расширение + +
40 функциональности с помощью специализированных модулей 3.4.3. Обоснование выбора редактора 3D графики В качестве редактора 3D-графики был выбран инструмент 3Ds Max. Выбор был сделан в пользу данного программного продукта прежде всего из-за обширного набора инструментов для работы с архитектурными примитивами, который поставляются в базовой комплектации программы. Это является наиболее важным критерием выбора 3D-редактора, так как моделирование архитектурных элемен тов является частью данной дипломной работы. Так же 3Ds Max имеет богатую документацию, что позволяет вести более продуктивную разработку за счет сокращения времени на поиск информации о решении тривиальных задач 3D-моделирования. Для проектирования 3D-моделей использовалась академическая версия 3Ds Max 2013 года. 3.5 . Выбор векторного редактора 3.5.1. Adobe Illustrator Adobe Illustrator [26] - векторный графический редактор, разработанный компанией Adobe Systems.Данный инструмент является удобным инструментом для создания различных макетов для прессы и наружной рекламы. Основная отличительная черта данного программного продукта от других инструментов того же класса в полной поддержке формата PDF. Adobe Illustrator доступен на разных платформах и распространяется только под коммерческой лицензией. Особенности Adobe Illustrator:  возможность создания объемных фигур;
41  возможность растрирования изображения с сохранением изначального цвета;  возможность копирования прозрачности;  возможность создания объемных шрифтов. 3.5.2. CorelDRAW CorelDRAW [27] – векторный редактор, разработанный канадской компанией Corel. CorelDRAW известен как инструмент, имеющий более низкий порог входа по сравнению с другими профессиональными векторными редакторами. Корпорация Corel хотя и делала попытки сделать данный инструмент доступным на разных платформах, и даже в 2002 году была выпущена версия для компьютеров Macintosh, но сейчас разработки CorelDraw ведутся только для платформы Windows. Компания предоставляет два варианта лицензирования – для коммерческих организаций и для академических организаций. Также имеются лицензии для студентов. 3.5.3. Inkscape Inkscape [28] – свободный, кросплатформенный графический редактор с открытым исходным кодом. Наибольшее развитие функционала получил после версии 0.46 до которой оставался посредственным инструментом и не использовался в профессиональной среде. Но сейчас этот редактор все больше развивается и все чаще используется в дизайне как бесплатный аналог таких профессиональных программ как Abode Illustrator и CorelDRAW. Особенности редактора Inkscape:  возможность создания составных контуров;  использование собственного движка рендеринга;  возможность расширений за счет написания плагинов;
42  среда для исполнения сценариев, написанных на языках Perl, Python, Ruby. Основная задача развития редактора – полная поддержка формата SVG. 3.5.4. Обоснование выбора векторного редактора. Ниже приведена таблица 4 сравнения характеристик векторных редакторов.. Таблица 4 Сравнительная таблица векторных редакторов Векторный редактор Характеристика Adobe Illustrator CorelDRAW Inkscape Открытый исходный код - - + Кросплатформенность + - + Полная поддержка формата SVG + + - Полная поддержка формата PDF + - - В качестве векторного редактора был выбран Inkscape. Основная причина выбора – распространение продукта под свободной лицензией. 3.6. Структура приложения Поскольку прикладной задачей является генерирование зданий по заранее заданному типу, то механизм процедурного генерирования должен обеспечить расстановку окон, балконов, дверных проемов на основании предоставленных системе входных параметров:  длина, ширина и высота прямоугольного параллелепипеда, в который будет вписано сгенерированное здание;
43  модели окон и их характеристики;  модели дверных проемов и их характеристики;  модели балконов и их характеристики;  тип здания. На начальном этапе работы генератора происходит устанавливание параметров: длины, высоты и ширины, которую указал пользователь. Эти параметры обозначают границы здания. У моделей окон, дверных проемов, балконов в процессе генерирования также определяются параметры длины ширины и высоты. Тип здания будет устанавливаться с помощью выбора схемы ТПЗ. Выходом системы будет являться сгенерированное здание. Данное программное обеспечение будет состоять из следующих блоков:  Графический интерфейс пользователя; Позволяет задавать параметры длины, ширины и высоты прямоугольного параллелепипеда, в который будет вписана конечная постройка, а также установить тип ТПЗ (технического плана здания).  Генератор зданий. Представляет собой совместную работу шаблона «абстрактная фабрика» и «фабричный метод». На этапе обработка данных, установленных пользователем, Фабричным методам передаются объекты-модели. Дальнейшую работу выполняют методы конкретного класса, реализующего интерфейс «абстрактной фабрики», заданного пользователем путем установления ТПЗ. Рассмотрим подробнее процесс информационных потоков работы генератора. Процесс создания здания будет проходить в несколько этапов: 1. Генерирование набора панелей; 2. Генерирование секций; 3. Создание фасадов;
44 4. Создание крыши. На третьем этапе создания фасада происходит возведение стен и секций типов, соответствующих типам фасада, учитывая зависимость от этажа. В ходе работы были выявлены следующие варианты построения стен:  Построение стен из блоков, эмитирующих кирпичную кладь; Данный метод предполагает использование большого количества полигонов, что существенно будет влиять на производительность ПО.  Построение панелей во весь фасад; При данном методе такая панель будет содержать минимальное количество полигонов, но становится необходимым использовать сторонние средства, позволяющие сделать оконные проемы. Конечный результат в таком случаи будет также содержать не малое количество полигонов, т.к. сторонние средства создают новые вершины.  Построение стен из панелей. Создавать панель можно таким образом, чтобы часть, отведенная под окно, была свободна. Проведя анализ всех вариантов, был выбран последний, при котором построение здания ведется с помощью панелей. При таком варианте можно генерировать рельеф для каждой панели в отдельности, позволяя создавать необычные решения при составлении секций. 3.6.1. Информационные потоки работы процедурного генератора зданий Процесс генерирования запускается после того, как пользователь указал все необходимые параметры и нажал кнопку “Сгенерировать”. Далее событие обрабатывается скриптом Menu.cs, отображающим
45 графический интерфейс пользователя. Происходит создание конкретной фабрики MultistoryFactory. Создается объект client класса Client, и запускается его метод Run(), которому передается созданная конкретная фабрика (см. Приложение 3). В методе Run() запускается метод Instal() для каждого класса реализующего один из следующих классов паттерна «абстрактная фабрика":  AbstractBasic – абстрактный класс создания плана здания (ПЗ);  AbstractDoor – абстрактный класс создания входной двери;  AbstractWindow - абстрактный класс создания окон;  AbstractWall – абстрактный класс создания стен фасада;  AbstractRoof – абстрактный класс создания крыши. Так как в реализуемом приложении есть единственный класс, реализующий класс AbstractFactory - MultistoryFactory, то запускаться будут методы Instal() следующих классов:  MultistoryBasic – класс создания ПЗ, реализующий интерфейс класса AbstractBasic;  MultistoryDoor – класс создания входной двери, реализующий интерфейс класса AbstractDoor;  MultistoryWindow – класс создания окон, реализующий интерфейс класса AbstractWindow;  MultistoryWall – класс создания стен фасада, реализующий интерфейс класса AbstractWall;  MultistoryRoof –класс создания крыши, реализующий интерфейс класса AbstractRoof. В методе Instal() каждого класса происходит создание соответствующих элементов:  метод Instal() класса MultistoryBasic – создает ТПЗ в виде списка сегментов, из которых ТПЗ состоит;
46  метод Instal() класса MultistoryDoor – загружает модели входов в подъезд;  метод Instal() класса MultistoryWindow – загружает модели окон;  метод Instal() класса MultistoryWall – производит создание стен, в качестве аргументов принимает объект класса MultistoryWindow, объект класса MultistoryDoor и объект класса MultistoryBasic.  метод Instal() класса MultistoryRoof – создает крышу, в качестве аргумента принимает объект класса MultistoryBasic. В работе алгоритма возведения стен учувствуют следующие классы:  Panel – класс создания панели с рельефом или без, с окном или без окна;  Section – класс создания секции;  Wall – класс возведение стены;  Fasade – класс возведение фасада;  Basic – класс создания плана здания. Клсасс MouseOrbit – облет камеры при повороте мыши. Класс Option– содержит основную информацию о генерируемом здании: количество этажей здания, длину, ширину и высоту прямоугольного параллелепипеда, в который будет вписано здание. Функция CreateReliefOnPanel (float L, Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3, int i) - создает рельеф для панели, в качестве аргумента получает, глубину вдавливания, четыре вектора блока и индекс из списка рельефа, указывающий: в случаи задания «0» - отсутствие рельефа, «-1» – выдавливание в глубь панели, «1» - выдавливание наружу, от панели. Функция CreatePanelPart () – создает блоки для панели c окном.
47 Функция CreatePanel (Vector3 vertex0, Vector3 vertex1, Vector3 vertex2, Vector3 vertex3) – создает панель, без проема для окна, в качестве аргументов принимает четыре вектора, которые будут образовать панель. Функция GenerateSectionIndex( int count ) – генерирует список индексов для секции, в качестве аргументов принимает количество индексов. Функция CreateMainSegment (GameObject section, float sectionSize, Vector3 v1, Vector3 v2) – создает панель, без проема для окна, в качестве аргументов принимает секцию, которой необходимо заполнить сегмент, размер секции, два вектора, обозначающих начало и конец сегмента. Функция CreateBalconySegment (GameObject section, float sectionSize, Vector3 v1, Vector3 v2) – создает панель, без проема для окна, в качестве аргументов принимает секцию, которой необходимо заполнить сегмент, размер секции, два вектора, обозначающих начало и конец сегмента. Функция CreateSideSegment (GameObject section, float sectionSize, Vector3 v1, Vector3 v2) – создает панель, без проема для окна, в качестве аргументов принимает секцию, которой необходимо заполнить сегмент, размер секции, два вектора, обозначающих начало и конец сегмента. Функция CreateWall (GameObject section, float sectionSize, Vector3 v1, Vector3 v2) – создает панель, без проема для окна, в качестве аргументов принимает секцию, которой необходимо заполнить сегмент, размер секции, два вектора, обозначающих начало и конец сегмента. Функция CreateFasade () – создает панель, без проема для окна. 3.6.2. Графический интерфейс пользователя Разработанное ПО предоставляет пользователю задавать параметры, для установления размеров конечного объекта – здания. Все остальные параметры, необходимые для создания здания заданы в классах для
48 создания объектов-продуктов и соответствуют строительным нормам, указанным в источнике [29]. На рисунке 3.1 представлено главное окно, которое видит пользователь, при запуске приложения. В данном окне располагается графический интерфейс пользователя и центровая площадка, на которой будет отображаться сгенерированная модель здания. Меню отображает скрипт Menu.cs. Рисунок 3.1 Главное окно Графический интерфейс пользователя, изображенный на рисунке 3.2, состоит из следующих подменю «Параметры здания». Меню «Параметры здания» содержит:  регуляторы длины и ширины фундамента, используемые при построении модели здания в качестве задания области, в которую будет вписан фундамент;  регулятор высоты – задаёт высоту модели здания. Рисунок 3.2 Графический интерфейс пользователя
49 Перед нажатием на кнопку «Сгенерировать» пользователем должны быть заданы все предоставленные параметры:  длина ПЗ;  ширина ПЗ;  высота модели здания;  план фундамента. План фундамента, автоматически задается тип, представленный на рисунке 3.3 . Рисунок 3.3 Тип ПЗ, представляющий прямоугольную область При нажатия на кнопку «Сгенерировать» создается конкретный объект, реализующий интерфейс «абстрактной фабрики». 3.6.3. Тип плана здания Класс Basic содержит список сегментов – последовательности пар векторов, один из которых является началом, другой конечной позицией сегмента. Конечный вектор сегмента совпадает с началом следующего, сегмента в списке. Таким образом, все расставленные сегменты в совокупности представляют план модели здания. Помимо списка сегментов, образующих план здания, в классе содержится список указания типа секции, которая будут использоваться для заполнения определенного сегмента. При составлении списка сегментов случайным образом генерируется длина каждого сегмента, с условием, что длина не может быть нулевой. При реализации данного ПО был использован единственный тип плана модели здания, схематично который представляет прямоугольную область.
50 3.6.4. Набор продуктов Для обеспечения работы Фабричных методов им были переданы следующие продукты:  Один вид окна для вставки в секцию главного фасада, имитирующее окно самого подъезда, располагаются строго над проемом входной двери;  Два вида окон для панелей, не относящихся к созданию подъезда;  Модель конструкции входа в подъезд, содержащая дверь четырех размеров;  Балконы одной модели четырех размеров. Модели балконов и входных конструкций должны быть в четырех вариантах, т.к. панель может быть одного из четырех размеров, который указан в списке длин панелей. Например, в случае если в списке индексов стоит индекс для вставки балкона, и этому индексу из списка длин соответствует длина в два с половиной метра, то при заполнении балконной секции на это место выставляется балкон именно с размером два с половиной метра. 3.6.5. Построение панели В источнике [30] указано, что одними из самых распространенных вариантов рельефа панелей модели зданий являются горизонтальные или вертикальные выступы в длину или высоту панели соответственно. На рисунке 3.5 представлены возможные варианты рельефа.
51 Рисунок 3.5 Варианты рельефа панелей. Существует три варианта положения такого рельефа. Выступ может проходить вдоль края панели, вдоль границ окон панели, также может одновременно находиться на определенном расстоянии от края панели и границы окна панели, по вертикали или горизонтали. При разбиении панели модели здания на области для создания рельефа, необходимо учитывать, что выступ может проходить с любой из сторон панели.
52 В соответствии с этим панель модели здания строится с учетом вставки окна, и строится из 49 прямоугольных областей. Одна область, формируется под окно, остальные 48 необходимы для создания рельефа. Так как рельеф панелей считается элементом декора, длины, и высоты областей задаются случайно. У областей, лежащих на одной прямой, по горизонтали равны высоты, по вертикали – длины. Область под окно располагается на середине длины панели модели здания, расположение областей зеркально отражено относительно вертикали, проходящей через середину длины панели здания. На рисунке 3.6 изображена сгенерированная панель модели здания, отображающая все 49 областей, из которых она состоит. Рисунок 3.6 Панель здания, из составляющих элементов Создание рельефа происходит путем формирования выс тупа из составной области панели модели здания. Длина каждой панели выбирается случайным образом из массива, хранящего стандартные длины панелей. На рисунке 3.7 изображена сгенерированная панель модели здания с окном.
53 Рисунок 3.7 Панель модели здания, из составляющих элементов с окном 3.6.6. Построение секции Под секцией понимается последовательность панелей, создающая определенную композицию при формировании сегмента. Выделены следующие типы секций: секция для главного фасада – фасада с панелями входа в здание; секция с панелями, содержащими балконы; секция боковой панели, которая может представлять собой пустую панель, т.е . без окна, балкона, дверного проема, либо с их случайным количественным набором. На рисунке 3.8 представлена секция с балконами.
54 Рисунок 3.8 Секция для фасада с балконами Секция собирается из панелей, указанных в списке сгенерированных для текущей постройки панелей. Генерируется список индексов панелей, которые будут содержать сегмент, генерирование происходит в пределах, определенных списком панелей, которые будут содержать сегмент. Количество панелей в секции определяется случайным образом, и задается от нижней границы, равной 5, до верхней границы, включая её – до 9. При проходе по списку индексов происходит копирование указанного элемента списка панелей, сгенерированных для текущей постройки в объект, который будет хранить секцию. На рисунке 3.9 представлена секция для главного фасада. Объект секции для главного фасада, хранит позицию, на которую при создании фасада в зависимости от этажа будет вставлена панель с окном или дверной проем подъезда. Рисунок 3.9 Секция для главного фасада
55 3.6.7. Возведение стен сегмента Сегмент – отрезок, в пределах длины которого будут расставляться секции. Из сегментов создается рисунок фасада. Сегмент заполняется полностью вошедшими секциями. Остаток сегмента, в который секция не вошла, заполняется пустыми панелями. Для определения размера этих пустых панелей происходит деление этого остатка, на количество пустых панелей, которое определяется количеством вошедших сегментов, увеличенным на единицу. Каждая секция сегмента должна с обеих сторон содержать пустую добавочную панель. На рисунке 3.10 отображена главная секция первого этажа, с незаполненным дверным проемом, а на рисунке 3.11 – главная секция первого этажа с установленным дверным проемом. Рисунок 3.10 Секция для первого этажа главного фасада до установления дверного проёма
56 Рисунок 3.11 Секция для первого этажа главного фасада после установления дверного проёма 3.6.8. Создание фасада Для создания фасада необходимо знать параметр высоты модели здания, высоту этажа, а также длину сегмента текущего фасада. На рисунке 3.12 представлен главный фасад, содержащий проемы для входа в подъезд. Рисунок 3.12 Главный фасад
57 В цикле происходит возведение стен на сегменте в пределах количества вмещаемой в высоту здания высоты этажа. Для главного фасада учитывается, что для первого этажа должны выставляться секции с дверными проемами, а на последующих этажах вместо них должны находиться панели с окнами, предназначенными для подъезда. 3.6.9. Создание здания У каждого здания в зависимости от типа ТПЗ есть свой список сегментов, а также список типов используемых в сегменте секций. Так, например, для дома, ТПЗ которого будет состоять из четырех сегментов, образуя прямоугольную область, список типов сегментов будет следующий:  первый сегмент – главная секция,  второй сегмент – боковая секция,  третий сегмент – балконная секция,  четвертый сегмент – боковая секция. Фасад для каждого сегмента создается в соответствии с указанными парами. Фасады сначала создаются в одной точке, затем поворачиваются на определенный угол, который определяется в зависимости от последовательности двух векторов, указывающих точки начала и конца линии, подразумевающей сегмент. На рисунке 3.13 представлен результат генерирования – модель жилого здания. После создания всех фасадов, работа передаётся классу Roof, который создает крышу для здания. В данном генераторе крыша по своему типу плоская.
58 Рисунок 3.13 Сгенерированное здание
59 ЗАКЛЮЧЕНИЕ Шаблоны проектирования — это инструменты разработчика, которые помогают сэкономить время при разработке систем и сделать архитектурное решение более качественным. В результате выполнения дипломной работы было разработано ПО генерирования программных объектов с использованием шаблонов ООП. Данное ПО является примером пользования порождающих шаблонов ООП для решения задач процедурной генерации. В работе осуществлен выбор составного шаблона, включающего шаблон «абстрактная фабрика» и «фабричный метод». Использованный в работе подход может применяться для задачи процедурного генерирования для случаев, когда необходимо создавать объекты одного семейства, имеющие разные алгоритмы построения или разные продукты, из которых будет составлен конечный объект. Разработанное ПО в рамках прикладной задачи процедурно в режиме реального времени генерирует здания, сконструированные в среде Unity3D.