УДК 004.946
Кулаков Д.Г., Иванов С.И.
ВИЗУАЛИЗАЦИЯ МОДЕЛИРУЕМОЙ СИСТЕМЫ С ПОМОЩЬЮ ГРАФИЧЕСКОГО ДВИЖКА UNITY
Кулаков Дмитрий Геннадьевич - бакалавр 2-го года обучения кафедры информационных компьютерных технологий, e-mail: dimacreator1998@gmail.com;
ФГБОУ ВО «Российский химико-технологический университет им. Д.И. Менделеева», Россия, Москва, 125047, Миусская площадь, дом 9.
Иванов Святослав Игоревич - кандидат технических наук, руководитель отдела разработки #3 ООО "КристаллД";
Москва, Россия 117630, Старокалужское шоссе, дом 62а, 604.
В данной работе рассматривается способ визуализации моделируемого процесса с помощью графического движка Unity, затрагиваются другие способы визуализации и их достоинства и недостатки, а также рассматриваются другие графические движки. Описывается способ применения подхода на примере моделируемой системы игры "Жизнь".
Ключевые слова: Unity, моделирование, визуализация, графические движки, рендеринг.
VISUALIZATION OF THE SIMULATED SYSTEM USING THE UNITY GRAPHICS ENGINE
Kulakov D.G.1, Ivanov S.I.2
1 D. Mendeleev University of Chemical Technology of Russia, Moscow, Russian Federation
2 LLC "CrystallD"
This paper discusses a way to visualize a simulated process using the Unity graphics engine, discusses other visualization methods and their advantages and disadvantages, and also discusses other graphics engines. The method of application of the approach is described on the example of the simulated system of the game "Life ". Keywords: Unity, modelling, visualization, graphics engines, rendering.
Введение
Частой задачей описания какого-либо процесса является компьютерное моделирование этого процесса с получением данных на различных этапах его выполнения и желательно чтобы эти данные отображались графически, показывая то, как наглядно выглядит процесс, а не только выводились в виде графиков и диаграмм. Существует много способом графической визуализации процесса, вот некоторые из них:
• Визуализация с помощью инструментов моделирования - во многих инструментах моделирования, таких как Matlab, уже есть встроенные инструменты визуализации, но проблема в том, что эти инструменты предназначены для конкретных и точечных задач.
• Визуализация с помощью графических библиотек - этот подход заключается в использовании таких графических библиотек как, OpenGl, DirectX, проблема подхода в том, что изначально нужно обучиться пользованию API данных библиотек.
• Визуализация с помощью графических движков - этот подход заключается в применении графических движков как, Unity, Unreal Engine, Source и подобных в целях графической визуализации процесса, именно этот подход будет рассмотрен в данной статье.
На рынке довольно много графических движков, далее будут перечислены самые популярные:
Unreal Engine - кроссплатформенный игровой движок от компании Epic Games, на нём разработаны такие игры, как Fortnite, Borderlands и много других,
в качестве языка программирования использует язык C++.
Source - игровой движок от компании Valve, на нём разработаны такие игры как CS GO, Dota 2 и Half Life, в качестве языка программирования использует язык C++.
Unity - кроссплатформенный движок он компании Unity Technologies, на нём разработаны такие игры, как Hearthstone, Escape from Tarkov, Fall Guys и много других, в качестве языка программирования использует язык C#, также в более ранних доступных версиях есть поддержка языка JavaScript. Рассматриваемый подход абсолютно не зависит от выбора движка, но для практического примера, описываемого в данной статье, был выбран движок Unity и язык C#. В качестве описываемого процесса выбрана одна из вариаций игры "Жизнь" "Зайцы и волки".
Описание игры "Зайцы и волки"
В игре присутствует игровое поле, состоящее из клеток, трава, которая может находиться на клетках, но не занимать их, зайцы и волки, занимающие клетку, которые имеют показатели сытости, времени жизни и порог сытости необходимой для размножения.
Зайцы передвигаются по полю, максимум на две клетки за ход, если заяц оказывается на клетке с травой, то он поедает её, тем самым восстанавливая себе сытость до максимума, если у зайца достаточно сытости для размножения и рядом есть заяц с достаточной сытостью они размножаются.
Волки также передвигаются по полю, но максимум на одну клетку за ход, если они встают на клетку, занимаемую зайцем, то они его поедают, тем самым восстанавливая сытость, размножение происходить аналогичным с зайцем способом.
В начале каждого хода на поле поддерживается процентное количество травы.
Термины
• Сцена - пространство, в котором располагаются все объекты участвующие в визуализации
Проект - папка, где находится все файлы кода, ресурсы, используемые программой, а именно модели, картинки, звуки и так далее.
• Vector3 - структура данных, которая содержит 3 дробных числа, используется для описания пространства и положения объектов в сцене.
• Инспектор - окно Unity, которое содержит информацию об объекте в сцене. Компонент - некий код, который описывает логику поведения и который назначается какому-либо объекту с помощью инспектора.
• GameObject - класс, представленный библиотекой UnityEngine, который содержит методы и свойства для управления объектом в сцене из кода, содержит свойство transform, которое в свою очередь содержит свойства position, rotation и scale, которые отвечают за позицию, поворот и масштаб объекта в сцене.
• MonoBechaviour - класс, представленные библиотекой UnityEngine, от которого мы обязаны унаследовать наш класс, описывающий логику объекта, чтобы применить его как компонент для объекта в сцене.
• Префаб - заранее настроенный объект, который содержит какую-либо логику. Префаб можно сохранить в файлах проекта и использовать неограниченное количество раз.
Описание подхода
Для решения задачи будет использоваться MVC (model-view-controller) подход, по сути, консольная программа уже содержит в себе model - описание объектов, которые участвуют в системе и controller -логика взаимодействия объектов в системе. С помощью Unity остаётся реализовать view - способ отображения объекта, исходя из данных нашей системы.
В данном примере в качестве моделей взяты примитивные формы, которые доступны в Unity по умолчанию во вкладке GameObject -> 3D Object, и модели, сделанные с помощью Magica Voxel, но при желании можно использовать любые графические модели, созданные в программах 3Б-моделирования (3dMax, Blender, Maya и др.) от того какие модели будут выбраны не изменится работа программы. Unity поддерживает модели в формате .fbx и .obj и чтобы их использовать их нужно просто добавить в папку проекта.
Реализация подхода
Для реализации view были в сцене были созданы объекты примитивов и сохранены как префабы, далее на рисунках 1,2,3,4 представлены получившиеся объекты.
Рис. 1. View для клетки без травы (примитив куба
\
Рис. 2. View для клетки с травой (примитив куба)
Далее было описаны поля в классе животного и классе клетки, которые имеют тип GameObject и которые будут содержать в себе ссылку на сохранённые префабы._
Я
Рис. 3. View для зайца (Модель)
Рис. 4. View для волка (Модель)
Далее был описан класс Manager, который будет содержать настройки системы, он обязательно должен наследоваться от класса MonoBechaviour, так как впоследствии будет прикреплён к классу в сцене как компонент. Чтобы приватные поля были видны в инспекторе игрового объекта к полю нужно применить атрибут [SerializeField]. Для того, чтобы настраивать систему из сцены был создан пустой игровой объект GameObject -> Create Empty, которому через инспектор был установлен компонент Manager.
За создание игрового объекта в сцене из кода отвечает метод Object.Instantiate(GameObject prefab, Vector3 position, Quaternion rotation), где prefab — это ссылка на префаб нашего объекта, то, что нужно создавать, position — позиция объекта в сцене, rotation — это поворот объекта в сцене, обычно берётся Quaternion.identity, что не меняет поворот относительно префаба. Далее был добавлен вызов метода Object.Instantiate в конструкторы классов.
Чтобы уничтожать объекты в Unity предусмотрен метод Object.Destroy(GameObject gameObject), который принимает в себя аргумент GameObject, ссылку на объект, который нужно удалить из сцены, в данном случае это view, который в данный момент должен подвергнуться удалению, в случае съедания зайца волком или смерти от голода.
Далее в метод смерти у животного был добавлен вызов метода удаления объекта со сцены.
Перемещение объектов в сцене было реализовано с помощью изменения у них свойства transform.position. Для этого в методе перемещения позиции view модели задавалась позиция той клетки, на которую перемещался объект.
Далее, на рисунке 5, представлена сцена моделируемого процесса.
Рис. 5. Пример поля размером 10x10, 5 волков, 10 зайцев
Вывод
В данной статье был реализован подход к визуализации данных компьютерного моделирования на примере вариации игры "Жизнь" с помощью графического движка Unity. Данный подход применим для визуализации данных любого моделируемого процесса и абсолютно не зависит от моделируемой системы.
Ссылки
1. Код программы на C#: https://github.com/DimasCreator/RabbitsAndW olves/tree/master;
2. Проект на Unity: https://github.com/DimasCreator/RabbitsAndW olvesUnity
Список литературы
1. Официальная документация Unity [Электронный ресурс]; URL:
https://docs.unity3d.com/ScriptReference/