Quick answer: Godot 4 RigidBody3D set linear_velocity in world space but body's rotation is local? Velocity is world-frame by default; apply via local-relative for rotation-aware.

Carried object: rotated 90 degrees; set 'forward' velocity; it flies sideways relative to current rotation.

Transform to world space

linear_velocity = global_basis * local_velocity

Convert local-frame intent to world-frame. Direction follows rotation.

Or use apply_impulse with local

apply_impulse takes a world vector; pre-transform if needed.

Audit velocity calls

Each velocity assignment: world or local? Mismatch = the rotation bug.

“Velocity is world by default. Local conversion is explicit.”

If your game has rotated bodies with velocity, document the convention. World vs local mixing is the bug source.

Related reading