My player was changing direction too slowly. For example, walking left and right looked like this:
My solution was to look at not motion.x and .z times -speed, but times -speed * 100, or some other large number. This makes the character look at a far away point in the direction he is moving, and results in more instant turning like this:
There’s a sweet spot where he’s doing a little bit of a pivot when changing direction, rather than unrealistically snapping 180 degrees.
My final code looks like this:
func face_forward():
var forward = motion * Vector3(-1, 0, -1) * speed * 5
if forward.length() > EPSILON:
look_at(forward, UP)