Класс pc.Entity: создание, иерархия, трансформации

Создание объекта pc.Entity

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

Для создания объекта pc.Entity достаточно вызвать конструктор класса:

var entity = new pc.Entity();

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

app.root.addChild(entity);  // добавляем сущность в корень сцены

Иерархия сущностей

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

Каждая сущность может иметь родительскую сущность, и эта связь устанавливается с помощью метода setParent. Например:

var parentEntity = new pc.Entity();
var childEntity = new pc.Entity();
parentEntity.addChild(childEntity);  // childEntity теперь является дочерним для parentEntity

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

Трансформации сущностей

Каждая сущность в PlayCanvas имеет трансформацию, которая определяет её положение, вращение и масштаб в пространстве. Эти данные хранятся в компоненте pc.Transform, который является основой для работы с позиционированием.

Позиция

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

entity.setPosition(10, 5, -3);  // Устанавливаем позицию сущности
console.log(entity.getPosition());  // Получаем текущую позицию
Вращение

Вращение сущности представляет собой её ориентацию в пространстве и задается через углы Эйлера или кватернионы. PlayCanvas предпочитает работать с кватернионами, так как они более эффективны и избегают проблем, связанных с углами Эйлера, таких как «зацикливание» углов.

Для установки вращения используется метод setRotation:

entity.setRotation(30, 60, 90);  // Устанавливаем вращение в градусах (Эйлер)

Однако, для более точного контроля, можно использовать кватернионы:

var quat = new pc.Quat();
quat.setFromEulerAngles(30, 60, 90);
entity.setRotation(quat);
Масштаб

Масштаб сущности определяет её размер относительно исходного масштаба (1, 1, 1). Он также хранится в компоненте pc.Transform и может быть задан через свойство scale:

entity.setLocalScale(2, 2, 2);  // Увеличиваем сущность в два раза по всем осям

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

Локальные и глобальные трансформации

Трансформации могут быть как локальными, так и глобальными. Локальная трансформация сущности определяет её положение относительно родителя. Глобальная трансформация, в свою очередь, учитывает все родительские трансформации в иерархии.

Методы getPosition(), getRotation(), getScale() возвращают локальные трансформации, а методы getWorldPosition(), getWorldRotation(), getWorldScale() — глобальные.

Пример:

var localPosition = entity.getPosition();  // локальная позиция
var worldPosition = entity.getWorldPosition();  // глобальная позиция

Если сущность имеет родительскую сущность, то её глобальная позиция будет вычисляться с учетом трансформации родителя. Аналогично, глобальное вращение и масштаб также могут быть вычислены с учётом родительских объектов.

Компоненты сущности

Каждая сущность в PlayCanvas может иметь несколько компонентов, которые добавляют ей функциональность. Компоненты могут управлять различными аспектами сущности, такими как визуализация (компонент pc.Model), физика (компонент pc.RigidBody), анимация и другие.

Для добавления компонента к сущности используется метод addComponent. Например, чтобы добавить компонент модели:

entity.addComponent('model', {
    type: 'box'  // Тип модели, например 'box', 'sphere', 'plane' и другие
});

После добавления компонента, сущность будет иметь соответствующий функционал, например, возможность отображать 3D-объект в сцене.

Пример создания иерархии с трансформациями

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

var parentEntity = new pc.Entity();
parentEntity.setPosition(0, 0, 0);
parentEntity.setRotation(0, 0, 0);
parentEntity.setLocalScale(1, 1, 1);

var childEntity1 = new pc.Entity();
childEntity1.setPosition(1, 0, 0);  // Дочерняя сущность с локальной позицией
childEntity1.setRotation(0, 45, 0);  // Дочерняя сущность с локальным вращением
childEntity1.setLocalScale(1, 1, 1);

var childEntity2 = new pc.Entity();
childEntity2.setPosition(0, 2, 0);  // Дочерняя сущность с другой локальной позицией
childEntity2.setRotation(0, 90, 0);  // Дочерняя сущность с другим локальным вращением
childEntity2.setLocalScale(2, 2, 2);

parentEntity.addChild(childEntity1);
parentEntity.addChild(childEntity2);

app.root.addChild(parentEntity);  // Добавляем родительскую сущность в сцену

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

Заключение

Класс pc.Entity является основой для создания объектов в PlayCanvas и позволяет эффективно управлять иерархией, трансформациями и компонентами объектов. Использование иерархий сущностей и управление трансформациями позволяет строить сложные сцены с независимыми, но взаимосвязанными объектами.