Manipulating Entities
В этом уроке мы Вам покажем как можно изменять положение сущности, её ориентацию в пространстве и размер.
Сущности - это базовая форма для большинства приложений созданных в PlayCanvas. Сущность может представлять собой что угодно, персонажа героя, пули, врага, или просто точку в пространстве.
Сущности - это узлы графа, они могут наследовать своё поведение из pc.GraphNode
. Все манипуляции, которые мы будем применять ниже, также могут применяться на узлы графа.
Одна из основных операций, которую Вы должны будете выполнить над сущностями - это изменение матрицы преобразования. Свойство локальной трансформации определяет позицию, ориентацию и размер сущности, также влияет на все дочерние сущности. Изучение того, как использовать трансформации необходимо чтобы делать интересные интерактивные приложения.
Локальные и мировые координаты
Важная часть понимания, как манипулировать сущностями - знание локальных и мировых координатных систем. Мировая координатная система едина для всех сущностей, она имеет начало в (0,0,0)
и фиксированную ориентацию вверх - (0,1,0)
. Локальная система координат относится к самой сущности. Так, локальное начало - позиция сущности, и ориентация - это ориентация сущности в пространстве.


Мировые и локальные координатные системы
Иерархия
Важная часть понимания системы сущностей, это понимание графа сущностей, или иерархии. Так как сущности - узлы графа, которые собраны вместе в графе, или иерархии, состоящей из родителей и детей. Каждая сущность может иметь один родительский объект, и несколько дочерних. Дочерняя сущность наследует информацию о трансформации родительской. Мировая матрица преобразований сущности является результатом умножения локальной трансформации на мировую от родительского объекта. Например, если дочерняя сущность имеет локальное перемещение (1,0,0)
и родитель имеет локальные координаты в (0,1,0)
, позиция в мировых координатах дочернего объекта будет - (1,1,0)
.
Позиция
Получение позиции сущности
// Получаем позицию сущности, относительно координатной системы родителя
var lp = entity.getLocalPosition();
// Получаем позицию в мировом пространстве
var wp = entity.getPosition();
Оба метода возвращают pc.Vec3` (вектор, состоящий из массива [x,y,z]).
Установка положения сущности.
// Устанавливаем позицию, относительного координатной системы родителя
entity.setLocalPosition(x, y, z);
// Устанавливаем позицию в мировом пространтсве
entity.setPosition(x, y, z);
Перемещение сущности
Чтобы передвигать сущность, Вы можете прибавить к позиции значение, или используйте вспомогательные функции и 'translateLocal'.
// Переместить сущность на 1 единицу по оси X в мировом пространстве
entity.translate(1, 0, 0);
// Сместить объект на 1 единицу по оси Z локально
entity.translateLocal(0, 0, 1);
Ориентация
Для установки ориентации сущности вы можете либо применить абсолютное вращение, либо добавочное вращение.
Установка абсолютного значения поворота может быть достигнута использованием либо углов Эйлера, либо кватернионов. Объяснения в Википедии этих двух математических представлений поворота немного трудны для понимания, однако основные пункты просты. Вот важные факты:
Углы Эйлера
- Углы Эйлера это набор трёх углов вокруг осей X, Y и Z в координатной системе в определённом порядке.
- Если смотреть вниз оси координат , положительный угол Эйлера приведет к вращению против часовой стрелки вокруг этой оси.
- Углы Эйлера легки в понимании, так как Вы можете визуализировать этот эффект в голове.
Кватернионы
- Кватернионы хранятся как 4 числа и представляют любую ориентацию в 3D пространстве.
- Их сложно задавать напрямую, но можно установить через углы Эйлера, матрицы поворота или через представление ось-угол.
- Несмотря на то, что их трудно визуализировать, они полезны, так как являются надежными и могут быть быстро интерполированны (при анимации вращения).
При программировании сущностей наиболее вероятно, что Вы захотите использовать поворот объекта используя углы Эйлера. Например:
// Поворот на 30 градусов против часовой стрелки вокруг оси X родительской
// координатной системы, на 45 градусов вокруг её оси Y и, наконец, на 60 градусов
//вокруг оси Z
entity.setLocalEulerAngles(30, 45, 60);
// Поворот на 30 градусов против часовой стрелки вокруг оси X мировой системы
// координат, на 45 градусов вокруг Y и наконец, 60 градусов вокруг мировой оси Z
entity.setEulerAngles(30, 45, 60);
Тем не менее, если Вы хотите, чтобы установить вращение сущности в форме кватернионов, можете использовать следующие функции:
// Создаём переменную для поворота
var q = new pc.Quat();
// Устанавливаем сущности тот же поворот, что и у родителя, эквивалент:
// entity.setLocalEulerAngles(0, 0, 0)
entity.setLocalRotation(q);
// Устанавливаем сущности отсутствие вращения в мировой координатной системе
// эквивалент: entity.setEulerAngles(0, 0, 0)
entity.setRotation(q);
Чтобы вращать сущность постепенно по отношению к мировому пространству Вы можете использовать 'rotate ' или же 'rotateLocal' для вращения по отношению к локальным осям Вашего объекта.
Для примера, вращение сущности на 180 градусов вокруг мировой оси вверх:
entity.rotate(0, 180, 0);
Или поворот сущности на 90 градусов вокруг локальной оси X:
entity.rotateLocal(90, 0, 0);
Масштаб
Чтобы масштабировать сущность Вы просто должны вызвать следующую функцию:
// Масштабировать сущность по оси Y в 2 раза
entity.setLocalScale(1, 2, 1);
И здесь немного более интересный пример:
// Scale the entity using a sine function over time
this.timer += deltaTime;
var s = Math.sin(this.timer) + 1;
entity.setLocalScale(s, s, s);
Обратите внимание, что Вы не можете устанавливать масштаб сущности в мировом пространстве.