Tutorials

Манипуляция с Entity

В этом уроке мы покажем вам, как изменить положение, ориентацию и масштаб Entity.

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

Entity - это особая форма узла графа, они наследуют много своего поведения от pc.GraphNode. Все манипуляции, которые мы применяем ниже, также могут быть применены к узлам графа.

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

Локальные и мировые координаты

Важной частью понимания того, как перемещать и манипулировать Entity, является понимание локальных и мировых систем координат. Мировая система координат используется всеми Entity, у нее есть фиксированное начало координат (0,0,0) и фиксированная ориентация - где (0,1,0) вверх. Локальная система координат относительно самого Entity. Таким образом, локальное начало координат - это положение Entity, а ориентация следует за ориентацией Entity.

Мировые координаты Локальные координаты

Мировые и локальные системы координат

Иерархия

Важной частью системы Entity, которую нужно понять, является граф Entity или иерархия. Поскольку Entity являются типом узла графа, они собираются вместе в графе или иерархии родителей и детей. У каждого Entity может быть один родитель и несколько детей. Дочерние Entity наследуют информацию о преобразовании от своих родителей. Мировая матрица преобразования Entity получается путем умножения локального преобразования на мировое преобразование родительского Entity. Так, например, если у дочернего Entity локальный перевод составляет (1,0,0), а у его родителя локальный перевод составляет (0,1,0), мировое положение дочернего элемента будет (1,1,0)

Позиция

Получение позиции Entity просто

// Получить позицию объекта относительно системы координат родительского объекта
var lp = entity.getLocalPosition();

// Получить позицию объекта в мировом пространстве
var wp = entity.getPosition();

Эти методы оба возвращают pc.Vec3 (векторное значение в форме массива [x, y, z]).

Установка позиции объекта (Entity) также проста.

// Установить позицию объекта относительно системы координат родительского объекта
entity.setLocalPosition(x, y, z);

// Установить позицию объекта в мировом пространстве
entity.setPosition(x, y, z);

Перемещение объекта

Чтобы переместить объект Entity, вы можете добавить к позиции объекта или использовать вспомогательные функции translate и translateLocal.

// Переместить объект на 1 единицу вниз по положительной оси x мирового пространства
entity.translate(1, 0, 0);

// Переместить объект на 1 единицу вниз по локальной оси z объекта
entity.translateLocal(0, 0, 1);

Ориентация

Для установки ориентации Entity вы можете установить абсолютное вращение или применить инкрементное вращение.

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

Углы Эйлера

Кватернионы

При написании скриптов для сущностей, скорее всего, вы будете устанавливать вращение Entity с использованием углов Эйлера. Например:

// Повернуть на 30 градусов против часовой стрелки вокруг оси x системы координат родительской сущности
// затем на 45 градусов вокруг оси y и, наконец, на 60 градусов вокруг оси z
entity.setLocalEulerAngles(30, 45, 60);

// Повернуть на 30 градусов против часовой стрелки вокруг оси x мирового пространства, затем на 45 градусов
// вокруг оси y мирового пространства и, наконец, на 60 градусов вокруг оси z мирового пространства
entity.setEulerAngles(30, 45, 60);

Однако, если вы хотите задать вращение Entity в форме кватерниона, вы можете использовать следующие функции:

// Создать идентичное вращение
var q = new pc.Quat();
// Установить для объекта Entity такое же вращение, как у его родителя - эквивалентно
// entity.setLocalEulerAngles(0, 0, 0)
entity.setLocalRotation(q);

// Установить для объекта Entity отсутствие вращения относительно мировой системы координат
// эквивалентно entity.setEulerAngles(0, 0, 0)
entity.setRotation(q);

Чтобы инкрементно повернуть Entity, вы можете использовать функцию rotate для поворота Entity относительно осей мирового пространства или rotateLocal для поворота относительно текущих осей Entity.

Например, чтобы повернуть Entity на 180 градусов вокруг оси мирового пространства вверх:

entity.rotate(0, 180, 0);

Или чтобы повернуть Entity на 90 градусов вокруг его локальной оси x, сделайте следующее:

entity.rotateLocal(90, 0, 0);

Масштабирование

Чтобы масштабировать Entity, вам просто нужно вызвать следующую функцию:

// Масштабировать объект в 2 раза по локальной оси Y
entity.setLocalScale(1, 2, 1);

И вот немного более интересный пример:

// Масштабирование объекта с использованием синусоидальной функции со временем
this.timer += deltaTime;
var s = Math.sin(this.timer) + 1;
entity.setLocalScale(s, s, s);

Обратите внимание, что в настоящее время вы не можете установить масштаб Entity в мировом пространстве.

This site is translated by the community. If you want to get involved visit this page