Физические пазлы (Physics)
Эти пазлы используются для моделирования физического поведения объектов.

Содержание
Перечень физических пазлов
create physics world
Инициализирует физический движок, используя указанные параметры gravity и frames-per-second. Значение gravity по умолчанию 9.8 соответствует условиям на поверхности Земли. Нулевое значение означает отсутствие гравитации, как в космосе. Чем выше значение fps, тем выше качество симуляции в ущерб производительности.
Флажок soft body активирует возможность симуляции мягкого тела.

Под капотом, этот пазл также обеспечивает обнаружение столкновений и автоматическую синхронизацию с графикой.
create rigid body
Создает физическое тело из указанного объекта типа dynamic, kinematic, static или ghost. Присваивает форму столкновения и задает массу тела (действительно только для dynamic тел). Также работает для списка объектов, группы (или списка групп) или с пазлом all objects.

Физические типы тела:
- dynamic - перемещаются с помощью физического движка, подвержены влиянию столкновений и сталкиваются с другими телами.
- kinematic - перемещаются с помощью анимации или действий пользователя. Динамические объекты будут отталкиваться, но влияние от динамических объектов отсутствует.
- static - не могут двигаться, но сталкиваются с другими телами.
- ghost - аналогичен kinematic, но не производит никакой реакции на столкновение. Используйте его для обнаружения столкновения между телами (например, для реализации датчика приближения).
Поддерживаемые формы жесткого тела:
- box - ограничение в форме куба.
- sphere - ограничение в форме сферы.
- mesh - форма меша.
- capsule - форма капсулы, вытянутая вдоль оси вверх-вниз.
- cone - конусообразная форма, вытянутая вдоль оси вверх-вниз.
- cylinder - цилиндрическая форма, вытянутая вдоль оси вверх-вниз.
- empty - пустая форма. Полезно для создания привязок ограничений и точек привязки мягкого тела.
По соображениям производительности отдавайте предпочтение примитивным физическим формам (кубам, сферам, капсулам, конусам и цилиндрам), а не детальным мешам. Кроме того, static меши имеют гораздо лучшую производительность, чем dynamic, kinematic и ghost.
create soft body
Создает мягкое тело из указанного объекта с заданной общей массой (mass) и необязательными параметром pressure (давление). Также работает для списка объектов, группы (или списка групп) или с пазлом all objects.

Поддерживаемые мягкие формы тела:
- volume - закрытый герметичный трехмерный объем.
- rope - линейный объект, который ведет себя как веревка.
- patch - многоугольная поверхность, например, ткань или текстильная заплатка.
Не забудьте активировать симуляцию мягких тел в physics world перед созданием мягких тел.
remove physics body
Удаляет физику с указанного объекта, уничтожая связанное с ним физическое тело. Также работает для списка объектов, группы (или списка групп) или с пазлом all objects.

apply body param
Задает параметры для физического тела, связанного с указанным объектом. Также работает для списка объектов, группы (или списка групп) или с пазлом all objects.

