Read this manual in English

Физика сочленений

Defold поддерживает сочленения для 2D-физики. Сочленение соединяет два объекта столкновения задействуя некоторые виды ограничителей. Поддерживаемые типы сочленений:

  • Fixed (physics.JOINT_TYPE_FIXED) — Сочленение-веревка, которое ограничивает максимальное расстояние между двумя точками. В Box2D оно также известно как Rope joint.
  • Hinge (physics.JOINT_TYPE_HINGE) — Шарнирное сочленение задает точку-якорь на два объекта столкновения и двигает их таким образом, что два объекта столкновения всегда зафиксированы в одном и том же месте, но относительное вращение объектов столкновения не ограничивается. Шарнирное сочленение позволяет сделать двигатель с максимальным заданным крутящим моментом двигателя и скоростью. В Box2D оно также известно как Revolute joint.
  • Weld (physics.JOINT_TYPE_WELD) — Сварное сочленение пытается ограничить любое относительное движение между двумя объектами столкновения. Сварное сочленение можно сделать мягким как пружина с частотой и коэффициентом амортизации. В Box2D оно также известно как Weld joint.
  • Spring (physics.JOINT_TYPE_SPRING) — Рессорное сочленение удерживает два объекта столкновения на постоянном расстоянии друг от друга. Рессорное сочленение можно сделать мягким как пружина с частотой и коэффициентом амортизации. В Box2D оно также известно как Distance joint.
  • Slider (physics.JOINT_TYPE_SLIDER) — Сочленение-слайдер позволяет относительный сдвиг двух объектов вдоль заданной оси, но блокирует относительное вращение. В Box2D оно также известно как Prismatic joint.

Создание сочленений

На данный момент сочленения могут быть созданы только программно вызовом physics.create_joint():

Поддержка создания сочленений в редакторе есть в планах, но дата релиза пока не обговорена.

-- соединить два объекта столкновения фиксированным ограничителем сочленения (веревка)
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().