Video Tutorials
Interface
Essentials
Advanced
Полезные советы
UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Working With Projects
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Lighting
Landscape Tool
Using Editor Tools for Specific Tasks
Extending Editor Functionality
Программирование
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine Tools
GUI
Double Precision Coordinates
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
Работа с контентом
Content Optimization
Materials
Art Samples
Tutorials

Устройство виртуального мира

Виртуальный мир в UNIGINE представляет собой сцену, которая содержит различные объекты с определенными свойствами. Большая часть объектов является видимой (деревья, трава, горы и т. д.), но также существуют псевдо-объекты, которые в обычном режиме не отображаются: физические явления и объекты, секторы, загораживающие объекты и другие.

Как правило, виртуальный мир содержит следующие компоненты:

  • встроенные объекты, называемые нодами (nodes). Ноды могут ссылаться на другие ноды (файлы с расширением *.node), меши (полигональные сетки с расширением *.mesh), аудиофайлы (*.oga), траектории (*.path), скрипты (*.h);
    Примечание
    Виртуальный мир может содержать в себе как ноды, так и ссылки на ноды, которые сохраняются в файлы с расширением *.node. В свою очередь, файлы с расширением *.node могут хранить в себе как сами ноды, так и ссылки на другие *.node файлы.
  • свойства и материалы;
  • шейдеры и текстуры для материалов;
  • настройки отрисовки, физики, звука и общие игровые настройки.

Виртуальный мир хранится в файле с расширением .world в формате XML.

Новый мир можно создать через панель Menu в UnigineEditor или через UNIGINE SDK Browser при создании нового проекта.

Каждый мир хранится на диске в отдельном файле формата XML с расширением .world. Содержимое мира создается и управляется через UnigineEditor.

Можно создавать контент и управлять им через логику мира: она пишется в файле UnigineScript (*.usc) для проектов, которые используют только UnigineScript, файле AppWorldLogic.cpp для приложений на C++ или AppWorldLogic.cs для приложений на C#.

Взаимодействие компонентов виртуального мира

Так как UNIGINE поддерживает потоковую подгрузку данных (streaming) и все ресурсы — меши, текстуры, анимации, звуки — могут быть подгружены при необходимости во время работы движка, дизайнеры могут создавать миры колоссальных размеров. Потоковая подгрузка позволяет не держать все ресурсы в памяти.

Примечание
Координаты объектов в виртуальном мире хранятся в формате float, и иногда для больших миров этой точности может быть недостаточно. Тем не менее, визуальные артефакты на малых объектах начинают появляться лишь на расстоянии от 50 тысяч единиц (unit).
Кроме того, при экспорте из сторонних 3D редакторов для больших сцен рекомендуется использовать масштаб 1 единица (unit) = 1 метр.

Виртуальный мир может быть поделен на несколько частей для удобства его редактирования.

Система координат#

Трехмерное пространство виртуального мира описывается декартовой системой координат с направлением осей по правилу правой руки, где X и Y — это оси горизонтальной плоскости, а Z указывает наверх. При экспорте 3D моделей и анимации из 3D редакторов, ось Y рассматривается как вектор направления движения.

Трехмерная система координат

Положительным углам вращения соответствует вращение вектора против часовой стрелки в системе координат: согласно правилу буравчика (или правилу правой руки), если большой палец правой руки направить в положительном направлении оси координат, то остальные пальцы руки покажут направление вращения.

Направления вращения

Встроенные объекты#

Встроенные объекты подходят для создания практически любого контента виртуальной сцены. Объекты разделены на несколько групп в зависимости от вида задачи.

Примечание
В UNIGINE все объекты, добавляемые в виртуальный мир, называются ноды (nodes) и отображаются в окне World Hierarchy редактора UnigineEditor.

Виртуальный мир может содержать как ноды, так и ссылки на ноды, которые хранятся во внешних файлах с расширением .node. Нода может ссылаться на меши (*.mesh), аудиофайлы (*.oga) или траектории (*.path).

Ноды, которые относятся к типу "объект" (object-related nodes) могут иметь поверхности (surfaces), назначенные физические тела (bodies) (включая формы (shapes) для определения столкновений с другими объектами, и соединения (joints) для крепления к другим объектам). Поверхности содержат ссылки на материалы и свойства. Ссылка создается автоматически, когда вы назначаете на поверхность определенный материал или свойство.

Примечание
На одну поверхность может быть назначен только один материал и одно свойство.

