+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 by (224 points)

2 Answers

+1 vote
Best answer

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!

0 votes

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)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.