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#
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#
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ázev | Výchozí | Popis |
|---|---|---|
| body_a / body_b | povinné | 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. |
| ratio | 1 | Kladný konečný creation-only násobitel segmentu L2. |
| min_length | -1 | Nezáporný limit nebo -1 pro odvození z aktuální geometrie při vytvoření. |
| max_length | -1 | Nezáporný limit nebo -1 pro odvození z aktuální geometrie při vytvoření. |
| collision | true | Zda body_a a body_b mohou kolidovat. |
| enabled | true | Počáteční stav solveru. |
Metody#
| Metoda | Vý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#
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#
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#
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ík | Signatura | Kontrakt operace |
|---|---|---|
| jolt_pulley | 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) | 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. |