První funkční scéna
Zkopírujte tyto eventy do jednoho controlleru a spusťte 1kg Box proti statickému targetu.
Předpokladem je projekt s importovaným JoltPhysics rozšířením a aktuální DLL. Příklad používá metry, Z nahoru a 60Hz fyziku. Penetrator má rozměry 0,10 × 0,10 × 0,80 m, Tip na spodním čele a náklon 20°. Nízký odpor 0,1 N je zvolený pro snadno pozorovatelný první test, nikoli jako univerzální materiál.
1. Create event#
// Create event — one controller owns the physics world.
if (!jolt_start({ gravity_z: -9.81, fixed_dt: 1/60 })) {
show_debug_message(jolt_get_error_message());
exit;
}
target = jolt_box_create_static(0, 0, 0, 2, 2, 0.4);
target_penetration = jolt_penetration_target(target);
target_penetration.set_forward_force(0.1);
target_penetration.set_backward_force(0.1);
target_penetration.set_max_depth(0.2);
if (!target_penetration.set_enabled(true)) {
show_debug_message(jolt_get_error_message());
exit;
}
penetrator = jolt_box_create_dynamic(0, 0, 1.6, 0.10, 0.10, 0.80, { mass: 1 });
penetrator.set_rotation(0, 20, 0);
tip = jolt_penetrator_tip(penetrator);
tip.set_local_position(0, 0, -0.4);
tip.set_local_axis(0, 0, -1);
tip.set_max_angle(40);
tip.set_max_insertion(0.2);
if (!tip.set_enabled(true)) show_debug_message(jolt_get_error_message());
jolt_debug_enable(true);Rozměry Boxu jsou celé rozměry. Target výšky 0,4 m se středem z=0 má horní povrch z=0,2. Střed penetratoru z=1,6 odpovídá nominálnímu 1m pádu nenakloněného Tipu; po náklonu je skutečná mezera Tipu mírně větší. set_rotation(0,20,0) používá stupně.
2. Step event#
// Step event — call jolt_update once for the entire world.
if (is_struct(tip) && tip.is_valid()) {
if (keyboard_check(vk_space)) {
penetrator.add_force(0, 0, 30);
}
}
jolt_update(delta_time / 1000000);
// Drain centrally, then dispatch each snapshot to gameplay systems.
var batch = jolt_penetration_events();
if (is_struct(batch)) {
for (var i = 0; i < array_length(batch.events); ++i) {
var event = batch.events[i];
if (event.type == JoltPenetrationEvent.Start) {
show_debug_message("Entry: " + string(event.snapshot.target_handle));
}
if (event.type == JoltPenetrationEvent.Extracted) {
show_debug_message("Fully extracted");
}
}
}Nechte těleso nejprve spadnout bez držení mezerníku. Po vstupu držte mezerník: síla 30 N ve světovém směru +Z má v této scéně dostatečnou složku proti ose kanálu a vytahuje penetrator. Pro obecně orientovaný target směřujte sílu proti snapshot.axis. Po úplném vytažení musí celé těleso uvolnit target, než se Tip znovu připraví. Pokud váš projekt již má centrální jolt_update nebo čte eventy, vložte odpovídající část tam a neduplikujte ji.
3. Zobrazení#
// Draw GUI event
jolt_penetration_debug_text();
// In your existing 3D Draw pass, after setting its view/projection:
jolt_debug_draw(JOLT_DEBUG_SHAPES | JOLT_DEBUG_PENETRATION);Fyzikální helper nevytváří renderovaný model ani kameru. Geometrický debug vložte do existujícího 3D vykreslování podle kapitoly Debug Draw; textový přehled funguje v Draw GUI. Sledujte entered, state a depth. Pro běžný model použijte transform penetrator body, nikoli pozici lokálního Tipu.
4. Clean Up event vlastníka světa#
jolt_stop();