+1 vote

Hi guys, I wanna make my character face the direction to where he is heading.
Here's the script:

``````public void Move()
{

velocity = new Vector3();
if (Input.IsActionPressed("right"))
velocity.x += 1;
if (Input.IsActionPressed("left"))
velocity.x -= 1;
if (Input.IsActionPressed("down"))
velocity.z += 1;
if (Input.IsActionPressed("up"))
velocity.z -= 1;
velocity = velocity.Normalized() * speed;
}

public override void _PhysicsProcess(float delta)
{
Move();
MoveAndSlide(velocity,Vector3.Up,true,3);
``````
in Engine

+1 vote

Make the character MeshInstance(s) children of a spatial and use `look_at()`

``````character_spatial.look_at(transform.origin + velocity, Vector3.UP)
``````
by (3,199 points)
selected by

Unfortunately, it doesn't work, probably because it is a Sprite3D.
In 2D there is this simple method:

``````sprite.rotation = velocity.Angle();
``````

In 3D it's another story since it uses a Vector3 as rotation, is there any ways I can mimic the same thing?

2D rotation is a float, 3D rotation uses Basis which can be set by a basis, quaternion or Vector3. There isn't a 3D method similar to `angle()`. `look_at()` is the easiest method to use here otherwise you need to get a target rotation and rotate to it. The only other workaround I can think of (but can't guarantee if it'll work) is cheat using `Vector2(Vector3.x, Vector3.z).angle()` and set `rotation_degrees.y` to the returned float.

In this case your Vector3 will be the `velocity` variable.

Looks like setting the rotation.z to `new Vector2(veclocity.x, velocity.z).angle()` does the trick. Thanks!

Just replying because i landed here from google and more people may too:

``````    var lookdir = atan2(-velocity.x, -velocity.z)
rotation.y = lookdir
``````

works perfectly if you only want the character to rotate "left/right"

Pay attention to the minus in the the "velocity.x" and "velocity.z", no sure why but they need to be negative or else the model will face backwards.

You can also slap some more code to polish this a bit more like:

``````if velocity != Vector3.ZERO:
var lookdir = atan2(-velocity.x, -velocity.z)
rotation.y = lerp(rotation.y, lookdir, 0.1)
``````
by (213 points)