Blender Physical Controls

Hand Wheel

Unlimited rotation around local Z; zero marker +Y.

JoltPhysics Asset Editor 0.31.1 · verified against project sources on 27 September 2026.

Blender setup#

Available since addon 0.19.0; supported by 0.31.1. Add this type under Physical Controls, assign its Key and keep scale 1.

Field / operationMeaning and validation
Geometry and pivotSolid cylinder with Radius and full Depth. The three spokes and marker are visual guides; this is not a hollow ring.
MotionUnlimited rotation around local Z; zero marker +Y.
Initial state and readingMount rotation defines the initial physical pose; the logical rotation counter starts at zero. Preview Phase 0..1 only previews one turn.
Limits and capabilitiesNo Min/Max Angle, Initial Angle, Auto Return or scalar target in the asset. Use resistance and periodic detents; existing runtime speed/position/phase motors and absolute detents remain available.
JSON v3size:{radius,depth}, periodic_detents?

Create from the asset#

The following example assumes loaded asset data, a live machine_body and an authored wheel named control_main. Geometry overrides are optional; omit settings to use Blender defaults.

GML
var settings = jolt_asset_control_settings();
settings.set_radius(0.30);
settings.set_depth(0.08);
settings.set_mass(1.5);
settings.set_periodic_detents({count:12});
control = jolt_asset_create_control(asset, "control_main", machine_body, settings);
if (is_undefined(control)) show_debug_message(jolt_get_error_message());
// Step, after the physics update:
if (!is_undefined(control) && control.is_valid()) {
    var angle = control.get_angle();
    var turns = control.get_turns();
    var phase = control.get_phase();
    var speed = control.get_speed();
}

Live behavior#

get_angle() returns cumulative degrees, get_turns() signed completed turns, get_phase() phase 0..1 and get_speed() degrees per second. Use set_resistance, set_locked and set_periodic_detents; false disables periodic detents. Scalar Auto Return and set_target are unsupported for this type.

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.