title: Физика сочленений
Defold поддерживает сочленения для 2D-физики. Сочленение соединяет два объекта столкновения задействуя некоторые виды ограничителей. Поддерживаемые типы сочленений:
bodyB перемещением вдоль линии на bodyA. Также оно обеспечивает эффект пружинной подвески. В Box2D известно как Wheel joint.На данный момент сочленения могут быть созданы только программно вызовом physics.create_joint():
::: sidenote
Поддержка создания сочленений в редакторе есть в планах, но дата релиза пока не обговорена.
:::
-- соединить два объекта столкновения фиксированным ограничителем сочленения (веревка)
physics.create_joint(physics.JOINT_TYPE_FIXED, "obj_a#collisionobject", "my_test_joint", vmath.vector3(10, 0, 0), "obj_b#collisionobject", vmath.vector3(0, 20, 0), { max_length = 20 })
Код выше создаст фиксированное сочленение с идентификатором my_test_joint соединенным между obj_a#collisionobject и obj_b#collisionobject. Сочленение присоединено в 10 пикселях левее центра объекта столкновения obj_a#collisionobject и 20 пикселями выше центра объекта столкновения obj_b#collisionobject. Максимальная длина сочленения --- 20 пикселей.
Сочленение можно уничтожить вызовом physics.destroy_joint():
-- уничтожить сочленение, ранее присоединенное к первому объекту столкновения
physics.destroy_joint("obj_a#collisionobject", "my_test_joint")
Свойства сочленения могут быть считаны вызовом physics.get_joint_properties(), а установлены вызовом physics.set_joint_properties()::
function update(self, dt)
if self.accelerating then
local hinge_props = physics.get_joint_properties("obj_a#collisionobject", "my_hinge")
-- увеличить скорость двигателя на 100 оборотов в секунду
hinge_props.motor_speed = hinge_props.motor_speed + 100 * 2 * math.pi * dt
physics.set_joint_properties("obj_a#collisionobject", "my_hinge", hinge_props)
end
end
Примененные к сочленению сила реакции и крутящий момент могут быть считаны вызовами physics.get_joint_reaction_force() и physics.get_joint_reaction_torque().