Constraints

Pulley Constraint

Spojí délky dvou přímých segmentů pomocí kladného ratio bez simulace lana nebo kola kladky.

jolt_pulley() je přímý managed wrapper PulleyConstraint z Jolt Physics 5.6. Propojuje dvě tělesa pomocí dvou pevných world points a dvou body attachment points.

Syntaxe#

Syntax
jolt_pulley(body_a, body_b,
    fixed_a_x, fixed_a_y, fixed_a_z,
    fixed_b_x, fixed_b_y, fixed_b_z,
    options=undefined)

Fyzikální rovnice#

GML
min_length <= L1 + ratio * L2 <= max_length

L1 = distance(body_point_a, fixed_point_a)
L2 = distance(body_point_b, fixed_point_b)

Ratio násobí Body B / segment 2. Při ratio 2 odpovídá změna L1 o dvě jednotky opačné změně L2 o jednu jednotku, pokud zůstává taut total zachovaný.

Argumenty a options#

NázevVýchozíPopis
body_a / body_bpovinnéDvě různá živá managed tělesa.
fixed_a_* / fixed_b_*povinnéKonečné pevné world-space body vnějších konců segmentů.
body_point_a{x:0,y:0,z:0}Attachment local k center of mass Body A.
body_point_b{x:0,y:0,z:0}Attachment local k center of mass Body B.
ratio1Kladný konečný creation-only násobitel segmentu L2.
min_length-1Nezáporný limit nebo -1 pro odvození z aktuální geometrie při vytvoření.
max_length-1Nezáporný limit nebo -1 pro odvození z aktuální geometrie při vytvoření.
collisiontrueZda body_a a body_b mohou kolidovat.
enabledtruePočáteční stav solveru.

Metody#

MetodaVýsledek
is_valid() / get_native_handle()Ověří wrapper nebo vrátí jeho neprůhledný native handle.
destroy()Idempotentně uvolní constraint bez zničení kteréhokoli tělesa.
set_enabled() / get_enabled()Změní účast v solveru a zachová resource.
set_collision_enabled() / get_collision_enabled()Řídí connected-body pair filter.
set_length(minimum, maximum)Aktualizuje rozsah 0 <= minimum <= maximum a probudí obě tělesa.
get_min_length() / get_max_length()Vrátí aktuální resolved hranice.
get_current_length()Vrátí aktuální geometrické L1 + ratio * L2.
get_impulse()Vrátí poslední signed solver impulse podél nezávislé pulley axis.

Příklad: rovnoměrná kladka#

GML
var box_a = jolt_box_create_dynamic(-2, 0, 3, 1, 1, 1, { mass:20 });
var box_b = jolt_box_create_dynamic( 2, 0, 3, 1, 1, 1, { mass:5 });

var pulley = jolt_pulley(
    box_a, box_b,
    -2, 0, 6,
     2, 0, 6,
    { ratio:1, min_length:-1, max_length:-1, collision:false }
);

Vůle a runtime délka#

GML
var current = pulley.get_current_length();

// Zkraťte současnou pevnou celkovou délku o půl jednotky.
pulley.set_length(current - 0.5, current - 0.5);

// Rozsah dovolí vůli.
pulley.set_length(0, 10);

Off-centre attachment#

GML
var pulley = jolt_pulley(a, b, -2,0,6, 2,0,6, {
    body_point_a: { x:0.45, y:0, z:0.25 },
    body_point_b: { x:0, y:0, z:0 }
});

Off-centre material point se otáčí s Body A. Tension působí v tomto bodě, a proto může vytvořit skutečnou angular response.

Omezení a životní cyklus#

  • ratio je creation-only, protože Jolt neposkytuje bezpečný runtime ratio setter.
  • Dva vnější segmenty jsou přímé matematické constrainty bez rope collision, wrappingu, pružného lana nebo simulovaného kola.
  • Signed impulse není force. Přibližná průměrná magnitude je abs(impulse) / fixed_dt.
  • Extrémní ratios, mass ratios, velmi krátké délky nebo velké time steps mohou potřebovat více solver iterations.
  • Zničení tělesa zneplatní pulley; destroy() i jolt_stop() zůstávají bezpečné.
  • JOLT_DEBUG_CONSTRAINTS kreslí oba live segmenty, fixed points a vysvětlující span mezi nimi.

Ověřené kontrakty operací#

Následující kontrakty rozlišují jednotky, návratové hodnoty, chyby a životnost podle aktuální implementace. Nevynechávej kontrolu výsledku: false, 0 a undefined mohou mít u různých metod odlišný význam.

Symbol / vlastníkSignaturaKontrakt operace
jolt_pulleyjolt_pulley(body_a, body_b, fixed_a_x, fixed_a_y, fixed_a_z, fixed_b_x, fixed_b_y, fixed_b_z, options = undefined)Dvě tělesa + pevné světové body závěsů; options body_point_a/b místní default 0, ratio>0 default 1, min/max_length default-1 (odvodit délku). Omezení lengthA+ratio*lengthB, m. Constraint/undefined, collision/enabledtrue.