Устройство виртуального мира
Виртуальный мир в 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) и все ресурсы — меши, текстуры, анимации, звуки — могут быть подгружены при необходимости во время работы движка, дизайнеры могут создавать миры колоссальных размеров. Потоковая подгрузка позволяет не держать все ресурсы в памяти.
Кроме того, при экспорте из сторонних 3D редакторов для больших сцен рекомендуется использовать масштаб 1 единица (unit) = 1 метр.
Виртуальный мир может быть поделен на несколько частей для удобства его редактирования.
Система координат#
Трехмерное пространство виртуального мира описывается декартовой системой координат с направлением осей по правилу правой руки, где X и Y — это оси горизонтальной плоскости, а Z указывает наверх. При экспорте 3D моделей и анимации из 3D редакторов, ось Y рассматривается как вектор направления движения.
Положительным углам вращения соответствует вращение вектора против часовой стрелки в системе координат: согласно правилу буравчика (или правилу правой руки), если большой палец правой руки направить в положительном направлении оси координат, то остальные пальцы руки покажут направление вращения.
Встроенные объекты#
Встроенные объекты подходят для создания практически любого контента виртуальной сцены. Объекты разделены на несколько групп в зависимости от вида задачи.
Виртуальный мир может содержать как ноды, так и ссылки на ноды, которые хранятся во внешних файлах с расширением .node. Нода может ссылаться на меши (*.mesh), аудиофайлы (*.oga) или траектории (*.path).
Ноды, которые относятся к типу "объект" (object-related nodes) могут иметь поверхности (surfaces), назначенные физические тела (bodies) (включая формы (shapes) для определения столкновений с другими объектами, и соединения (joints) для крепления к другим объектам). Поверхности содержат ссылки на материалы и свойства. Ссылка создается автоматически, когда вы назначаете на поверхность определенный материал или свойство.
Поверхность является неделимым элементом рендеринга (каждая поверхность требует свой вызов отрисовки DIP) и может представлять собой:
- часть объекта, на которую назначается отдельный материал;
- один из уровней детализации (LOD), включая LOD-ы отражений и теней. В этом случае поверхности представляют один и тот же объект или его часть в более или менее детализированном виде (высоко- и низкополигональный меши). В свойствах каждой поверхности можно определить, на каком расстоянии от камеры она будет видна (чем дальше от камеры, тем менее детализирована поверхность).
Также у поверхности может быть несколько морфинговых объектов (комбинируемых форм).
Учитывая вышесказанное, можно расширить схему компонентов виртуального мира следующим образом:
Иерархия нод#
Все ноды состоят в иерархии: родительские (parent) и дочерние (child) ноды; у одной ноды может быть несколько дочерних нод.
Позиция нод первого уровня (родительских), задается в глобальных координатах. Позиция дочерних нод задается в локальных координатах относительно родительской (если не были заданы другие условия). Благодаря этому любая операция трансформации (перемещение, вращение, изменение размера) одной родительской ноды повлечет за собой трансформацию всех дочерних: мы можем передвинуть всего одну ноду, задавая ей координаты в глобальном пространстве, а для ее дочерних нод местоположение будет рассчитано автоматически.
Базис глобальной системы координат находится в центре виртуального мира и задается автоматически. В случае с локальной системой координат, в качестве базиса берется точка привязки (pivot point) родительской ноды.
Поверхности#
Как говорилось выше, ноды, которые относятся к типу "объект", могут иметь поверхности.
Количество поверхностей ноды зависит от того, как меш был импортирован в UNIGINE. Количество поверхностей невозможно изменить динамически при работе движка. Но при необходимости меш можно повторно импортировать. Каждая поверхность может добавить новый вызов отрисовки DIP для GPU.
Поверхности участвуют в отсечении невидимых частей объекта, т. е. скрытых другими объектами. Также они задействованы для вычисления столкновений с физическими объектами.
При необходимости какие-либо из поверхностей ноды можно отключить (в этом случае они не будут отрисованы).
Операции с поверхностями (удаление, добавление, изменение) в редакторе невозможны. Это связано с тем, что 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) в среде выполнения, сохраняться не будут. Все базовые материалы (как встроенные, так и нестандартные) редактируются вручную. Но не каждый материал, редактируемый вручную, является базовым: пользовательские материалы также могут оказаться редактируемыми вручную.
Иерархия материалов#
В UNIGINE материалы организованы в иерархию, но иерархия материалов абсолютно независима от иерархии нод. Родительский материал передает свои свойства дочернему материалу, в котором эти свойства могут перенастраиваться.
Базовые материалы не могут быть организованы в иерархию, поскольку базовый материал невозможно унаследовать от другого базового материала. Если вам нужно изменить свойства базового материала, можно создать новый пользовательский материал, унаследовав его от подходящего базового материала. Этот базовый материал передаст свои свойства дочернему материалу, а вы их перенастроите. Таким образом, получается, что базовые материалы всегда находятся вверху иерархии материалов.
В основе иерархии материалов лежат GUID-ы. Для базовых и редактируемых вручную материалов GUID-ы генерируются в среде выполнения, используя имена этих материалов, которые хранятся в файлах материалов. Для пользовательских материалов GUID-ы также генерируются в среде выполнения при создании материала и хранятся в файлах *.mat, но в файлах материалов ссылки на материалы могут быть как через имя, так и через GUID.
При клонировании или наследовании созданный материал является внутренним до тех пор, пока ему не будет присвоено имя.
Порядок загрузки материалов не важен: при запуске движка загружаются все материалы проекта, и базовые — в первую очередь. А поскольку каждый материал с расширением *.mat ссылается как на родительский, так и на базовый материал, базовый используется в качестве родительского, пока родительский материал не загрузится. Таким образом, после загрузки приложения в иерархии материалов будут представлены все существующие в проекте материалы.
Объект Material Ball с назначенным на него материалом mesh_base
|
Объект Material Ball с пользовательским материалом, унаследованным от mesh_base
|
Объект слева отрисован с использованием одного из встроенных базовых материалов. Для объекта справа наследуется материал от базового, в котором заменяются две текстуры (текстуры альбедо и нормалей). Остальные свойства настраивать не нужно, поскольку они все унаследованы. Тем не менее, при необходимости вы можете перенастроить любое свойство точно так же, как мы изменили текстуру объекта.
Все свойства материалов (за исключением шейдеров) можно перенастраивать в UnigineEditor. Однако если вам нужно расширить набор свойств или переписать шейдеры, то придется создать нестандартный материал. Более детальная информация по этому вопросу представлена в разделе Materials Files, включая описание деклараций материалов в XML.
Свойства#
Для полноценной интеграции объекта в виртуальный мир одного внешнего вида недостаточно. Свойства (properties) определяют способ взаимодействия объекта с другими объектами и окружающей средой.
Если материал — это правило, которое используется для рендеринга, то свойство — это правило для логики приложения, которое состоит из набора логических параметров. Из свойств можно составить компоненты для того, чтобы расширить функциональность нод.
Можно задать условия, на основании которых параметры свойства будут отображены или скрыты в UnigineEditor.
В системе свойств UNIGINE представлены следующие виды свойств:
- Программируемые свойства реализуются и настраиваются программистами вручную. Самое верхнее программируемое свойство в иерархии называется базовым. Встроенных неизменяемых базовых свойств всего два: node_base и surface_base.
- Пользовательские свойства наследуются от программируемых и редактируются в UnigineEditor 3D художниками.
Свойство можно назначить как на всю ноду целиком, так и на отдельную поверхность:
- В первом случае свойства могут содержать дополнительные настройки, которые расширяют встроенный функционал (например указывают, что нода является интерактивной и используется как переключатель). Свойство для персонажа игры может содержать очки здоровья или количество золота в инвентаре.На одну ноду можно назначить несколько свойств.
- Во втором случае свойство может содержать определенные параметры, которые используются при физическом контакте с поверхностью. Например, при помощи свойства можно задать тип материала, назначенный на поверхность (дерево, металл, пластик и т. д.).На поверхность можно назначить только одно свойство.
Таким образом, свойства заставляют ноды подчиняться логике приложения.
Если свойство нужно назначить на отдельную поверхность, то его необходимо унаследовать от свойства surface_base.
Рекомендуется наследовать свойства, которые будут назначаться на nodes, от свойства node_base, хотя на ноду можно также назначить любое нестандартное базовое свойство или его дочерние свойства.
Назначить свойство можно одним из доступных способов.
Каждое свойство хранится в отдельном файле с расширением *.prop, за исключением внутренних свойств.
Иерархия свойств#
Иерархия свойств в UNIGINE строится на тех же принципах, что и иерархия материалов — одно свойство наследуется от другого. Родительское свойство передает все параметры своим потомкам, чтобы их можно было перенастроить, в соответствии с подходом объектно-ориентированного программирования.
В основе иерархии свойств лежат GUID-ы — обращение к каждому из свойств происходит по GUID-у, даже к базовым и программируемым свойствам (GUID-ы таких свойств генерируются в среде выполнения и определяются уникальным образом по именам). Только пользовательские свойства хранят GUID-ы в явном виде — GUID генерируется автоматически при создании пользовательского свойства и записывается в соответствующий файл с расширением *.prop.
Свойства в иерархии можно переименовывать, клонировать, наследовать, удалять или менять для них родителя в один клик.