›
Blender Physical Controls

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 / operationMeaning and validation
Initial Value / Initial AngleActual construction pose for types that expose it; exported.
Preview Movement / Position / Phase / X/YEditor display only; never changes export or simulates physics.
Auto Return + Return Value / X/YA 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.

GML
// 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#

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#

GML
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.