‹›
JoltPhysics

Grip: přichycení postavy

Dvě pomyslné ruce přichytí Character ke statickému nebo kinematickému povrchu.

První použití#

Grip pohybuje postavou podle kotev rukou; Grabber / Carry naopak drží předmět před postavou. Jeden Character může mít jeden Grip controller. Připojený Dynamic Body současný Grip nepodporuje.

GML
wall.set_grip_enabled(true);
grip = jolt_grip(player);
grip.set_camera(o_control_bbmod_camera);
grip.set_distances(0.65, 1.5, 2);
// End Step, po aktualizaci kamery:
grip.update_controls();
// Clean Up:
// grip.destroy();

player musí být platný JoltCharacter. Kamera poskytuje camera.Position, camera.Target a mouse_locked. Výchozí levé/pravé tlačítko myši ovládá levou/pravou ruku. Pro vlastní vstup použij acquire nebo update_hand; nespracovávej tentýž vstup zároveň automaticky.

Vzdálenosti a pohyb#

NastaveníVýznam a rozsah
set_distances(working, reach, break, hand=JOLT_GRIP_BOTH)Metry: cílová vzdálenost, dosah získání úchopu, mez puštění. 0.05 ≤ working ≤ reach ≤ break ≤ 100. Default 0.65, 1.5, 2.
set_motion(max_speed, response)Rychlost (0,30] m/s a odezva (0,60] 1/s. Default 3 a 8.
set_body_movement_enabled(enabled)Povolí posun těla vůči úchopu. Default false.
set_body_offset_limit(distance)0–100 m; default 0.75.
set_body_move_speed(speed) / set_body_move_response(response)(0,30] m/s a (0,60] 1/s; default 1 a 10.
set_body_return_enabled(enabled) / set_body_return_speed(speed)Návrat offsetu po puštění pohybových kláves. Default false a 1 m/s. Při false offset přetrvává.
set_move_input(x,y)Abstraktní osy −1 až 1. Pohyb integruje pevný fyzikální krok.
set_view_angles(yaw,pitch)Stupně; yaw 0 = +X, 90 = +Y, kladný pitch míří nahoru.
set_view_basis(fx,fy,fz,rx,ry,rz)Světový směr vpřed a vpravo; musí vytvořit nenulovou nezávislou bázi.

Ruce a aktuální cíl#

JOLT_GRIP_LEFT = 0, JOLT_GRIP_RIGHT = 1; BOTH = −1 je jen pro operace podporující obě ruce. get_attached(hand) vrací Boolean. get_position, get_rotation, get_world_normal a ostatní údaje úchopu vracejí undefined, pokud ruka není přichycená. Pozice je {x,y,z} ve světě, rotace quaternion {x,y,z,w}. +Z rotace odpovídá normále povrchu; +X vychází z kamery při uchopení.

GML
var hand = grip.get_hand(JOLT_GRIP_LEFT);
if (is_struct(hand) && hand.attached) {
    hand_model.Matrix = model_matrix_from_transform(
        hand.world_position, hand.world_rotation);
}
var target = grip.get_target();
if (!is_undefined(target)) {
    preview.Matrix = model_matrix_from_transform(target.position, target.rotation);
}

get_target(hand=JOLT_GRIP_LEFT) provede jeden aktuální kamerový raycast a vrátí {position,world_normal,rotation}, nebo undefined. can_grip je pouze zjištění způsobilosti, nezískává úchop. Pro více údajů čti get_hand nebo get_target jednou; jednotlivé gettery pořizují vlastní snapshot/raycast. Zobrazení modelu zapínej a vypínej ve svém rendereru.

Pohyblivé kotvy a omezení#

Static povrch se nesmí po uchopení přemístit. Kinematic kotva se aktualizuje z lokální pozice, normály a rotace a přenáší rychlost bodu. Teleport, změna tvaru/pohybu, vypnutí grip_enabled, zničení tělesa, filtr kolizí nebo překročení break mohou ruku uvolnit. Dynamic Grip, reakční síly rukou, stamina a IK nejsou implementované.

Diagnostika a životnost#