Поверхность является неделимым элементом рендеринга (каждая поверхность требует свой вызов отрисовки DIP) и может представлять собой:

  • часть объекта, на которую назначается отдельный материал;
  • один из уровней детализации (LOD), включая LOD-ы отражений и теней. В этом случае поверхности представляют один и тот же объект или его часть в более или менее детализированном виде (высоко- и низкополигональный меши). В свойствах каждой поверхности можно определить, на каком расстоянии от камеры она будет видна (чем дальше от камеры, тем менее детализирована поверхность).

Также у поверхности может быть несколько морфинговых объектов (комбинируемых форм).

Учитывая вышесказанное, можно расширить схему компонентов виртуального мира следующим образом:

Взаимодействие основных компонентов виртуального мира

Иерархия нод#

Все ноды состоят в иерархии: родительские (parent) и дочерние (child) ноды; у одной ноды может быть несколько дочерних нод.

Иерархия нод в окне World Hierarchy редактора

Позиция нод первого уровня (родительских), задается в глобальных координатах. Позиция дочерних нод задается в локальных координатах относительно родительской (если не были заданы другие условия). Благодаря этому любая операция трансформации (перемещение, вращение, изменение размера) одной родительской ноды повлечет за собой трансформацию всех дочерних: мы можем передвинуть всего одну ноду, задавая ей координаты в глобальном пространстве, а для ее дочерних нод местоположение будет рассчитано автоматически.

Базис глобальной системы координат находится в центре виртуального мира и задается автоматически. В случае с локальной системой координат, в качестве базиса берется точка привязки (pivot point) родительской ноды.

Поверхности#

Как говорилось выше, ноды, которые относятся к типу "объект", могут иметь поверхности.

Surfaces

Поверхности

Количество поверхностей ноды зависит от того, как меш был импортирован в UNIGINE. Количество поверхностей невозможно изменить динамически при работе движка. Но при необходимости меш можно повторно импортировать. Каждая поверхность может добавить новый вызов отрисовки DIP для GPU.

Примечание
Идентичные поверхности одинаковых мешей, на которые назначен один и тот же материал, автоматически группируются и отрисовываются за один вызов отрисовки DIP.

Поверхности участвуют в отсечении невидимых частей объекта, т. е. скрытых другими объектами. Также они задействованы для вычисления столкновений с физическими объектами.

Примечание
Для уменьшения количества вычислений рекомендуется использовать настолько малое количество поверхностей у 3D модели, насколько это возможно.

При необходимости какие-либо из поверхностей ноды можно отключить (в этом случае они не будут отрисованы).
Операции с поверхностями (удаление, добавление, изменение) в редакторе невозможны. Это связано с тем, что 3D модели с поверхностями создаются в сторонних 3D редакторах, поэтому необходимо изменить поверхности в 3D редакторе и повторно импортировать его в редактор.

На каждую поверхность можно назначить отдельный материал и свойство.

Поверхности часто используются как разные уровни детализации одного объекта. Подробнее о границах видимости и плавного исчезновения рассказано в разделе Уровни детализации.

Симуляция физики объектов#

Объекты в виртуальном мире могут взаимодействовать с окружающей средой благодаря симуляции физики. Чтобы физические законы в виртуальном мире работали, но при этом сохранялась высокая частота кадров в секунду, физическая симуляция является упрощенной по сравнению с реальной физикой. Основной целью физической симуляции является обнаружение столкновений объектов.

Для обнаружения столкновений на объекты должны быть назначены тела (bodies). Тип тела задает поведение объекта и присущие ему физические свойства. Например, твердые тела (rigid body) сохраняют свою форму и не деформируются, а ткани (cloth) легко деформируются и могут порваться.

Чтобы взаимодействие состоялось, помимо тела у объекта должна быть форма (shape). Форма определяет объем, занимаемый данным объектом. В UNIGINE есть несколько типов форм: куб (box), сфера (sphere), капсула (capsule), цилиндр (cylinder), выпуклая оболочка (convex hull) или произвольная форма. Форма используется для вычисления столкновения объектов.

Несколько форм могут быть связаны между собой соединениями (joints). В UNIGINE есть несколько типов соединений: жесткое (fixed joint), шаровое (ball joint), шарнирное (hinge joint), призматическое (prismatic joint), цилиндрическое (cylindrical joint), колесное (wheel joint) и подвеска (suspension joint). Тип соединения показывает, как формы объектов могут двигаться относительно друг друга.

Материалы#

