User Manual

Основы физики

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). Компонент твердого тела определяет тип:

Он также определяет физические свойства, такие как масса, трение и восстановление (в основном мера "упругости").

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

Создание статического грунта

В большинстве случаев вам захочется создать какую-то статическую физическую среду. Например, гоночную трассу или футбольное поле. Простейший пример - плоская поверхность. 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.

Учебные материалы

Содержание

Новая функция: Tutorial Thumbnail

Описание

Добавить возможность загрузки изображения-миниатюры для каждого урока.

Задачи

Исправление ошибки: Entity не сохраняется

Описание

При создании новой Entity, она не сохраняется в базе данных.

Задачи

Улучшение: Material Asset

Описание

Добавить возможность просмотра и редактирования Material Asset в Material Inspector.

Задачи

Улучшение: Shader Editor

Описание

Добавить возможность просмотра и редактирования шейдеров в Shader Editor.

Задачи

Улучшение: Texture Inspector

Описание

Добавить возможность просмотра и редактирования текстур в Texture Inspector.

Задачи

Улучшение: Graph Editor

Описание

Добавить возможность просмотра и редактирования графов в Graph Editor.

Задачи

Кинематический ящик

Телепортация динамических тел

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

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