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

Łączenia

Łączenie wiąże dwa obiekty kolizji za pomocą ograniczenia. Defold obsługuje łączenia zarówno w fizyce 2D, jak i 3D, przez różne API.

Ta instrukcja opisuje łączenia 2D udostępniane przez moduł physics. Od wersji Defold 1.13.2 projekty 3D mogą tworzyć ograniczenia, w tym zawiasy, suwaki i sprężyny, oraz nimi sterować przez bullet3d.constraint. Używaj tego API z ciałami sztywnymi uzyskanymi przez bullet3d.get_rigid_body().

API physics dla 2D obsługuje następujące typy łączeń:

  • Fixed (physics.JOINT_TYPE_FIXED) - Łączenie linowe ograniczające maksymalną odległość między dwoma punktami. W Box2D nazywa się Rope joint.
  • Hinge (physics.JOINT_TYPE_HINGE) - Łączenie zawiasowe określa punkt zakotwiczenia na dwóch obiektach kolizji i przesuwa je tak, aby oba obiekty zawsze znajdowały się w tym samym miejscu, przy czym ich względny obrót nie jest ograniczony. Łączenie zawiasowe może włączyć motor o określonym maksymalnym momencie obrotowym i prędkości. W Box2D odpowiada Revolute joint.
  • Weld (physics.JOINT_TYPE_WELD) - Łączenie spawane próbuje ograniczyć cały względny ruch między dwoma obiektami kolizji. Może być zmiękczone jak sprężyna dzięki częstotliwości i współczynnikowi tłumienia. W Box2D odpowiada Weld joint.
  • Spring (physics.JOINT_TYPE_SPRING) - Łączenie sprężynowe utrzymuje dwa obiekty kolizji w stałej odległości od siebie. Także może być zmiękczone jak sprężyna dzięki częstotliwości i współczynnikowi tłumienia. W Box2D odpowiada Distance joint.
  • Slider (physics.JOINT_TYPE_SLIDER) - Łączenie przesuwne pozwala na względne przesunięcie dwóch obiektów kolizji wzdłuż wskazanej osi i zapobiega ich względnemu obrotowi. W Box2D odpowiada Prismatic joint.
  • Wheel (physics.JOINT_TYPE_WHEEL) - Łączenie koła ogranicza punkt na bodyB do linii na bodyA. Zapewnia też sprężynę zawieszenia. W Box2D odpowiada Wheel joint.

Tworzenie łączeń

Opisane tutaj łączenia 2D tworzy się programowo za pomocą physics.create_joint():

Obsługa tworzenia łączeń w edytorze jest planowana, ale nie ustalono jeszcze daty wydania.

-- połącz dwa obiekty kolizji za pomocą stałego ograniczenia łączenia (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 })

Powyższy przykład tworzy łączenie typu Fixed o id my_test_joint pomiędzy obiektami kolizji obj_a#collisionobject i obj_b#collisionobject. Łączenie jest umieszczone 10 pikseli na prawo od środka obj_a#collisionobject i 20 pikseli nad środkiem obj_b#collisionobject. Maksymalna długość łączenia wynosi 20 pikseli.

Niszczenie łączeń

Łączenie można zniszczyć za pomocą physics.destroy_joint():

-- zniszcz łączenie wcześniej podłączone do pierwszego obiektu kolizji
physics.destroy_joint("obj_a#collisionobject", "my_test_joint")

Odczyt i aktualizacja łączeń

Właściwości łączenia można odczytać przez physics.get_joint_properties(), a ustawić przez physics.set_joint_properties():

function update(self, dt)
    if self.accelerating then
        local hinge_props = physics.get_joint_properties("obj_a#collisionobject", "my_hinge")
        -- zwiększ prędkość motoru o 100 obrotów na sekundę
        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

Odczyt siły i momentu reakcji łączenia

Siłę reakcji i moment reakcji działające na łączenie można odczytać funkcjami physics.get_joint_reaction_force() oraz physics.get_joint_reaction_torque().