Параметры:
- angular damping
-
Коэффициент сопротивления, замедляющий вращающийся объект:
0
- демпфирование отсутствует,1
- максимальное демпфирование. Входные значения ограничены диапазоном [0, 1]. - angular factor
- Установить степень свободного вращения для указанного тела. Например, установив компонент Z равным нулю, можно запретить вращение тела вокруг оси вверх-вниз (Блендер, Max) или вперед-назад (Майя).
- angular velocity
- Установить вектор скорости вращения.
- ccd motion threshold
- Порог движения, используемый для моделирования физики непрерывного обнаружения столкновений (CCD). Укажите низкое значение, например 0.001
- ccd swept sphere radius
-
Радиус сферы, используемой для моделирования физики непрерывного обнаружения столкновений (CCD). Это значение должно соответствовать размеру сталкивающихся объектов. Например, для моделирования маленькой пули размером 0,01 м это значение можно смело установить равным 0,5.
- force
- Толкать тело в заданном направлении.
- friction
- Коэффициент сопротивления относительному движению твердых тел, скользящих друг относительно друга.
- gravity
- Назначить гравитацию индивидуально для определенного тела.
- impulse
-
Действует как Linear Velocity, но также учитывает массу тела (более тяжелые объекты приобретают меньшую скорость).
- linear damping
-
Коэффициент сопротивления, замедляющий движущийся объект:
0
- нет демпфирования (например, свободное падение),1
- максимальное демпфирование (например, объект падает без ускорения). Входные значения ограничены диапазоном [0, 1]. - linear factor
- Установить степени свободного перемещения для указанного тела. Например, установив компонент Z равным нулю, можно отключить движение тела вверх-вниз (Блендер, Max) или вперед-назад (Майя).
- linear velocity
- Установить вектор скорости движения.
- margin
- Надбавка к размеру, используемся для улучшения стабильности и производительности расчётов соударений. Должна указываться для соударяемых поверхностей форм mesh и cone. Для остальных поверхностей (box, sphere, capsule, cylinder) это значение физический движок рассчитывает автоматически.
- position
- Установить положение тела (работает как пазл snap body).
- restitution
-
Коэффициент упругости:
0
- тело не упругое, как глина,1
- тело ведет себя как сделанное из резины. - rotation
- Устанавливает поворот тела (эйлеровские углы XYZ, работает как пазл snap body).
- stiffness
- Жесткость мягких тел, таких как объемы и канаты. Устарел, вместо него следует использовать пазл apply soft body param.
- torque
- Задаёт вращение тела в заданном направлении.
- torque impulse
- Действует как Angular Velocity, но учитывает массу тела (более тяжелые объекты приобретают меньшую скорость вращения).
Когда два тела сталкиваются, учитываются параметры трения и упругости обоих тел.
get body param
Получает параметр из физического тела, связанного с указанным объектом.

Параметры:
- angular damping
-
Коэффициент сопротивления, замедляющий вращающийся объект:
0
- демпфирование отсутствует,1
- максимальное демпфирование. - angular factor
- Степени свободного вращения для указанного тела (XYZ).
- angular velocity
- Вектор скорости вращения.
- ccd motion threshold
- Порог движения, используемый для моделирования физики непрерывного обнаружения столкновений (CCD).
- ccd swept sphere radius
- Радиус сферы, используемой для моделирования физики непрерывного обнаружения столкновений (CCD).
- force
- Вектор силы, приложенной к телу.
- friction
- Коэффициент сопротивления относительному движению твердых тел, скользящих друг относительно друга.
- gravity
- Вектор силы тяжести, приложенный к телу.
- linear damping
-
Коэффициент сопротивления, замедляющий движущийся объект:
0
- отсутствие демпфирования (например, свободное падение),1
- максимальное демпфирование (например, объект падает без ускорения). - linear factor
- Степени свободного перемещения для указанного тела (XYZ).
- linear velocity
- Вектор скорости движения.
- margin
- Надбавка к размеру, используемся для улучшения стабильности и производительности расчётов соударений.
- position
- Положение тела XYZ.
- restitution
-
Коэффициент упругости:
0
- тело не упругое, как глина,1
- тело ведет себя как сделанное из резины. - stiffness
- Жесткость мягких тел, например канатов и тел имеющих объем. Устарел, вместо него следует использовать пазл get soft body param.
- torque
- Вектор крутящего момента, приложенного к телу.
set body state
Изменение состояния физического тела, связанного с указанным объектом. Также работает для списка объектов, группы (или списка групп) или с пазлом all objects.

