# How to rotate an object to face the direction it is slerping?

Currently I’m writing a space station game that has ships flying around the station, following a set of waypoints, and then ultimately ending up at the front of the station ready to perform the next, yet-to-be-written docking function.

As of now, I’m able to have the object follow the waypoints by slerping between them, but I wanted to have the ships facing the direction they are moving. I was able to use transform.LookAt() to make the object face the next waypoint, however this results in a hard snap in the direction of the next waypoint.

I assume I’ll have to use an additional slerping function to do this but I’m not sure how.

This is the code that I’m using for my MoveShip script
using UnityEngine;
using System.Collections;

public class MoveShip : MonoBehaviour {

[HideInInspector]
public GameObject[] waypoints;
private int currentWaypoint = 0;
private float lastWaypointSwitchTime;
public float speed = 1.0f;

public Vector3 Velocity;
public Vector3 MoveDirection;
public Vector3 Target;
public Vector3 endPointDirection;
// Use this for initialization
void Start () {
lastWaypointSwitchTime = Time.time;
}

// Update is called once per frame
void Update () {

Vector3 startPosition = waypoints[currentWaypoint].transform.position;
Vector3 endPosition = waypoints[currentWaypoint + 1].transform.position;

float pathLength = Vector3.Distance(startPosition, endPosition);
float totalTimeForPath = pathLength / speed;
float currentTimeOnPath = Time.time - lastWaypointSwitchTime;
gameObject.transform.position = Vector3.Slerp(startPosition, endPosition, currentTimeOnPath / totalTimeForPath);

if (gameObject.transform.position.Equals(endPosition))
{

if (currentWaypoint < waypoints.Length - 2)
{

currentWaypoint++;
lastWaypointSwitchTime = Time.time;

}
else
{

return;
}

}

transform.LookAt(endPosition);
//gameObject.transform.position = Vector3.Slerp(startPosition, endPosition, currentTimeOnPath / totalTimeForPath);
//transform.rotation = Quaternion.Slerp(transform.rotation, _lookRotation, currentTimeOnPath / totalTimeForPath);

}
}

Quaternion.Lerp can help you here. Just put this code in Update and the ship will always look at it’s “target”:

//Get the vector between the transform and the target, calculate the rotation needed
//to "look at" it, and interpolate from the current rotation to the desired one
Vector3 relativePos = target.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(relativePos);
transform.rotation = Quaternion.Lerp(transform.rotation,
rotation, Time.deltaTime * RotationSpeed);