First off, looking at your code I think you're confusing radians with degrees (which I did in my first post!). [tt]set_rot()[/tt] takes the angle in radians. Passing 135 radians to [tt]set_rot()[/tt] when the turn is instanteous is no big deal. But once you slow the turn down, what you've got is 21.4 turns before the sprite settles at the desired orientation if rotating from 0.0 (one turn being 2PI: 135 / 2PI = 21.4859). If you want to use degrees rather than radians you can use [tt]set_rotd([/tt]) and [tt]get_rotd()[/tt]. Since Godot tries to use artist friendly units you'd think [tt]set_rot()[/tt] would be in degrees with the option to use radians. I guess it's the other way round as programmers expect to work with radians, so it's easy to thrown by this. Anyway, Interpolating rotation in 2D is a real pain, thanks to angles wrapping round at 2PI and trying to find the shortest direction to turn in. Here's my solution:[code]extends KinematicBody2D# This is a simple collision demo showing how# the kinematic controller works.# move() will allow to move the node, and will# always move it to a non-colliding spot,# as long as it starts from a non-colliding spot too.# Member variablesvar sprite = find_node("bird")# Member constconst MOTION_SPEED = 120 # Pixels/secondconst MODE_DIRECT = 0const MODE_CONSTANT = 1const ROT_SMOOTHING = 0.1 func lerp_angle(from, to, t): if abs(to - from) > 180: to = -(360 - to) return lerp(from, to, t) func fixed_process(delta): var motion = Vector2() var rotated = Vector2() if (Input.is_action_pressed("move_forward")): motion += Vector2(0,-1) var rot = get_node("sprite").get_rotd() var new_rot = lerp_angle(rot, 0.0, ROT_SMOOTHING) get_node("sprite").set_rotd(new_rot) if (Input.is_action_pressed("move_down")): motion += Vector2(0,1) var rot = get_node("sprite").get_rotd() var new_rot = lerp_angle(rot, 180.0, ROT_SMOOTHING) get_node("sprite").set_rotd(new_rot) if (Input.is_action_pressed("rotate_left")): motion += Vector2(-1,0) var rot = get_node("sprite").get_rotd() var new_rot = lerp_angle(rot, 90.0, ROT_SMOOTHING) get_node("sprite").set_rotd(new_rot) if (Input.is_action_pressed("rotate_right")): motion += Vector2(1,0) var rot = get_node("sprite").get_rotd() var new_rot = lerp_angle(rot, -90.0, ROT_SMOOTHING) get_node("sprite").set_rotd(new_rot) motion = motion.normalized()MOTION_SPEEDdelta motion = move(motion) # Make character slide nicely through the world var slide_attempts = 4 while(is_colliding() and slide_attempts > 0): motion = get_collision_normal().slide(motion) motion = move(motion) slide_attempts -= 1func ready(): set_fixed_process(true)[/code]There are a couple of cases where this doesn't work well (switching quickly between diagonal movements in opposite directions). The best solution is using complex numbers (2D quaterions, spinors), but this a bit above my maths knowledge. Hope this helps! :)