На самом деле, пока материал не назначен, ноды являются невидимыми объектами в сцене. Материал хранит в себе информацию о том, как должна быть отрисована та или иная поверхность ноды. В общем, материал — это набор свойств (режимов, параметров, проходов отрисовки, шейдеров) и текстур, на основании которых отрисовываются поверхности.

Объект Material Ball без назначенного материала
Объект Material Ball с назначенным на него материалом mesh_base
Даже если на поверхности ноды не назначен материал, нода всё равно может быть задействована в определении столкновений и пересечений.

Для управления отрисовкой поверхностей без назначенных на них материалов настройте их отображение с помощью маски окна просмотра (viewport mask).

Примечание
Несмотря на то, что отрисовка поверхности в окно просмотра будет отключена при помощи маски, тень все равно будет отрисована.

В UNIGINE существуют два типа материалов:

  • Базовые материалы, доступные только для чтения. Такие материалы создаются программистами и хранятся в файлах с расширением *.basemat. При создании проекта в UNIGINE в него добавляется стандартный набор базовых материалов.
  • Пользовательские материалы с возможностью редактирования. Такие материалы наследуются от базовых или других пользовательских материалов и хранятся в файлах с расширением *.mat. Их созданием и настройкой занимаются 3D художники.

В набор базовых свойств материала входят:

  • Настройки (Options). Набор настроек, заранее определенный и неизменный для всех материалов. Каждая настройка изменяет поведение материала в виртуальном мире. Значения настроек базовых материалов жестко закодированы, значения всех других материалов могут быть изменены.
  • Режимы (States). Движок выбирает, какие шейдеры, текстуры и параметры выбрать, обращая внимание на данные режимы. Например, можно задать режим, включающий/отключающий морскую пену. В зависимости от выбранного режима (есть пена / нет пены), движок будет выбирать необходимые шейдеры.
  • Текстуры (Textures). Набор текстур для материала. Как правило, для базового материала устанавливается несколько текстур. Это обусловлено следующими причинами:
    • для работы шейдера может потребоваться более одной текстуры;
    • на разных этапах рендеринга используются разные текстуры;
    • для режима также может потребоваться отдельная текстура.
  • Параметры (Parameters). Параметры — это аргументы, передаваемые шейдеру. При помощи параметров можно регулировать значения, передаваемые в шейдер.
  • Шейдеры (Shaders). Шейдеры — это основа материалов. Именно шейдеры отрисовывают материал, опираясь на заданные параметры, текстуры и т. д. Каждый материал имеет несколько шейдеров, и в зависимости от выбранного режима и этапа отрисовки используется необходимый шейдер.

Набор свойств пользовательских материалов точно такой же, что и в базовых материалах, поскольку пользовательский материал наследуется об базового и изменяются лишь значения настроек, режимов, текстур и параметров.

Примечание
Пользовательский материал не может обращаться к шейдеру. Он только перенастраивает свойства, которые отправляются в шейдеры, используемые базовым материалом, от которого был отнаследован пользовательский материал.

Помимо этого, существуют программируемые материалы. Эти материалы создаются и редактируются вручную: изменения, сделанные через редактор материалов (Materials Editor) в среде выполнения, сохраняться не будут. Все базовые материалы (как встроенные, так и нестандартные) редактируются вручную. Но не каждый материал, редактируемый вручную, является базовым: пользовательские материалы также могут оказаться редактируемыми вручную.

Примечание
Вы можете использовать одинаковые имена для базовых (*.basemat), пользовательских (*.mat) и редактируемых вручную (*.basemat или *.mat) материалов внутри одного проекта — это не создаст конфликтов.

Иерархия материалов#

В UNIGINE материалы организованы в иерархию, но иерархия материалов абсолютно независима от иерархии нод. Родительский материал передает свои свойства дочернему материалу, в котором эти свойства могут перенастраиваться.

Примечание
При изменении свойств и параметров родительского материала происходит автоматическое изменение этих свойств и параметров в дочерних материалах, если они не перенастраивались.

Базовые материалы не могут быть организованы в иерархию, поскольку базовый материал невозможно унаследовать от другого базового материала. Если вам нужно изменить свойства базового материала, можно создать новый пользовательский материал, унаследовав его от подходящего базового материала. Этот базовый материал передаст свои свойства дочернему материалу, а вы их перенастроите. Таким образом, получается, что базовые материалы всегда находятся вверху иерархии материалов.

В основе иерархии материалов лежат GUID-ы. Для базовых и редактируемых вручную материалов GUID-ы генерируются в среде выполнения, используя имена этих материалов, которые хранятся в файлах материалов. Для пользовательских материалов GUID-ы также генерируются в среде выполнения при создании материала и хранятся в файлах *.mat, но в файлах материалов ссылки на материалы могут быть как через имя, так и через GUID.

