Raycasting

jolt_raycast

Vrací nejbližší spravované rigid body protnuté úsečkou ve výchozím worldu.

jolt_raycast() převede dva world-space endpoints ve veřejném Z-up systému na normalizovaný směr a kladnou maximální vzdálenost, provede filtrovaný dotaz a nejbližší platný veřejný body handle mapuje zpět na JoltBody a jeho aktuální user_data.

Syntax#

Syntax
jolt_raycast(x1, y1, z1, x2, y2, z2, [filter]);
ArgumentTypPopis
x1RealKonečná X souřadnice začátku úsečky ve světě se Z nahoru.
y1RealKonečná Y souřadnice začátku úsečky ve světě se Z nahoru.
z1RealKonečná Z souřadnice začátku úsečky ve světě se Z nahoru.
x2RealKonečná X souřadnice konce úsečky ve světě se Z nahoru.
y2RealKonečná Y souřadnice konce úsečky ve světě se Z nahoru.
z2RealKonečná Z souřadnice konce úsečky ve světě se Z nahoru.
filterJoltLayer | Array | Real | Struct | undefinedVOLITELNÉ. Výchozí undefined: všechny vrstvy, žádné ignorované těleso. Viz Layer Filtering.

Návratová hodnota#

Struct (RaycastResult). Bez chyby hit=true znamená zásah a hit=false platné minutí. Při validační chybě může výsledek obsahovat pouze {hit:false}; nejprve čtěte jolt_get_error(), teprve potom pole zásahu.

Příklad: základní dotaz#

Předpoklad: svět byl úspěšně spuštěn pomocí jolt_start().

GML
var result = jolt_raycast(0, 0, 2, 10, 0, 2);
var error = jolt_get_error();
if (error.code != JOLT_ERROR_NONE) {
    show_debug_message(error.message);
}
else if (result.hit) {
    show_debug_message(result.distance);
}
else {
    show_debug_message("No hit.");
}

Úsečka vede z (0, 0, 2) do (10, 0, 2). Ukázka odděluje chybu od platného výsledku ještě před jeho použitím.

Jednoduchá interakce#

GML
var hit = jolt_raycast(0, 0, 1.5, 12, 0, 1.5, {
    ignore: player_body
});
var error = jolt_get_error();

if (error.code == JOLT_ERROR_NONE && hit.hit) {
    show_debug_message("Zásah: " + string(hit.position));
    if (is_struct(hit.body)) hit.body.add_impulse(3, 0, 0);
}

Validace#

  • Nejprve zavolejte jolt_start().
  • Všech šest souřadnic musí být konečných.
  • Endpoints se musí lišit o více než přibližně 0.000001 world units.
  • Každá zadaná vrstva a ignorované body musí být stále platné.
  • Neplatné ignorované body způsobí chybu namísto tichého odstranění ignore pravidla.

Chování dotazu#

  • Dotaz je okamžitý a pouze pro čtení.
  • Vidí Dynamic, Static, Kinematic, spící a sensor rigid bodies, pokud je filtr nevyloučí.
  • Neposouvá world, nevytváří contact events, neprobouzí bodies ani neaplikuje collision response.
  • CharacterVirtual a Cloth nejsou součástí tohoto rigid-body dotazu.

Line of sight#

GML
var obstruction = jolt_raycast(eye.x, eye.y, eye.z, target.x, target.y, target.z, {
    layers: [world_layer],
    ignore: observer_body
});
var visible = jolt_get_error().code == JOLT_ERROR_NONE && !obstruction.hit;

Související dotazy#

Použijte jolt_raycast_all(), pokud jsou důležité i objekty za prvním body. Pro pohyb objemu použijte Shape Cast, pro existující objem overlap query a pro hledání bez daného směru jolt_closest_point().

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_raycastjolt_raycast(a, b, c, d, e, f, g = undefined, h = undefined)Managed forma má dva SVĚTOVÉ KONCOVÉ BODY (x1, y1, z1, x2, y2, z2), nikoliv směr. Volitelný filter jsou layers nebo options podle query dokumentace. Raycast vrací hit struct, all pole; žádný zásah hit=false/[]. Osm argumentů pouze u jolt_raycast přepne legacy formu world+origin+direction+distance s číselným body handle. Managed zásah obsahuje JoltBody a údaje původního paprsku.