get_status vrací obě ruce a důvody; get_reason(hand) vysvětluje odmítnutí nebo puštění. Po odmítnutí update_hand je nutné pustit ovládání před novým pokusem. release() pustí obě ruce, destroy() ukončí controller. Zničení Characteru jej uvolní. set_debug, set_debug_xray, set_debug_limits a set_debug_labels řídí diagnostiku; draw_debug_gui není veřejné API.

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
JoltBody.get_grip_enabledJoltBody.get_grip_enabled()Nezávislé opt-in příznaky, výchozí false. Setter Boolean/0/1 → Boolean; getter Boolean false i při chybě. Grip nyní přijímá Static i Kinematic, nikoliv Dynamic; grab_enabled nezaručuje splnění dalších Carry podmínek.
JoltBody.set_grip_enabledJoltBody.set_grip_enabled(enabled)Nezávislé opt-in příznaky, výchozí false. Setter Boolean/0/1 → Boolean; getter Boolean false i při chybě. Grip nyní přijímá Static i Kinematic, nikoliv Dynamic; grab_enabled nezaručuje splnění dalších Carry podmínek.
JoltGrip.acquireJoltGrip.acquire(hand,ox,oy,oz,dx,dy,dz)LEFT/RIGHT + světový origin a direction. Boolean pokusu; podporuje grip_enabled Static/Kinematic, nikoliv Dynamic. Již přichycená ruka zachová kotvu.
JoltGrip.can_gripJoltGrip.can_grip(hand=JOLT_GRIP_LEFT)Boolean aktuální způsobilosti raycast cíle, default LEFT; pouze LEFT/RIGHT, ne BOTH. Používá nastavenou kameru; nemusí být právě stisknuté tlačítko.
JoltGrip.draw_debugJoltGrip.draw_debug()Draw s aktivní 3D kamerou; Boolean. Kreslí pouze při zapnutém debug a platném controlleru; obnovuje grafický stav. Není to Draw GUI.
JoltGrip.get_anchor_velocityJoltGrip.get_anchor_velocity(hand)Světová rychlost kotvy {x, y, z} m/s, undefined bez přichycení.
JoltGrip.get_bodyJoltGrip.get_body(hand)Managed host přichycené ruky, jinak undefined; nevlastněný.
JoltGrip.get_distanceJoltGrip.get_distance(hand)Aktuální vzdálenost ruky od referenčního bodu v m, undefined bez přichycení.
JoltGrip.get_handJoltGrip.get_hand(hand)Nezávislý aktuální diagnostický snapshot (celý systém nebo LEFT/RIGHT). get_hand uchovává reason i po release; vrácený struct nemění živý solver. Chyba undefined.
JoltGrip.get_local_normalJoltGrip.get_local_normal(hand)Místní {x, y, z} kotvy vůči hostu: pozice m / jednotková normála. Bez přichycení undefined.
JoltGrip.get_local_positionJoltGrip.get_local_position(hand)Místní {x, y, z} kotvy vůči hostu: pozice m / jednotková normála. Bez přichycení undefined.
JoltGrip.get_motion_typeJoltGrip.get_motion_type(hand)Typ hosta static/kinematic, undefined bez přichycení; moving_anchor Boolean, false bez přichycení.
JoltGrip.get_moving_anchorJoltGrip.get_moving_anchor(hand)Typ hosta static/kinematic, undefined bez přichycení; moving_anchor Boolean, false bez přichycení.
JoltGrip.get_reasonJoltGrip.get_reason(hand)Diagnostický důvod ruky ze snapshotu, dostupný i po puštění; neplatný hand vrací undefined.
JoltGrip.get_statusJoltGrip.get_status()Nezávislý aktuální diagnostický snapshot (celý systém nebo LEFT/RIGHT). get_hand uchovává reason i po release; vrácený struct nemění živý solver. Chyba undefined.
JoltGrip.is_validJoltGrip.is_valid()Boolean: controller nebyl zničen a má živý Character; připravený bez holderu false.
JoltGrip.set_cameraJoltGrip.set_camera(source)Objekt kamery / živá instance / undefined; Boolean, změna pustí ruce. Očekává camera.Position/Target s X/Y/Z a mouse_locked.
JoltGrip.set_debugJoltGrip.set_debug(enabled)Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech.
JoltGrip.set_debug_bodyJoltGrip.set_debug_body(body)Živý box JoltBody nebo undefined; Boolean. Pouze volitelný diagnostický obrys, těleso nevlastní.
JoltGrip.set_debug_labelsJoltGrip.set_debug_labels(enabled)Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech.
JoltGrip.set_debug_limitsJoltGrip.set_debug_limits(enabled)Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech.
JoltGrip.set_debug_xrayJoltGrip.set_debug_xray(enabled)Uloží příznak kreslení a vrací true; nemění fyziku ani nepovoluje grip_enabled na tělesech.
JoltGrip.set_holderJoltGrip.set_holder(holder)Živý JoltCharacter; Boolean. Jeden controller na Character, změna pustí staré ruce a přenese uloženou konfiguraci.
JoltGrip.set_left_buttonJoltGrip.set_left_button(button)Celé 0..5, 0 vypne ruku; Boolean. Změna bindingu pustí příslušnou ruku.
JoltGrip.set_move_inputJoltGrip.set_move_input(x,y)Konečné XY -1..1, Boolean, vyžaduje živého holdera; kamera relativní posun těla při zapnutém body movement.
JoltGrip.set_right_buttonJoltGrip.set_right_button(button)Celé 0..5, 0 vypne ruku; Boolean. Změna bindingu pustí příslušnou ruku.
JoltGrip.set_view_anglesJoltGrip.set_view_angles(yaw,pitch)Konečné yaw/pitch ve stupních, Boolean. Yaw 0 míří +X, 90 +Y, kladný pitch nahoru; rámec pro pohyb a orientaci uchopení.
JoltGrip.set_view_basisJoltGrip.set_view_basis(fx,fy,fz,rx,ry,rz)Konečný forward/right, nenulové nezávislé vektory; Gram–Schmidt ortonormalizace, Boolean.
JoltGrip.update_controlsJoltGrip.update_controls()Jednou End Step po kameře; Boolean. Odemčená myš nebo neaktivní okno pustí ruce a vrátí true; chybějící/neplatná kamera pustí a vrátí false.
JoltGrip.update_handJoltGrip.update_hand(hand,down,ox,oy,oz,dx,dy,dz)LEFT/RIGHT, Boolean down a ray. Nový pokus jen na hraně stisku; držení po neúspěšném pokusu automaticky neopakuje acquire. Boolean neznamená attached: ověř get_attached.

Úplný seznam deklarací API#

Deklarace odpovídají produkčním GML zdrojům. Hodnota za = označuje volitelný argument. Toto je seznam signatur; význam, jednotky a omezení popisují příslušné části návodu. Název typu před tečkou označuje vlastníka metody, nikoli globální funkci.