This page has been translated automatically.
Программирование
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and 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
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
CIGI Client Plugin
Rendering-Related Classes
Внимание! Эта версия документация УСТАРЕЛА, поскольку относится к более ранней версии SDK! Пожалуйста, переключитесь на самую актуальную документацию для последней версии SDK.
Внимание! Эта версия документации описывает устаревшую версию SDK, которая больше не поддерживается! Пожалуйста, обновитесь до последней версии SDK.

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

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

  • Объекты, называемые узлами. Узлы могут ссылаться на другие узлы (файлы с расширением *.node), на 3D модели (*.mesh файлы), аудио-файлы (*.oga), пути (*.path), скрипты (*.h).
  • Библиотеки свойств и материалов.
  • Шейдеры и текстуры для материалов.
  • Настройки отрисовки, физики, звука и общие игровые настройки.

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

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

Заметьте
Файл виртуального мира (.world) должен храниться в одной папке с файлом скрипта мира (*.cpp) и быть назван так же.

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

  • Если у скрипта мира отсутствует реализация, а в файле виртуального мира (.world) имеется информация о мире (об объектах, настройках и так далее), весь этот контент управляется редактором UnigineEditor.
  • Если файл виртуального мира (.world) пуст, весь контент может быть создан через скрипт мира (т.е. сгенерирован программно).

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

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

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

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

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

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

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

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

Создание нового виртуального мира

Создать новый виртуальный мир можно через Меню в редакторе UnigineEditor или создав новый проект в Unigine SDK браузере — в этом случае новый мир создается автоматически.

Объекты

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

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

Узлы

В Unigine все объекты, которые добавлены в виртуальный мир, называются узлами и отображаются в окне Nodes редактора UnigineEditor.

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

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

Окно Nodes в редакторе

Иерархия узлов

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

Иерархия узлов в окне Nodes редактора

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

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

Поверхность

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

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

Узлы и их поверхности имеют общие настройки. Узел является "корнем" для своих поверхностей.

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

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

Surfaces

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

Число поверхностей у узла зависит от того, как была экспортирована 3D модель из 3D редактора. Число поверхностей не может быть изменено динамически при работе движка. Каждая поверхность может добавить новый вызов отрисовки для GPU.

Заметьте
Идентичные поверхности одинаковых 3D моделей, на которые назначен один и тот же материал, автоматически группируются и отрисовываются за один вызов.

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

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

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

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

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

Внимание
Мы строго рекомендуем создавать новые материалы исключительно в окне Материалы редактора, а не через настройки поверхности, так как это сильно уменьшает производительность!

Материалы

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

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

Материал записывается в XML файл, где указываются ссылки на шейдеры и текстуры. Вот пример материала:

Исходный код
<material name="custom_mesh_material" editable="0">
	
	<!-- states -->
	<state name="deferred">1</state>
	
	<!-- deferred shaders -->
	<shader pass="deferred" object="mesh_static"
		deferred="1"
		defines="BASE_DEFERRED"
		vertex="tutorial/shaders/vertex/deferred.vert"
		fragment="tutorial/shaders/fragment/deferred.frag"/>
	
	<!-- bindings -->
	<bind object="mesh_dynamic" to="mesh_static"/>
	<bind object="mesh_skinned" to="mesh_static"/>
	
	<texture unit="0" name="diffuse" anisotropy="1" shader="fragment" pass="deferred">core/textures/common/white.dds</texture>
	
</material>

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

Материалы организованы в иерархию материалов (также как и узлы), но при этом библиотека материалов не зависит от библиотеки узлов.

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

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

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

Пример изменения параметров базового материала:

Куб с назначенным базовым материалом mesh_base
Куб с назначенным материалом, который был отнаследован от mesh_base

На куб, находящийся слева, назначен базовый материал mesh_base который есть в библиотеке Unigine. Куб, находящийся справа, наследует этот базовый материал, а также две текстуры (диффузную (diffuse) и текстуру нормалей (normal)). Таким же образом можно изменить любые параметры у нового материала, который был отнаследован от базового.

