Физические пазлы (Physics) — Софт Эйт Софт
Description: Использование пазлов для моделирования физического поведения.

# Физические пазлы (Physics)

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

## Содержание

- Перечень физических пазлов
  - create physics world
  - create rigid body
  - create soft body
  - remove physics body
  - apply body param
  - get body param
  - set body state
  - on simulation tick
  - snap body
  - add constraint to
  - remove constraint from
  - anchor soft body
  - apply soft body param
  - get soft body param
  - detect collisions and collision info
- Возможности предоставляемые с помощью «Ява Скрипта»

#

## Перечень физических пазлов

#

### 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` - тело ведет себя как сделанное из резины.
rotation
  Поворот тела в эйлеровских углах XYZ.
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);`

## Проблемы с пазлами?

Обратитесь за помощью на наш форум!