This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. 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.
  • Wheel (physics.JOINT_TYPE_WHEEL) — Колёсное сочленение ограничивает точку на bodyB перемещением вдоль линии на bodyA. Также оно обеспечивает эффект пружинной подвески. В Box2D известно как Wheel 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().