‹›
Pomocné skripty

Fyzikální váha

Vytvoří skutečnou fyzikální load-cell platformu a měří zatížení přenášené její pevnou podpěrou.

jolt_scale_create vytvoří vlastněnou Dynamic box platformu a interním Fixed Constraintem ji připne ke světu. Po každém dokončeném physics stepu přečte vyřešený lineární reakční impulz constraintu, promítne jej na vybranou osu zatížení a vydělí časem fixed stepu. Nejde o overlap query ani o prosté sčítání hmotností dotýkajících se těles.

Fyzikální princip#

GML
objekty a aplikované síly
        ↓
Dynamic box platforma
        ↓
reakce Fixed Constraintu
        ↓
síla ve směru měření
  • Platforma je Dynamic, takže běžné Jolt kontakty a tření do ní mohou přenášet síly.
  • Interní Fixed Constraint ji drží v creation pose a přenáší zatížení do pevného světa.
  • Akumulovaný lineární impulz solveru se dělí délkou physics stepu; při konzistentních metre-kilogram-sekunda jednotkách tak vzniká síla v newtonech.
  • Vrací se pouze nezáporná složka ve směru direction. Reakce proti zvolené kladné ose se ořízne na nulu.
  • Teoretické gravitační zatížení samotné platformy se automaticky odečte, proto nová prázdná váha začíná blízko nuly.

Syntaxe#

Syntax
scale = jolt_scale_create(-6.5, -3.1, 0.3, 3.0, 1.8, 0.05);
scale.set_smoothing(0.2);
scale.set_enabled(true);
scale.set_direction(0, 0, 1);

Argumenty#

ArgumentPopis
x, y, zKonečný world-space střed box platformy.
widthCelý kladný rozměr podél veřejné osy X.
depthCelý kladný rozměr podél veřejné osy Y.
heightCelý kladný rozměr podél veřejné osy Z.
optionsVolitelná nastavení váhy spolu s podporovanými běžnými JoltBody creation options.

Nastavení váhy#

FieldVýchozíVýznam
mass20.0Kladná hmotnost samotné vlastněné platformy. Její teoretická gravitační reakce tvoří počáteční prázdný baseline.
reference_gravity9.81Kladný dělitel používaný pouze pro převod naměřené síly na ekvivalentní kilogramy.
direction{x:0,y:0,z:1}Konečná nenulová lokální osa zatížení; automaticky se normalizuje.
smoothing0.15Nezáporná časová konstanta exponenciálního vyhlazení v physics sekundách. Nula používá raw hodnoty.
enabledtrueZapíná měření. Nezapíná ani nevypíná fyzickou platformu či constraint.

Užitečné body options#

FieldPoužití na váze
friction / restitutionUrčují, jak se náklad na platformě dotýká, klouže a odráží.
layerZařadí platformu do požadované collision layer.
dataUloží project metadata na scale.body.
massProjde také běžnými body options, ale normálně má zůstat creation-time hmotností platformy.
allow_sleepingPři options se přijme, ale záměrně se přepíše na false, aby měření zůstalo aktuální.

Příklad vytvoření#

GML
scale = jolt_scale_create(-6.5, -3.1, 0.3, 3.0, 1.8, 0.05);
scale.set_smoothing(0.2);
scale.set_enabled(true);
scale.set_direction(0, 0, 1);

Čtení váhy#

GML
// Nejprve jolt_update(), aby existoval dokončený physics step.
jolt_update(delta_time / 1000000);

if (scale.is_valid()) {
    var kilograms = scale.get_weight();
    var force_newtons = scale.get_force();

    if (!jolt_has_error()) {
        draw_text(32, 32, string_format(kilograms, 0, 2) + " kg");
        draw_text(32, 52, string_format(force_newtons, 0, 1) + " N");
    }
}
  • Hodnoty se aktualizují pouze po úspěšně dokončeném physics stepu. Opakované gettery ve stejném stepu vrátí stejný sample.
  • get_force() a get_weight() vrací vyhlazené hodnoty vhodné pro UI.
  • get_raw_force() a get_raw_weight() vrací poslední nevyhlazený physics-step sample pro diagnostiku nebo logiku nárazů.
  • Getter při chybě vrátí bezpečnou číselnou nulu a nastaví běžnou high-level chybu; nulu proto nepovažujte za důkaz, že neplatná váha není zatížená.

