球面線性插值(Spherical linear interpolation,通常簡稱Slerp),是四元數的一種線性插值運算,主要用於在兩個表示旋轉的四元數之間平滑差值。(wiki)
cos Ω = p0 ∙ p1
當Ω → 0時,退化爲線性插值。
在Unity中,文檔說明如下
Vector3.Slerp
Spherically interpolates between two vectors.
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
.
t
is clamped between [0...1]. See Also: Lerp function.
using UnityEngine;
using System.Collections;
public class Example : 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;
}
}