Заметьте
Просмотрите пример material_heirarchy в примерах Unigine SDK для лучшего понимания иерархии и наследования материалов.

Почти все свойства материала (кроме шейдеров) могут быть легко изменены в редакторе UnigineEditor. В том случае, когда необходимо сильно изменить (или расширить) материал и использовать новые шейдеры, необходимо вручную создать новый материал или изменить XML файл существующего и переписать шейдеры.

Заметьте
В разделе UUSL (Unified UNIGINE Shader Language) вы можете прочитать статьи по написанию собственных материалов и шейдеров.

Библиотеки материалов

При создании материала необходимо выбрать библиотеку материалов (или, в случае необходимости, ее создать). Материалы хранятся в библиотеках материалов и подключаются к виртуальному миру: данные о подключении библиотек материалов записывается в .world файл виртуального мира. Библиотеки материалов представляют собой XML файлы с расширением .mat в которых перечислены материалы. Unigine SDK содержит библиотеки материалов, которые хранятся в папке data/core/materials/default. Эта библиотеки подключены к виртуальному миру по умолчанию, поэтому нет необходимости подключать их повторно.

Заметьте
Внешние файлы узлов (файлы с расширением .node) также могут содержать ссылки на библиотеку материалов.

При добавлении библиотеки материалов через редактор UnigineEditor (в окне материалов Materials), библиотека подключится к файлу виртуального мира автоматически.

Порядок загрузки материалов имеет значение. Если библиотека материалов содержит материал, который наследуется от материала из другой библиотеки, то сначала должна быть загружена вторая библиотека, где находится родительский материал. Рассмотрим на примере: предположим, что у вас есть две библиотеки custom1.mat и custom2.mat. Так как материал F из библиотеки custom2.mat наследуется от материала C из библиотеки custom1.mat, значит сначала должна быть загружена библиотека custom1.mat.

Порядок загрузки библиотек материалов

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

Свойства

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

Иерархия свойств строится на тех же принципах что и иерархия материалов.

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

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

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

В Unigine есть 2 базовых свойства (node_base и surface_base), которые не могут быть изменены, но от них можно отнаследоваться и сделать свои собственные свойства. В созданном (отнаследованном) свойстве могут быть заданы параметры, изменение которых недоступно для базовых свойств.

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

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

Библиотеки свойств

Созданные свойства помещаются в библиотеку и библиотека подключается к виртуальному миру (данные о подключенных библиотеках записываются в .world файл виртуального мира). Библиотеки свойств представляют собой XML файлы с расширением .prop.

При добавлении новой библиотеки через редактор UnigineEditor (окно свойств Properties), ссылка на библиотеку будет добавлено в .world файл автоматически.

Заметьте
Порядок загрузки библиотек свойств также важен, как и в случае с библиотеками материалов.

Unigine SDK содержит себе набор библиотек, которые находятся в папке data/core/properties. Эти библиотеки подключены к виртуальному миру по умолчанию, поэтому нет необходимости подключать их к виртуальному миру повторно.

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

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

Тела

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

Формы

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

Соединения

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

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

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

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

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

В виртуальном мире можно выделить следующие важные объекты:

  • Файл виртуального мира с расширением .world, который хранит основную информацию об объектах мира (узлах), различные настройки и ссылки на другие объекты.
  • Скрипт мира, позволяющий управлять миром программно.
  • Материалы, хранящиеся в отдельных .mat файлах. Файл виртуального мира хранит ссылки на используемые библиотеки материалов, а объекты и поверхности из мира хранят ссылки на конкретные материалы из библиотек. Материалы, в свою очередь, ссылаются на шейдеры и на текстуры.
  • Свойства, хранящиеся в отдельных .prop файлах. Файл виртуального мира хранит ссылки на используемые библиотеки свойств, а объекты и поверхности из мира хранят ссылки на конкретные свойства из библиотек.
  • Внешние файлы узлов, на которые виртуальный мир может содержать ссылку.
Последнее обновление: 20.10.2017
Build: ()