Документация/Статьи по программированию/Система карт
From NeoAxis Engine Wiki
| Language: | Status: | Approved |
Contents |
Описание
Система карт - это надстройка над системой игровых объектов, которое позволяет размещать объекты в пространстве, работать с физической моделями объектов и другое. Система включает в себя множество игровых классов, которые реализуют понятие карты и объектов расположенных на карте.
Здесь вы найдете фундаментальные классы, такие как карта (Map) и объект карты (MapObject), которые надстраиваются над игровыми классами системы сущностей и формируют функциональность карт и объектов на карте.
Для начала, рекомендуется к прочтению Урок по созданию простого игрового объекта.
Игровые классы и базовые типы
Список игровых классов, предоставляемых системой карт, и основанных на них базовых игровых типов.
| Класс | Базовый тип | Описание |
|---|---|---|
| MapGeneralObject | Базовый класс для всех объектов на карте. Используется многими классами в качестве потомка. | |
| MapObject | Базовый класс объекта на карте. В отличие от MapGeneralObject, имеет позицию на карте (свойства Position, Rotation, Scale). Также, учавствует в физическом взаимодействии, благодаря наличию физической модели. Используется многими классами в качестве потомка. | |
| StaticMesh | StaticMesh.type | Объект для создания статичной геометрии на карте. |
| CameraAttachedObject | Вспомогательный класс, реализующий движение объектов за камерой. Этот объект может управлять моделями, системами частиц и биллбордами. Может использоваться для созднания продвинутого неба, дождя. | |
| CubemapZone | CubemapZone.type | Расчет статичных кубических текстур окружения. |
| Fog | Fog.type | Туман. |
| Light | Light.type | Источник света. |
| MapCamera | MapCamera.type | Позволяет расставлять камеры на карте. |
| MapCameraCurve | MapCameraCurve.type | Позволяет задавать траекторию полета камеры. |
| MapCurve | MapCurve.type | Позволяет точками задать траекторию. |
| Occluder | Occluder.type | Служит для выключения порталов. Часть портальной системы. |
| Portal | Portal.type | Портал. Часть портальной системы. |
| Region | Region.type | Область на карте. |
| SkyBox | SkyBox.type | Небо в виде статичной кубической карты. |
| SkyDome | SkyDome.type | Небо в виде полусферы. |
| StaticLightingManager | StaticLightingManager.type | Менеджер статичного освещения. Предназначен для создания предрасчитанного статичного освещения на карте. |
| StaticSound | StaticSound.type | Статичный источник звука на карте. |
| Zone | Zone.type | Зона. Часть портальной системы. |
Положение объекта на карте
Описание
Позиция объекта в игровом пространстве задается с помощью трех параметров: Position, Rotation и Scale.
Предыдущая трансформация
тики в игровом мире происходят с постоянным интервалом и достаточно не часто (по умолчанию 30 раз в секунду). Т.е. объекты в игровом мире обновляются только 30 раз в секунду.
Частота обновления кадров на экране может быть больше 30 кадров в секунду. Чтобы перемещение объектов выглядело плавным, необходимо интерполировать положение объекта при рисовании его на экране. Для сглаженного перемещения объекта, используется информация о трансформации из предыдущего тика. Зная текущую и предыдущую информацию о положении объекта, движок интерполирует позицию объекта во время его отрисовки.
API
Класс MapObject
| Имя | Описание | |
|---|---|---|
| |
Vec3 Position | Возвращает или задает позицию объекта. |
| |
Quat Rotation | Возвращает или задает поворот объекта. |
| |
Vec3 Scale | Возвращает или задает масштабирование объекта. |
| |
Void SetTransform( Vec3 pos, Quat rot, Vec3 scl ) | Задает трансформацию объекта. Используйте этот метод, когда хотите изменить сразу несколько параметров. |
| |
Void OnSetTransform( ref Vec3 pos, ref Quat rot, ref Vec3 scl ) | Метод, вызываемые при изменении трансформации объекта. |
| |
Vec3 OldPosition | Возвращает или задает предыдущую позицию объекта. |
| |
Quat OldRotation | Возвращает или задает предыдущий поворот объекта. |
| |
Vec3 OldScale | Возвращает или задает предыдущее масштабирование объекта. |
| |
Void SetOldTransform( Vec3 pos, Quat rot, Vec3 scl ) | Задает предыдущую трансформацию объекта. |
| |
Vec3 GetInterpolatedPosition() | Возвращает интерполированную позицию объекта. |
| |
Quat GetInterpolatedRotation() | Возвращает интерполированный поворот объекта. |
| |
Vec3 GetInterpolatedScale() | Возвращает интерполированное масштабирование объекта. |
| |
Void GetInterpolatedTransform( out Vec3 pos, out Quat rot, out Vec3 scl ) | Возвращает интерполированную трансформацию объекта. |
Работа с прикрепляемыми объектами
Описание
На практике любой объект в игровом мире обладает некоторыми материальными свойствами. У некоторых есть 3d-модель, некоторые объекты визуализируются с помощью специальных эффектов, а некоторые объекты только проигрывают звуки.
Принцип прост. Каждый объект карты (объект класса MapObject) обладает списком прикрепленных объектов. К игровому объекту могут быть прикреплены различные ресурсы:
- Трехмерные модели
- Системы частиц
- Билборды
- Ленты траекторий
- Источники света
- Внутреигровой пользовательский интерфейс
- Звуки
- Игровые объекты. Вы можете присоединить любой игровой объект к другому игровому объекту, что позволит с легкостью создавать комплексные динамические конструкции. Например, вы можете запросто прикрепить анимированный вращающийся пулемет к вертолету, с сохранением его функциональности. Также система позволяет присоединение оружия или брони к персонажам.
Объекты могут быть прикреплены различным образом. Например, относительно позиции игрового объекта. Объекты могут быть прикреплены к телам физической модели. Также, возможно присоединение к костям трехмерной модели.
Редактор ресурсов
Присоединяемые объекты обычно настраиваются в редакторе игровых объектов. Для работы с прикрепленными объектами используется свойство AttachedObjects.
Читайте больше о работе с прикрепляемыми объектами в редакторе ресурсов здесь.
Run-time
Помимо настройки прикрепленных объектов в типе, можно управлять прикрепляемыми объектами в процессе симуляции. Например, когда персонаж берет оружие, мы прикрепляем его к персонажу.
Ниже приведен список классов, которые могут быть присоединены:
- Игровые объекты - MapObjectAttachedMapObject
- Трехмерные модели - MapObjectAttachedMesh
- Системы частиц - MapObjectAttachedParticle
- Билборды - MapObjectAttachedBillboard
- Ленты траекторий - MapObjectAttachedRibbonTrail
- Источники света - MapObjectAttachedLight
- Внутреигровой пользовательский интерфейс - MapObjectAttachedGui
- Звуки - MapObjectAttachedSound
- Вспомогательные объекты - MapObjectAttachedHelper
Пример
Пример присоединения системы частиц:
MapObject obj = ...; MapObjectAttachedParticle attachedParticle = new MapObjectAttachedParticle(); attachedParticle.SetParticleSystem( "SmokeParticle" ); obj.Attach( attachedParticle );
API
Класс MapObject
| Имя | Описание | |
|---|---|---|
| |
void Attach( MapObjectAttachedObject attachedObject ) | Прикрепление объекта. |
| |
void Detach( MapObjectAttachedObject attachedObject ) | Отсоединение объекта. |
| |
void OnAttach( MapObjectAttachedObject attachedObject ) | Метод, вызываемый при присоединении объекта. |
| |
void OnDetach( MapObjectAttachedObject attachedObject ) | Метод, вызываемый при отсоединении объекта. |
| |
MapObjectAttachedObject[] AttachedObjects | Предоставляет список присоединенных объектов. |
| |
MapObject AttachedMapObjectParent | Предоставляет объект, к которому присоединен данный объект. В случае, когда один игровой прикреплен к другому. |
| |
MapObjectAttachedObject GetAttachedObjectByAlias( String alias ) | Возвращает присоединенный объект по его алиасу. |
Выборка объектов
Описание
Довольно часто нужно получать список объектов, находящихся в определенной области. Задачу можно решить, перебиранием всех объектов на карте и выбиранием необходимых объектов. При большом количестве объектов на карте, такой способ может работать медленно. Для того, чтобы получать объектов в определенной области существуют специальные функции.
Класс Map содержит методы для выборки объектов областям различной формы:
- Выборка по габаритам
- Выборка по сфере
- Выборка по параллелепипеду
- Выборка по лучу
- Выборка по области камеры
- Выборка по разделяющим плоскостям
- Выборка по экранному прямоугольнику
Выборка осуществляется по размерам габаритам объекта (свойство MapBounds). Это свойство автоматически рассчитывается в процессе работы объекта, с учетом габаритов трехмерных моделей объекта, физических моделей и т.д.
Можно создавать и удалять объекты во время выборки. Это нормально для функционирования движка.
Также, возможно использования фильтрования по группам для еще большего увеличения производительности. Об этом будет написано позже.
Пример
Пример выборки объектов с учетом габаритов.
Bounds bounds = new Bounds( new Vec3( 10, 10, 10 ), new Vec3( 20, 20, 20 ) ); Map.Instance.GetObjects( bounds, delegate( MapObject obj ) { ... //Some work with "obj" } );
API
Класс Map