Основы физики
PlayCanvas включает в себя очень мощный физический движок под названием ammo.js. Это порт браузера с открытым исходным кодом C++ физического движка Bullet.
PlayCanvas предоставляет компоненты rigidbody и collision для настройки физических симуляций.
Включение физики
По умолчанию новый проект PlayCanvas не включает модули ammo.js. Это связано с тем, что ammo.js имеет размер в несколько сотен килобайт, и вашему приложению не нужно загружать эту библиотеку, если она не требуется.
Вы можете импортировать модули ammo.js в ваш проект с помощью кнопки импорта на панели настроек сцены:
Это импортирует стандартную сборку ammo.js, предоставляемую PlayCanvas. Однако, обратите внимание, что возможно скомпилировать вашу собственную версию ammo.js и добавить ее в ваш проект вместо этого. Для получения дополнительной информации см. эту страницу.
Для получения информации о миграции устаревших проектов на последнюю версию ammo.js см. эту страницу.
Гравитация
В той же панели настроек вы можете установить глобальную гравитацию физической симуляции. Гравитация - это постоянная сила, действующая на все твердые тела в вашей сцене. По умолчанию это значение равно -9,81 по отрицательной оси Y мира (то есть прямо вниз). Это значение по умолчанию приближает гравитацию Земли. Но вы можете увеличить или уменьшить это значение. Например, для игры, разворачивающейся в космосе, вы, вероятно, захотите установить гравитацию равной нулю.
Единицы измерения
По умолчанию физический движок PlayCanvas интерпретирует 1 единицу как 1 метр. Поэтому, чтобы объекты падали с физически точной скоростью, вы должны убедиться, что объекты ваших сцен имеют соответствующий размер.
Например, если ваша игра содержит персонажа, который имеет высоту 1,8 м, его высота в редакторе 3D должна составлять 1,8 единицы.
Твердые тела
Вы можете сделать любую сущность в вашей сцене участником физической симуляции. Просто добавьте компонент твердого тела (rigidbody) и компонент столкновения (collision). Компонент твердого тела определяет тип:
- Статический - физический объект, который никогда не двигается
- Динамический - физический объект, который будет двигаться под действием приложенной силы
- Кинематический - физический объект, который можно позиционировать только явно через API
Он также определяет физические свойства, такие как масса, трение и восстановление (в основном мера "упругости").
Компонент столкновения определяет физическую форму тела. Обратите внимание, что физическая форма твердого тела не обязательно должна совпадать с его графической формой. Типично для физических представлений объектов быть намного проще, чем графических. Доступные типы компонентов столкновения:
- Коробка
- Сфера
- Капсула
- Цилиндр
- Сетка
- Конус
- Составной
Создание статического грунта
В большинстве случаев вам захочется создать какую-то статическую физическую среду. Например, гоночную трассу или футбольное поле. Простейший пример - плоская поверхность. PlayCanvas не предоставляет примитива столкновения плоскости, но предоставляет примитив коробки. Вот как настроить коробку размером 10x10 и высотой 1 единицу, которая является статическим твердым телом:
Вы также можете установить тип компонента столкновения на Mesh и назначить ассет модели, если хотите что-то более сложное.
Создание динамических тел
Физика связана с движением, поэтому вещи становятся интересными, когда мы создаем динамические твердые тела. Давайте создадим динамическую коробку размером 1x1x1:
Коробка была повернута так, что при столкновении с статическим грунтом она будет отскакивать интересным образом:
Создание кинематических тел
Иногда может быть полезно иметь возможность явно контролировать движение физических объектов в вашей сцене и заставлять эти объекты оказывать неотразимую силу на другие физические объекты. Например, представьте себе движущуюся платформу, которая может перевозить игрока по уровню. Чтобы достичь этого, вы можете установить тип твердого тела на кинематический. Давайте создадим кинематическую коробку:
Ответственность за анимацию кинематических тел лежит на вас, разработчике. Вы заметите, что на кинематической коробке, показанной выше, также есть компонент сценария со сценарием под названием movement.js:
var Movement = pc.createScript('movement');
// инициализация кода, вызываемого один раз для каждой сущности
Movement.prototype.initialize = function() {
};
// код обновления, вызываемый каждый кадр
Movement.prototype.update = function(dt) {
this.entity.setPosition(Math.sin(Date.now() / 1000), 0.5, 0);
};
Этот скрипт просто анимирует коробку вдоль мировой оси x с использованием синусоидальной функции. Вы перемещаете кинематические тела с помощью
стандартных функций трансформации на объекте Entity, таких какsetPosition
# Issue Tracker
Если вы нашли ошибку или у вас есть предложение по улучшению, пожалуйста, создайте новый тикет в Issue Tracker.
Учебные материалы
Содержание
- Entity
- Material Asset
- Material Inspector
- Shader Editor
- Node Inspector
- Texture Inspector
- Graph Inspector
- Graph Editor
- Assets
setRotation
# Issue Tracker
Новая функция: Tutorial Thumbnail
Описание
Добавить возможность загрузки изображения-миниатюры для каждого урока.
Задачи
- Добавить поле для загрузки изображения в форму создания/редактирования урока
- Отображать миниатюру урока в списке уроков
Исправление ошибки: Entity не сохраняется
Описание
При создании новой Entity, она не сохраняется в базе данных.
Задачи
- Исправить ошибку сохранения Entity
- Добавить тесты для проверки сохранения Entity
Улучшение: Material Asset
Описание
Добавить возможность просмотра и редактирования Material Asset в Material Inspector.
Задачи
- Добавить вкладку Material Asset в Material Inspector
- Реализовать функционал редактирования Material Asset
Улучшение: Shader Editor
Описание
Добавить возможность просмотра и редактирования шейдеров в Shader Editor.
Задачи
- Добавить вкладку Shader Editor в Node Inspector
- Реализовать функционал редактирования шейдеров
Улучшение: Texture Inspector
Описание
Добавить возможность просмотра и редактирования текстур в Texture Inspector.
Задачи
- Добавить вкладку Texture Inspector в Graph Inspector
- Реализовать функционал редактирования текстур
Улучшение: Graph Editor
Описание
Добавить возможность просмотра и редактирования графов в Graph Editor.
Задачи
- Добавить вкладку Graph Editor в Assets
- Реализовать функционал редактирования графов
setEulerAngles
. Теперь, когда мы запускаем сцену, динамический ящик падает на кинематический ящик и перемещается сверху по нему:
Телепортация динамических тел
Хотя для кинематических тел можно использовать стандартную функцию трансформации сущности, для динамических тел это не разрешено. Создавая динамическое твердое тело, вы передаете ответственность за установку позиции и ориентации этой сущности движку физики. Это означает, что если вы попытаетесь обновить позицию или ориентацию сущности в сценарии с использованием API pc.Entity, функции не будут иметь эффекта. Вместо этого вы должны вызвать функцию телепортации на компоненте твердого тела, которая явно уведомляет движок физики о том, что вы хотите на мгновение обновить позицию и/или ориентацию твердого тела.