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 物理シミュレーションでジョイント(joint)をサポートしています。ジョイントは、何らかの拘束(constraint)を使って2つのコリジョンオブジェクト(collision object)を接続します。サポートされているジョイントの種類は次のとおりです。

  • 固定(Fixed) (physics.JOINT_TYPE_FIXED) - 2点間の最大距離を制限するロープジョイントです。Box2D ではロープジョイント(Rope joint)と呼ばれます。
  • ヒンジ(Hinge) (physics.JOINT_TYPE_HINGE) - ヒンジジョイントは、2つのコリジョンオブジェクト上にアンカーポイントを指定し、2つのコリジョンオブジェクトが常に同じ位置にあるように移動させます。コリジョンオブジェクト間の相対回転は制限されません。ヒンジジョイントでは、最大モータートルクと速度を定義したモーターを有効にできます。Box2D では回転ジョイント(Revolute joint)と呼ばれます。
  • 溶接(Weld) (physics.JOINT_TYPE_WELD) - 溶接ジョイントは、2つのコリジョンオブジェクト間の相対的な動きをすべて拘束しようとします。周波数と減衰比を設定することで、溶接ジョイントをばねのように柔らかくできます。Box2D では溶接ジョイント(Weld joint)と呼ばれます。
  • スプリング(Spring) (physics.JOINT_TYPE_SPRING) - スプリングジョイントは、2つのコリジョンオブジェクト間の距離を一定に保ちます。周波数と減衰比を設定することで、スプリングジョイントをばねのように柔らかくできます。Box2D では距離ジョイント(Distance joint)と呼ばれます。
  • スライダー(Slider) (physics.JOINT_TYPE_SLIDER) - スライダージョイントは、指定した軸に沿った2つのコリジョンオブジェクトの相対的な平行移動を許可し、相対回転を防ぎます。Box2D では直動ジョイント(Prismatic joint)と呼ばれます。
  • ホイール(Wheel) (physics.JOINT_TYPE_WHEEL) - ホイールジョイントは、bodyB 上の点を bodyA 上の直線に拘束します。ホイールジョイントにはサスペンション用のばねもあります。Box2D ではホイールジョイント(Wheel joint)と呼ばれます。

ジョイントの作成

現在、ジョイントは physics.create_joint() を使ってプログラムからのみ作成できます。

エディターでのジョイント作成のサポートは予定されていますが、リリース日は決まっていません。

-- connect two collision objects with a fixed joint constraint (rope)
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 })

上記のコードは、2つのコリジョンオブジェクト obj_a#collisionobjectobj_b#collisionobject の間に、ID が my_test_joint の固定ジョイントを作成します。ジョイントは、コリジョンオブジェクト obj_a#collisionobject の中心から右に10ピクセルの位置と、コリジョンオブジェクト obj_b#collisionobject の中心から上に20ピクセルの位置に接続されます。ジョイントの最大長は20ピクセルです。

ジョイントの破棄

ジョイントは physics.destroy_joint() を使って破棄できます。

-- destroy a joint previously connected to the first collision object
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")
        -- increase motor speed by 100 revolutions per second
        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() を使って読み取れます。