Veřejné metody#

MetodaÚčel
is_valid()Ověří managed wrapper, vlastněnou platformu a native scale resource.
get_native_handle()Vrátí opaque scale handle, nebo 0 při neplatnosti.
get_body() / bodyVrátí běžný managed JoltBody vlastněný váhou.
get_force()Exponenciálně vyhlazená reakce v ose zatížení v newtonech.
get_raw_force()Poslední nevyhlazená reakce v ose zatížení v newtonech.
get_weight()Vyhlazená síla dělená reference_gravity.
get_raw_weight()Raw síla dělená reference_gravity.
tare()Uloží aktuální celkovou reakci jako novou nulu a okamžitě vynuluje obě zobrazované hodnoty.
set_smoothing(seconds) / get_smoothing()Změní nebo přečte časovou konstantu low-pass filtru. Nula vyhlazení vypne.
set_enabled(bool) / get_enabled()Zapne či vypne měření bez odstranění fyzické podpěry.
set_direction(x,y,z) / get_direction()Změní nebo přečte normalizovanou lokální osu zatížení a resetuje aktuální hodnoty.
destroy()Zničí váhu, interní constraint i vlastněnou platformu. Opakované volání je bezpečné.

Tárování a nádoby#

GML
// Položte prázdnou nádobu a počkejte na ustálení.
if (keyboard_check_pressed(ord("T"))) {
    if (!scale.tare()) {
        show_debug_message(jolt_get_error().message);
    }
}
  • Nová váha automaticky odečítá pouze teoretické gravitační zatížení vlastní platformy.
  • tare() nahradí baseline úplnou reakcí naměřenou v okamžiku volání, což je vhodné pro nádoby a přípravky.
  • Tárujte až po ustálení. Tare během nárazu nebo zrychlení uloží přechodnou sílu jako novou nulu.
  • Změna direction přepočítá teoretický baseline platformy a vymaže raw i smoothed reading; pokud se má nádoba dále odečítat, znovu tárujte.

Vyhlazování#

  • Smoothing je exponenciální low-pass filter podle uplynulého physics času, takže render framerate nemění jeho odezvu.
  • Vyšší časová konstanta vytvoří stabilnější, ale pomalejší displej. Pro UI je praktickým začátkem přibližně 0.1 až 0.3 sekundy.
  • Nula okamžitě sjednotí smoothed reading s posledním raw samplem.
  • Raw force použijte pro krátké impact peaks; smoothed weight pro čitelné popisky a displeje.

Směr zatížení#

  • Výchozí {0,0,1} měří podpěrnou reakci vzhůru na běžné vodorovné platformě.
  • Vektor se ukládá v pevné lokální reference frame platformy a native implementace jej normalizuje.
  • Vrací se pouze kladná promítnutá reakce. Zvolte znaménko tak, aby očekávaná podpěrná síla mířila podél osy.
  • U vodorovné nebo šikmé osy get_weight() stále dělí hodnotou reference_gravity, takže kg zůstává ekvivalentem síly, nikoliv mass objektu.

Vlastnictví a životní cyklus#

  • Váha vlastní Dynamic platformu a interní Fixed Constraint.
  • scale.destroy() zneplatní scale.body a odstraní oba native resources.
  • Ruční zničení scale.body atomicky zneplatní váhu a odstraní interní constraint.
  • Platforma má vypnuté sleeping, aby solver vytvářel čerstvou reakci i po dlouhém stání nákladu.
  • jolt_stop() uklidí živé váhy při managed teardownu worldu.
  • scale.body lze použít pro data, layer, friction, debug draw a visual transform, ale neničte jej samostatně, pokud nechcete odstranit celou váhu.

