Физические пазлы (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 - установить вектор скорости движения.
- position - установить положение тела (работает как пазл snap body).
- restitution - коэффициент упругости: 0 - тело не упругое, как глина, 1 - тело ведет себя как сделанное из резины.
- stiffness - жесткость мягких тел, таких как объемы и канаты.
- 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 - вектор скорости движения.
- position - положение тела XYZ.
- restitution - коэффициент упругости: 0 - тело не упругое, как глина, 1 - тело ведет себя как сделанное из резины.
- stiffness - жесткость мягких тел, например канатов и тел имеющих объем.
- torque - вектор крутящего момента, приложенного к телу.
physics body params
Этот пазл теперь устарел. Вместо него используйте apply body param.
Задает параметры для физического тела, связанного с указанным объектом. Также работает для списка объектов, группы (или списка групп) или с пазлом all objects.
Параметры:
- friction - коэффициент сопротивления относительному движению твердых тел, скользящих друг относительно друга.
- linear damping - коэффициент сопротивления, который замедлит движущийся объект: 0 - нет демпфирования (например, свободное падение), 1 - максимальное демпфирование (например, объект падает без ускорения). Входные значения ограничены диапазоном [0, 1].
- angular damping - коэффициент сопротивления, который замедлит вращающийся объект: 0 - демпфирование отсутствует, 1 - максимальное демпфирование. Входные значения ограничены диапазоном [0, 1].
- restitution - коэффициент упругости: 0 - тело не упругое, как глина, 1 - тело ведет себя как сделанное из резины.
Когда два тела сталкиваются, учитываются параметры трения и реституции обоих тел.
apply vector
Этот пазл теперь устарел. Вместо него используйте параметр apply body.
Применяется Force, Gravity, Linear Velocity, Angular Velocity, Impulse, Torque, Torque Impulse или Position к физическому телу, связанному с указанным объектом, в указанном направлении в мировом пространстве. Также работает для списка объектов, группы (или списка групп) или с пазлом all objects.
Параметры:
- force - толкать тело в заданном направлении.
- gravity - назначить гравитацию индивидуально для определенного тела.
- linear velocity - установить скорость движения.
- angular velocity - установить скорость вращения.
- impulse - действует как Linear Velocity, но также учитывает массу тела (более тяжелые объекты приобретают меньшую скорость).
- torque - вращает тело в заданном направлении.
- torque impulse - действует как Angular Velocity, но учитывает массу тела (более тяжелые объекты приобретают меньшую скорость вращения).
- linear factor - установить степени свободного позиционирования для указанного тела. Например, установив компонент Z равным нулю, можно отключить движение тела вверх-вниз (Блендер, Max) или вперед-назад (Майя).
- angular factor - установить степени свободного вращения для указанного тела. Например, установив компонент Z равным нулю, можно запретить вращение тела вокруг оси вверх-вниз (Блендер, Max) или вперед-назад (Майя).
- position - установить положение тела (работает как пазл snap body).
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, и не совпадает с кадром рендеринга. Поэтому мы рекомендуем применять силы/скорости/импульсы до тика симуляции и определять столкновения между телами после тика симуляции. Таким образом, вы сможете добиться более стабильной и реалистичной симуляции.
snap body
Перемещает физическое тело, связанное с указанным объектом, и сам объект в положение другого объекта, копируя его данные преобразования. Также копируется вращение. Не работает со списками, группами или пазлом "all objects".
Работает аналогично пазлу apply body param / position.
add constraint to
Соединяет два физических тела ограничением заданного типа.
Виды ограничений:
- hinge - соединить тела общей осью.
- ball - соедините тела с помощью шарообразного гнезда.
- slider - ограничить движение тел направлением вдоль оси X.
- spring - соединяют два тела с помощью пружинного шарнира.
- fixed - плотно соединяют два тела.
remove constraint from
Удалите физическое ограничение.
anchor soft body
Привязка мягкого тела к заданному жесткому телу в точке пространства, представленной заданным вектором.
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:
var myVector = new Ammo.btVector3(1.0, 0.0, 0.0);
console.log('My physics vector is:', myVector.x(), myVector.y(), myVector.z());
Также вы можете получить доступ к следующим структурам данных, которые мы используем в пазлах:
Мир
В зависимости от инициализированного физического мира он может быть экземпляром класса btDiscreteDynamicsWorld или btSoftRigidDynamicsWorld:
var gravity = v3d.puzzles.physics.world.getGravity();
console.log('World gravity:', gravity.y());
Физические тела
Физические тела хранятся как данные с ключевым значением внутри объекта v3d.puzzles.physics.bodies:
var body = v3d.puzzles.physics.bodies['Whirligig'];
console.log('Body mass:', 1.0 / body.getInvMass());
Жесткие тела являются экземплярами класса btRigidBody, а мягкие тела - экземплярами класса btSoftBody.
Физические констрейнты
Физические констрейнты хранятся в виде ключевых значений внутри двумерного объекта v3d.puzzles.physics.constraints:
var hingeConstraint = v3d.puzzles.physics.constraints['Suzanne']['Axis'];
hingeConstraint.enableAngularMotor(true, 10, 10);
Эти имена представляют первое и второе тела ограничения соответственно.
Physics Sync List
Пазлы «Вердж3Д» используют так называемый список синхронизации для перемещения объектов, представленных физическими телами, в пространстве. Список синхронизации недоступен напрямую, поэтому для добавления/удаления тел в/из этого списка необходимо использовать следующие методы API.
// add obj / body to the sync list
// the type can be 'DYNAMIC', 'KINEMATIC', 'STATIC', 'GHOST', or 'SOFT_BODY'
v3d.puzzles.physics.addToSyncList(obj, body, 'DYNAMIC');
// remove obj / body from the sync list
v3d.puzzles.physics.removeFromSyncList(obj, body);
Проблемы с пазлами?
Обратитесь за помощью на наш форум!