Примечание
Поверхности ссылаются на материалы только по GUID-у.

При клонировании или наследовании созданный материал является внутренним до тех пор, пока ему не будет присвоено имя.

Порядок загрузки материалов не важен: при запуске движка загружаются все материалы проекта, и базовые — в первую очередь. А поскольку каждый материал с расширением *.mat ссылается как на родительский, так и на базовый материал, базовый используется в качестве родительского, пока родительский материал не загрузится. Таким образом, после загрузки приложения в иерархии материалов будут представлены все существующие в проекте материалы.

Иерархия материалов в окне Materials Hierarchy

Разберем следующий пример.

Объект Material Ball с назначенным на него материалом mesh_base
Объект Material Ball с пользовательским материалом, унаследованным от mesh_base

Объект слева отрисован с использованием одного из встроенных базовых материалов. Для объекта справа наследуется материал от базового, в котором заменяются две текстуры (текстуры альбедо и нормалей). Остальные свойства настраивать не нужно, поскольку они все унаследованы. Тем не менее, при необходимости вы можете перенастроить любое свойство точно так же, как мы изменили текстуру объекта.

Все свойства материалов (за исключением шейдеров) можно перенастраивать в UnigineEditor. Однако если вам нужно расширить набор свойств или переписать шейдеры, то придется создать нестандартный материал. Более детальная информация по этому вопросу представлена в разделе Materials Files, включая описание деклараций материалов в XML.

Свойства#

Для полноценной интеграции объекта в виртуальный мир одного внешнего вида недостаточно. Свойства (properties) определяют способ взаимодействия объекта с другими объектами и окружающей средой.

Если материал — это правило, которое используется для рендеринга, то свойство — это правило для логики приложения, которое состоит из набора логических параметров. Из свойств можно составить компоненты для того, чтобы расширить функциональность нод.

Можно задать условия, на основании которых параметры свойства будут отображены или скрыты в UnigineEditor.

В системе свойств UNIGINE представлены следующие виды свойств:

Свойство можно назначить как на всю ноду целиком, так и на отдельную поверхность:

  • В первом случае свойства могут содержать дополнительные настройки, которые расширяют встроенный функционал (например указывают, что нода является интерактивной и используется как переключатель). Свойство для персонажа игры может содержать очки здоровья или количество золота в инвентаре.
    Примечание
    На одну ноду можно назначить несколько свойств.
  • Во втором случае свойство может содержать определенные параметры, которые используются при физическом контакте с поверхностью. Например, при помощи свойства можно задать тип материала, назначенный на поверхность (дерево, металл, пластик и т. д.).
    Примечание
    На поверхность можно назначить только одно свойство.

Таким образом, свойства заставляют ноды подчиняться логике приложения.

Если свойство нужно назначить на отдельную поверхность, то его необходимо унаследовать от свойства surface_base.
Рекомендуется наследовать свойства, которые будут назначаться на nodes, от свойства node_base, хотя на ноду можно также назначить любое нестандартное базовое свойство или его дочерние свойства.

Назначить свойство можно одним из доступных способов.

Каждое свойство хранится в отдельном файле с расширением *.prop, за исключением внутренних свойств.

Иерархия свойств#

Иерархия свойств в UNIGINE строится на тех же принципах, что и иерархия материалов — одно свойство наследуется от другого. Родительское свойство передает все параметры своим потомкам, чтобы их можно было перенастроить, в соответствии с подходом объектно-ориентированного программирования.

Примечание
Все унаследованные и неперенастроенные параметры дочерних свойств автоматически обновляются при их изменении в родительском свойстве.

Иерархия свойств

В основе иерархии свойств лежат GUID-ы — обращение к каждому из свойств происходит по GUID-у, даже к базовым и программируемым свойствам (GUID-ы таких свойств генерируются в среде выполнения и определяются уникальным образом по именам). Только пользовательские свойства хранят GUID-ы в явном виде — GUID генерируется автоматически при создании пользовательского свойства и записывается в соответствующий файл с расширением *.prop.

Свойства в иерархии можно переименовывать, клонировать, наследовать, удалять или менять для них родителя в один клик.

Примечание
Переименование и смена родителя для программируемых свойств в UnigineEditor не поддерживаются. Это можно сделать вручную путем редактирования файла с расширением *.prop.
Последнее обновление: 16.08.2019