Quick answer: Godot 4 RigidBody3D ignoring apply_central_impulse after set_position in the same frame? Setting position teleports the body and clears velocity - apply impulse after a deferred call.

Cannon teleports a projectile to the muzzle then applies launch impulse. Projectile drops straight down; impulse was discarded.

Defer the impulse

projectile.position = muzzle
projectile.call_deferred("apply_central_impulse", force)

Position applies this tick; impulse on the next. Engine resolves cleanly.

Or use set_linear_velocity

Skip the impulse; set velocity directly after position. Bypasses the teleport-clears-impulse interaction.

Spawn-with-velocity helper

Wrap teleport + velocity in one helper. The order dance is hidden.

“set_position is a teleport. Teleports reset physics integrators.”

If you spawn moving projectiles, the order is: place, defer-impulse. Or spawn-with-velocity in a helper. Either way, document.

Related reading