Diagnostika a důvody odmítnutí
Nejdříve zjistěte, zda selhala registrace, admission, nebo až pohyb uvnitř vytvořeného relationship.
Chyba veřejné funkce a reject při hledání zásahu jsou oddělené věci. Pokud jolt_penetrator_tip vrátí undefined nebo setter false, čtěte jolt_get_error_message(). Pokud Tip existuje, sledujte jeho info, reject a všechny relationships po fyzikálním kroku.
Textový a geometrický debug#
// Enable once.
jolt_debug_enable(true);
// Draw GUI:
jolt_penetration_debug_text(16, 16);
// Existing 3D Draw pass:
jolt_debug_draw(JOLT_DEBUG_SHAPES | JOLT_DEBUG_PENETRATION);jolt_penetration_debug_text(x=16,y=16) vypíše Tip/body IDs, enabled, reject, state, počet relationships, target, has_entered, capture_source a depth. Geometrický flag kreslí hrot, vstupní bod a osu/limit kanálu. Debug nepřidává síly ani nerozhoduje o capture.
Úplná tabulka reject reason#
Následující názvy odpovídají číselným hodnotám nativního reject enumu. GML wrapper vrací číslo; nedefinuje veřejný enum JoltPenetrationReject. Nezaměňujte je s JoltPenetrationState.
| Kód | Název | Co zkontrolovat |
|---|---|---|
| 0 | None | Bez aktuálního odmítnutí; není to samo o sobě event vstupu. |
| 1 | NotPenetrable | Target není povolený pro penetraci. |
| 2 | MaskMismatch | mask a category_bits nemají společný bit. |
| 3 | AngleRejected | Skutečný úhel při zásahu je mimo max_angle. |
| 4 | TipTooFar | V hledání není vhodný blízký zásah; ve volném prostoru je to běžné. |
| 5 | OffAxis | Geometrie nevyhověla osovému vstupu. |
| 6 | LateralVelocity | Příliš velká neslučitelná boční složka pohybu. |
| 7 | AngularVelocity | Vstupní relativní spin nebo povolený pohybový budget. |
| 8 | AlreadyOccupied | Tip dosáhl svého limitu nebo již má tento target. Nejprve přečtěte relationships. |
| 9 | PairNotCollidable | Sensor, layer nebo group pravidla páru. |
| 10 | UnsupportedShape | Nepodporovaný kolizní tvar. |
| 11 | UnsupportedMotion | Penetrator musí být Dynamic; target nesmí být Kinematic. |
| 12 | IncompatibleConstraint | Jiný uživatelský constraint připojený k penetratoru. |
| 13 | CapacityFull | Kapacita Tipů, relationships nebo kandidátního bufferu. |
| 14 | DeepOverlap | Počáteční vnoření přes capture_overlap, hloubkový limit nebo neplatný start ray uvnitř targetu. |
| 15 | InvalidConfig | Neplatné nastavení; ověřte rozsahy a chybový kanál. |
| 16 | CommitFailed | Vytvoření relationship nebylo dokončeno; sledujte rollbacks a platnost bodies. |
| 17 | MovingOutward | Pohyb nesměřuje dovnitř povrchu i podél kladné osy. |
| 18 | InvalidHandle | Zaniklý Tip, body nebo svět. |
| 19 | RearmPending | Po extraction dosud není dostatečné geometrické oddělení. |
| 20 | CaptureSpeed | Kladný max_capture_axial_speed je nižší než vstupní rychlost. |
| 21 | IncompatibleChannel | Neslučitelná osa s již aktivním kanálem na stejném body. |
| 22 | AwaitingContact | Čekání na přípustné přiblížení/podmínky. Samo neprokazuje existenci intentu. |
| 23 | NoAxisSurface | Ray podél Tip axis neověřil konečný povrch targetu. |
| 24 | ContactRegion | Nevhodná přední oblast, neshoda konečného povrchu/normály nebo jiný blocking overlap. |
Praktický postup při potížích#
- Tip nevznikne: ověřte lokální bod na povrchu, nenulovou osu, podporovaný Dynamic tvar a rozsahy parametrů.
- Tip existuje, ale není entry: ověřte capture_model, target enabled, mask, layer, aktuální úhel a relativní pohyb.
- Relationship existuje, ale je Captured: čekejte na skutečnou nezápornou signed_depth; nezaměňujte jej za selhání registrace.
- Nástroj se zachytí, ale nezasouvá: prohlédněte forward_force, hmotnost, energii nárazu a max_depth.
- Další zásah nefunguje: sledujte RearmPending a clearance celého tělesa. Zkontrolujte, že nemáte starý relationship uložený jako aktuální.
Metriky#
var metrics = jolt_penetration_metrics();
if (is_struct(metrics)) {
show_debug_message("Relationships: " + string(metrics.relationships));
show_debug_message("Candidate drops: " + string(metrics.candidate_drops));
show_debug_message("Event drops: " + string(metrics.event_drops));
}| Pole | Význam |
|---|---|
| schema | Verze struktury, nyní 1. |
| tips / relationships | Aktuální živé počty. |
| tip_capacity / relationship_capacity / event_capacity / event_count | Kapacity 128 / 32 / 256 a aktuální obsazení event fronty. |
| candidates / probes / valid_probes | Kumulativní počty nalezených kandidátů a geometrických vyhodnocení, nikoli počet unikátních zásahů. |
| commits / rollbacks / candidate_drops / event_drops | Vytvořená spojení, vrácená neúspěšná vytvoření, kapacitní odmítnutí a ztracené eventy. |
| contact_queries / contact_captures / primed_cancels | Kontaktní dotazy, contact-assisted captures a zrušení před actual entry. contact_captures není součet všech model 2 captures. |
| pre_update_us / probe_us / relationship_update_us / clearance_us / physics_us / contact_us | Časové diagnostiky v µs, plněné při zapnutém nativním profilingu. Ve výchozím běhu mohou zůstat 0; veřejné penetration API nemá přepínač profilingu. |
Počítadla patří světu a během jeho života rostou; pro cenu jednoho intervalu porovnávejte rozdíl dvou vzorků. Gettery jen čtou diagnostiku. Metriky samy neřeknou přesnou první příčinu každého neúspěšného nárazu; pro reprodukci si ukládejte také konfiguraci a trajektorii.
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_penetration_debug_text | jolt_penetration_debug_text(x=16,y=16) | Kreslí diagnostický text na souřadnicích x/y, default 16/16. Volej v odpovídajícím Draw kontextu; nejde o historii ani getter. |
| jolt_penetration_metrics | jolt_penetration_metrics() | Aktuální schema:1 snapshot events/metrik managed světa, undefined při neplatném světě/transportu; není příkaz změny fyziky. |