Параметры:
- activate - активировать спящее физическое тело.
- sleep - усыпить физическое тело.
- enable simulation - включить симуляцию тела (по умолчанию включено).
- disable simulation - отключить симуляцию тела.
- reset - очистить все силы и скорости, приложенные к физическому телу.
- enable contact response - разрешить телу сталкиваться с другими телами (включено по умолчанию).
- disable contact response - отключить столкновение тел.
- make dynamic - придать телу динамику.
- make kinematic - придать телу кинематическую форму.
- make static - сделать тело статичным.
- enable deactivation - позволять телу переходить в спящее состояние после некоторого периода бездействия (включено по умолчанию).
- disable deactivation - отключить засыпание тела.
on simulation tick
Запуск пазлов, указанных в слоте do, непосредственно перед или сразу после тика симуляции физики.

Тик симуляции физики соответствует значению FPS, указанному при создании physics world, и не совпадает с кадром рендеринга. Поэтому мы рекомендуем применять силы/скорости/импульсы до (before) тика симуляции и определять столкновения между телами после (after) тика симуляции. Таким образом, вы сможете добиться более стабильной и реалистичной симуляции.
snap body
Перемещает физическое тело, связанное с указанным объектом, и сам объект в положение другого объекта, копируя его данные преобразования. Также копируется вращение. Не работает со списками, группами или пазлом "all objects".

Работает аналогично пазлу apply body param / position.
add constraint to
Соединяет два физических ограничителем заданного типа.

Виды ограничителей:
- hinge - соединяет тела общей осью.
- ball - соединяет тела с помощью шарообразного гнезда.
- slider - ограничивает движение тел направлением вдоль оси X.
- spring - соединяет два тела с помощью пружинного шарнира.
- fixed - плотно соединяет два тела.

remove constraint from
Удаляет физический ограничитель.

anchor soft body
Привязывает мягкое тело к заданному жесткому телу (создаёт якорь) в точке пространства, представленной заданным вектором.

apply soft body param
Устанавливает параметры мягкого тела, связанного с указанным объектом. Также работает для списка объектов, групп (или списков групп), а также с пазлом all objects puzzle.

Параметры:
- anchor hardness
- Коэффициент жёсткости якоря:
0
— нет влияния якоря,1
— максимальное влияние якоря. - angular stiffness
- Угловая жёсткость:
0
— отсутствие угловой жёсткости,1
— максимальная угловая жёсткость. - collision flags
- Флаг соударений жёсткого тела:
0
— нет соударений с другими жёсткими телами,1
— простой расчёт соударений,17
— точный расчёт соударений. Значение по умолчанию17
. - damping coefficient
- Коэффициент замедления:
0
- отсутствие замедления,1
- максимальное замедление. - drag coefficient
- Коэффициент силы сопротивления (сопротивление жидкости). Должен быть положительным числом.
- dynamic friction
- Динамическое трение.
0
— без трения,1.0
— максимальное трение. - lift coefficient
- Коэффициент подъёмной силы. Должен быть положительным числом.
- linear stiffness
- Линейная жёсткость:
0
— отсутствие линейной жёсткости,1
— максимальная линейная жёсткость. - position iterations
- Количество итераций расчёта позиции. Бо́льшие значения улучшают качество симуляции. Должен быть положительным числом.
- pressure coefficient
- Коэффициент давления (например для надувных шаров).
- velocity iterations
- Количество итераций расчёта скорости. Бо́льшие значения улучшают качество симуляции. Должен быть положительным числом.
- wind velocity
- Вектор скорости ветра.
get soft body param
Gets a parameter from the soft body associated with a specified object.

