‹›
Kolizní systém

Filtrování kolizí

Řídí simulation pairs, constraint pairs a výsledky raycast queries.

Extension nabízí tři nezávislé úrovně filtrování: world collision-layer matrix, per-constraint potlačení dvojice a layer/body filtry raycastu.

Filtrování simulation pair#

GML
var player = jolt_layer_create("Player");
var trigger = jolt_layer_create("Trigger");

jolt_layer_set_collision(player, trigger, true);
jolt_layer_set_collision(trigger, trigger, false);

32×32 user-layer matrix je symetrická a defaultně povolená. Zde zakázaná dvojice nevytváří physical response ani body contact events. Stejnou matici respektují sensory. Static-vs-Static dvojice navíc odmítá broad phase.

Filtrování constraint pair#

GML
var joint = jolt_hinge(body_a, body_b, anchor_x, anchor_y, anchor_z,
    axis_x, axis_y, axis_z, {collision:false});

joint.set_collision_enabled(true);
var enabled = joint.get_collision_enabled();

Constraints mezi dvěma bodies mají vlastní pair filter. High-level constraint creators mají collision standardně true; options.collision=false zakáže pouze dvojici propojených bodies. Nastavení lze později změnit. World constraints nemají druhé body a collision hlásí jako vypnutou.

Raycast filtry#

GML
jolt_raycast(x1, y1, z1, x2, y2, z2, filter)
jolt_raycast_all(x1, y1, z1, x2, y2, z2, filter)
Forma filteruVýznam
undefinedVšechny vrstvy, žádné ignorované body
JoltLayerPouze daná vrstva
[layer_a, layer_b]Sjednocení platných vrstev
numeric maskRaw 32-bit user-layer mask; 0 znamená všechny
{layers:[...], ignore:body}Sjednocení vrstev a jeden ignorovaný JoltBody
{mask:value, ignore:body}Raw mask a jeden ignorovaný JoltBody

Mapování masky#

JoltLayer handly jsou 1-based, maska je zero-based: layer handle 1 používá bit 0, handle 2 bit 1 atd. High-level forma s array vrstev tuto masku sestaví a odstraní duplicity. Každá vrstva i ignorované body musí být stále platné.

Chování výsledků raycastu#

  • Endpoint forma vyžaduje dva různé konečné body.
  • jolt_raycast() vrací nejbližší hit nebo struct s hit=false.
  • jolt_raycast_all() vrací hits seřazené podle distance.
  • Vrací se nejvýše jeden nejbližší hit pro každé body a celkem nejvýše 256 hits.
  • Sensory jsou zahrnuté, pokud je nevyloučí vrstva nebo ignored body.
  • Mesh raycasts ignorují back faces.
  • Hit obsahuje body, body_handle, entity, position, normal, fraction, distance, error_code a error_message.

Příklad#

GML
var query = {
    layers: [world_layer, trigger_layer],
    ignore: player_body
};

var hits = jolt_raycast_all(0, 0, 2, 20, 0, 2, query);

Low-Level / Advanced API#

GML
jolt_world_raycast_filtered(world, ox, oy, oz, dx, dy, dz,
    max_distance, layer_mask=0, ignore_body=0)
jolt_world_raycast_all(world, ox, oy, oz, dx, dy, dz,
    max_distance, layer_mask=0, ignore_body=0)
jolt_world_constraint_set_collision_enabled(world, constraint, enabled)
jolt_world_constraint_get_collision_enabled(world, constraint)

Low-level raycasts používají origin + direction + maximum distance místo dvou endpoints.