Manuals
Manuals




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 中被称为绳索关节。
  • Hinge (physics.JOINT_TYPE_HINGE) - 铰链关节在两个碰撞对象上指定一个锚点,并移动它们使两个碰撞对象始终在同一位置,碰撞对象的相对旋转不受限制。铰链关节可以启用具有定义的最大引擎扭矩和速度的马达。在 Box2D 中被称为旋转关节
  • Weld (physics.JOINT_TYPE_WELD) - 焊接关节试图约束两个碰撞对象之间的所有相对运动。焊接关节可以通过频率和阻尼比使其像弹簧一样柔软。在 Box2D 中被称为焊接关节
  • Spring (physics.JOINT_TYPE_SPRING) - 弹簧关节使两个碰撞对象保持彼此之间的恒定距离。弹簧关节可以通过频率和阻尼比使其像弹簧一样柔软。在 Box2D 中被称为距离关节
  • Slider (physics.JOINT_TYPE_SLIDER) - 滑动关节允许两个碰撞对象沿指定轴相对平移,并防止相对旋转。在 Box2D 中被称为棱柱关节
  • Wheel (physics.JOINT_TYPE_WHEEL) - 轮子关节将 bodyB 上的一个点限制到 bodyA 上的一条线上。轮子关节还提供悬架弹簧。在 Box2D 中被称为轮子关节

创建关节

目前只能通过编程方式使用 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 })

上述代码将创建一个 ID 为 my_test_joint 的固定关节,连接在两个碰撞对象 obj_a#collisionobjectobj_b#collisionobject 之间。关节连接在碰撞对象 obj_a#collisionobject 中心左侧 10 像素和碰撞对象 obj_b#collisionobject 中心上方 20 像素的位置。关节的最大长度为 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() 读取施加到关节的反作用力和扭矩。