Physical Controls from Blender
Author all nine physical controls in Blender 0.31.1 and instantiate them on an existing body.
JoltPhysics Asset Editor 0.31.1 · verified against project sources on 27 September 2026.
Blender workflow#
Select the Configuration Root, then Create → Physical Controls or Shift+A → JoltPhysics. All nine control types use the LOGIC icon. Set a unique Key, mounting position/rotation, physical dimensions, mass and supported behavior. Keep scale at 1; use the explicit dimension fields instead. UUID and Object Name are in Technical Info.
The yellow wireframe represents physical moving geometry. Selected elements additionally show travel, limits and detents; invalid elements are red and orphans orange. Physical Controls has its own Authoring Visibility switch. Hidden controls still validate and export. Ownership, Assign, Duplicate, cascade deletion, Undo/Redo and .blend persistence follow the existing authoring workflow.
Initial pose, preview and return#
| Field / operation | Meaning and validation |
|---|---|
| Initial Value / Initial Angle | Actual construction pose for types that expose it; exported. |
| Preview Movement / Position / Phase / X/Y | Editor display only; never changes export or simulates physics. |
| Auto Return + Return Value / X/Y | A motor moves toward this target during simulation; the target is not a starting pose. |
Quick start#
Export Jolt JSON and add it to GameMaker Included Files. The example assumes a successfully started world, a live machine_body, and an authored Lever with Key lift_lever. Read inputs after the central physics update; do not advance the world separately for every control.
// Create
var asset = jolt_asset_load("machine.jolt.json");
lever = undefined;
if (!is_undefined(asset)) {
lever = jolt_asset_create_control(asset, "lift_lever", machine_body);
}
if (is_undefined(lever)) show_debug_message(jolt_get_error_message());
else {
lever.set_auto_return(true);
lever.set_target(0.5);
}
// Step, after jolt_update()
if (!is_undefined(lever) && lever.is_valid()) {
var lift_value = lever.get_value();
// Map lift_value to your gameplay.
}Choose a control#
- Control Button
- Control Lever
- Control Knob
- Control Slider
- Control Hand Wheel
- Control Joystick
- Control Pedal
- Control Crank
- Control Pull Handle
Simulation, rendering and lifetime#
Use the existing jolt_update() loop, then read the control's physical state. Drive your visual model with control.get_transform() or the existing control rendering API. The asset helper creates the same JoltControl bodies and constraints as the direct factory; it does not render your model or assign gameplay actions. Each creation is independent.
control.destroy() removes the mechanism and preserves its parent. Parent destruction and jolt_stop() clean up attached controls. Use managed lifecycle calls. No additional native bridge change is required by the Blender controls integration; use the matching current GML loader and jolt_asset_controls scripts.
Debug#
jolt_debug_enable(true);
jolt_debug_set(JOLT_DEBUG_SHAPES, true);
jolt_debug_set(JOLT_DEBUG_CONSTRAINTS, true);
// Draw after setting the 3D camera:
jolt_debug_draw();Control geometry and joint guides use muted gold. Lever limit arcs now align with the visible neutral rod and follow the live hinge frame, including rotated/moving parents. This debug correction does not change physical angles, limits or motor behavior. Hand Wheel shows spokes/marker; Joystick shows the tilt cone.