Параметры:
- anchor hardness
- Коэффициент жёсткости якоря:
0
— нет влияния якоря,1
— максимальное влияние якоря. - angular stiffness
- Угловая жёсткость:
0
— отсутствие угловой жёсткости,1
— максимальная угловая жёсткость. - collision flags
- Флаг соударений жёсткого тела:
0
— нет соударений с другими жёсткими телами,1
— простой расчёт соударений,17
— точный расчёт соударений. Значение по умолчанию17
. - damping coefficient
- Коэффициент замедления:
0
- отсутствие замедления,1
- максимальное замедление. - drag coefficient
- Коэффициент силы сопротивления (сопротивление жидкости).
- dynamic friction
- Динамическое трение.
0
— без трения,1.0
— максимальное трение. - lift coefficient
- Коэффициент подъёмной силы. Должен быть положительным числом.
- linear stiffness
- Линейная жёсткость:
0
— отсутствие линейной жёсткости,1
— максимальная линейная жёсткость. - position iterations
- Количество итераций расчёта позиции.
- pressure coefficient
- Коэффициент давления (например для надувных шаров).
- velocity iterations
- Количество итераций расчёта скорости.
- wind velocity
- Вектор скорости ветра.
detect collisions and collision info
Определяет, есть ли столкновение в данный момент указанного тела с другим телом (или любым телом из списка или группы). Если столкновение произошло, срабатывают пазлы в слоте if touching do, иначе - в слоте if not touching do.
Пазл "detect collisions" запускает любой из своих слотов обратного вызова каждый кадр рендеринга.

Пазл collision info выводит словарь со следующими полями:
- objectA - имя первого столкнувшегося тела.
- objectB - имя второго сталкивающегося тела.
- distance - расстояние между точками столкновений.
- positionOnA - XYZ координаты точки столкновения на первом объекте.
- positionOnB - XYZ координаты точки столкновения на втором объекте.
- normalOnB - XYZ компоненты вектора нормали в точке столкновения на втором объекте.

Возможности предоставляемые с помощью «Ява Скрипта»
Перед началом чтения, пожалуйста, ознакомьтесь с разделом использование Ява Скрипта данного руководства пользователя.
Для создания физических пазлов мы используем «Ява Скрипт»-библиотеку под названием Ammo.js. Эта библиотека представляет собой популярный физический движок Bullet, скомпилированный для использования в браузере.
Чтобы познакомиться с Bullet, ознакомьтесь с руководством по Bullet Physics SDK, доступным на GitHub, а также с официальным справочником Bullet API Reference.
В «Вердж3Д» вы можете выполнять API Bullet/Ammo.js напрямую, используя пространство имен Ammo:
const myVector = new Ammo.btVector3(1.0, 0.0, 0.0);
console.log('Мой физический вектор:', myVector.x(), myVector.y(), myVector.z());
Также вы можете получить доступ к структурам данных, которые мы используем в пазлах, с помощью аргумента puzzles
функции runCode()
главного .js-файла вашего приложения, либо с помощью переменной puzzles
в пазле exec script.
Мир
В зависимости от инициализированного физического мира он может быть экземпляром класса btDiscreteDynamicsWorld или btSoftRigidDynamicsWorld:
const gravity = v3d.puzzles.physics.world.getGravity();
console.log('World gravity:', gravity.y());
Физические тела
Физические тела хранятся как данные с ключ-значение внутри объекта puzzles.physics.bodies:
const body = puzzles.physics.bodies['Whirligig'];
console.log('Масса тела:', 1.0 / body.getInvMass());
Жесткие тела являются экземплярами класса btRigidBody, а мягкие тела - экземплярами класса btSoftBody.
Физические ограничители
Физические ограничители хранятся в виде ключевых значений внутри двумерного объекта puzzles.physics.constraints:
const hingeConstraint = puzzles.physics.constraints['Suzanne']['Axis'];
hingeConstraint.enableAngularMotor(true, 10, 10);
Эти имена представляют первое и второе тела ограничения соответственно.
Physics Sync List
Пазлы «Вердж3Д» используют так называемый список синхронизации для перемещения объектов, представленных физическими телами, в пространстве. Список синхронизации недоступен напрямую, поэтому для добавления/удаления тел в/из этого списка необходимо использовать следующие методы API.
// добавить объект/тело в список синхронизации
// поддерживаемые типы: 'DYNAMIC', 'KINEMATIC', 'STATIC', 'GHOST' и 'SOFT_BODY'
puzzles.physics.addToSyncList(obj, body, 'DYNAMIC');
// удалить объект/тело из списка синхронизации
puzzles.physics.removeFromSyncList(obj, body);
Проблемы с пазлами?
Обратитесь за помощью на наш форум!