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#
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#
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#
jolt_raycast(x1, y1, z1, x2, y2, z2, filter)
jolt_raycast_all(x1, y1, z1, x2, y2, z2, filter)| Forma filteru | Význam |
|---|---|
| undefined | Všechny vrstvy, žádné ignorované body |
| JoltLayer | Pouze daná vrstva |
| [layer_a, layer_b] | Sjednocení platných vrstev |
| numeric mask | Raw 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#
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#
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.