Fyzikální interpretace a omezení#

  • Stack přispívá silami skutečně přenesenými do platformy; horní bodies se jí nemusí přímo dotýkat.
  • Objekt podepřený dvěma platformami rozdělí reakci mezi obě váhy.
  • Ropes, springs, constrainty a aplikované síly přispívají podle zatížení přeneseného platformou.
  • Nárazy vytvářejí dočasné špičky, které mohou překročit statickou hmotnost.
  • Solver settling, contact softness, friction a fixed timestep způsobují drobné výkyvy; jde o očekávané fyzikální chování.
  • Váha měří jednu orientovanou osu a zápornou reakci ořezává. Není to šestiosý force/torque sensor.

Validace a chyby#

  • Před jolt_scale() zavolejte jolt_start().
  • Position a dimensions musí být konečné a každý rozměr větší než nula.
  • mass a reference_gravity musí být konečné a kladné.
  • smoothing musí být konečný a nezáporný; enabled musí být Boolean.
  • direction musí být struct s konečnými x, y a z tvořícími nenulový vektor.
  • Creation při chybě vrací undefined. Mutating methods vrací false; číselné gettery vrací 0 a get_direction() vrací undefined.
  • Po neúspěšném managed volání ihned přečtěte jolt_get_error(), než jej nahradí další Jolt operace.

Low-Level / Advanced API#

GML
jolt_world_scale_create(world, x, y, z, width, depth, height, mass, reference_gravity)
jolt_world_scale_destroy(world, scale_handle)
jolt_world_scale_is_valid(world, scale_handle)
jolt_world_scale_get(world, scale_handle, property)
jolt_world_scale_tare(world, scale_handle)
jolt_world_scale_set_smoothing(world, scale_handle, seconds)
jolt_world_scale_set_enabled(world, scale_handle, enabled)
jolt_world_scale_set_direction(world, scale_handle, x, y, z)

Legacy / Deprecated API#

jolt_scale(x,y,z,width,depth,height,options) zůstává kompatibilní factory nad stejnou implementací. Creation-only reference_gravity je dostupná touto cestou. Defaulty nové factory: mass=20 kg, reference_gravity=9.81 m/s², smoothing=0.15 s, enabled=true, direction={x:0,y:0,z:1}. Běžné body parametry používají stejnou cestu jako dříve.

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
JoltScale.get_bodyJoltScale.get_body()Vrací vlastněnou platformu JoltBody, jinak undefined. Její ruční zničení zneplatní váhu; Scale.destroy zničí i platformu.
JoltScale.get_directionJoltScale.get_direction()Normalizovaný lokální vektor platformy {x, y, z}, výchozí {0, 0, 1}; undefined při chybě kterékoliv složky.
JoltScale.get_enabledJoltScale.get_enabled()Boolean; porovnává nativní hodnotu s 1. Při chybě false; rozliš pomocí chybového stavu. Výchozí true.
JoltScale.get_native_handleJoltScale.get_native_handle()Platný nativní handle, jinak 0; handle si neponechávej přes destroy nebo restart světa.
JoltScale.get_raw_forceJoltScale.get_raw_force()Nefiltrovaná reakce v ose váhy za poslední fyzikální krok; jednotka N. Při chybě 0 a chybový stav; nulu proto nelze samotnou použít jako důkaz platnosti.
JoltScale.get_raw_weightJoltScale.get_raw_weight()Nefiltrovaná ekvivalentní hmotnost, síla dělená referenční gravitací; jednotka kg. Při chybě 0 a chybový stav; nulu proto nelze samotnou použít jako důkaz platnosti.
JoltScale.get_smoothingJoltScale.get_smoothing()Doba vyhlazování, výchozí 0.15 s; jednotka s. Při chybě 0 a chybový stav; nulu proto nelze samotnou použít jako důkaz platnosti.
JoltScale.is_validJoltScale.is_valid()Boolean; ověří platformu i nativní váhu. Neplatná platforma znamená neplatnou váhu.

Ú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.

Symbol / vlastníkSignatura / hodnota
jolt_scalejolt_scale(x, y, z, width, depth, height, options = undefined)