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#
jolt_raycast(x1, y1, z1, x2, y2, z2, [filter]);| Argument | Typ | Popis |
|---|---|---|
| x1 | Real | Konečná X souřadnice začátku úsečky ve světě se Z nahoru. |
| y1 | Real | Konečná Y souřadnice začátku úsečky ve světě se Z nahoru. |
| z1 | Real | Konečná Z souřadnice začátku úsečky ve světě se Z nahoru. |
| x2 | Real | Konečná X souřadnice konce úsečky ve světě se Z nahoru. |
| y2 | Real | Konečná Y souřadnice konce úsečky ve světě se Z nahoru. |
| z2 | Real | Konečná Z souřadnice konce úsečky ve světě se Z nahoru. |
| filter | JoltLayer | Array | Real | Struct | undefined | VOLITELNÉ. 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().
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#
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#
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().
Související reference#
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_raycast | jolt_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. |