Spherically interpolates between two vectors.
Interpolates between from
and to
by amount t
. The difference between this and linear
interpolation (aka, "lerp") is that the vectors are treated as directions rather than points
in space. The direction of the returned vector is interpolated by the angle and its
magnitude is interpolated between the magnitudes of from
and to
.
// Animates the position in an arc between sunrise and sunset. var sunrise : Transform; var sunset : Transform; // Time to move from sunrise to sunset position, in seconds. var journeyTime = 1.0; // The time at which the animation started. private var startTime: float; function Start() { // Note the time at the start of the animation. startTime = Time.time; } function Update () { // The center of the arc var center = (sunrise.position + sunset.position) * 0.5; // move the center a bit downwards to make the arc vertical center -= Vector3(0,1,0); // Interpolate over the arc relative to center var riseRelCenter = sunrise.position - center; var setRelCenter = sunset.position - center; // The fraction of the animation that has happened so far is // equal to the elapsed time divided by the desired time for // the total journey. var fracComplete = (Time.time - startTime) / journeyTime; transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete); transform.position += center; }
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Transform sunrise; public Transform sunset; public float journeyTime = 1.0F; private float startTime; void Start() { startTime = Time.time; } void Update() { Vector3 center = (sunrise.position + sunset.position) * 0.5F; center -= new Vector3(0, 1, 0); Vector3 riseRelCenter = sunrise.position - center; Vector3 setRelCenter = sunset.position - center; float fracComplete = (Time.time - startTime) / journeyTime; transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete); transform.position += center; } }
import UnityEngine import System.Collections public class ExampleClass(MonoBehaviour): public sunrise as Transform public sunset as Transform public journeyTime as float = 1.0F private startTime as float def Start() as void: startTime = Time.time def Update() as void: center as Vector3 = ((sunrise.position + sunset.position) * 0.5F) center -= Vector3(0, 1, 0) riseRelCenter as Vector3 = (sunrise.position - center) setRelCenter as Vector3 = (sunset.position - center) fracComplete as float = ((Time.time - startTime) / journeyTime) transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete) transform.position += center