Unity球形插值,官方有个太阳升降的例子:
http://docs.unity3d.com/ScriptReference/Vector3.Slerp.html
一开始主观认为这个球形插值Slerp应该本来就是两点之间画弧线,貌似很简单,但该官方例子实现太阳升降却写得很复杂,虽没几行代码却不明白做了些什么事- -
向量即既有长度同时有方向,看介绍可以知道,相比线性插值Lerp将Vector3当作空间的点,球形插值Slerp则是将Vector3当作方向,返回的Vector3的长度是两点之前的距离插值,方向是两个向量之间的夹角度数的插值。
注意这里的“夹角度数”,我觉得理解这个夹角度数比较重要,不然仅仅靠Slerp是在两向量之间做距离插值的同时也对方向做插值还是不太好理解Slerp的最终效果会是个什么样的弧线。
为了能形象的理解Slerp是怎样在做“插值”,我将每一帧的状态都以图形的方式画在了场景中,代码如下,仅仅在官方代码基础上增加了画图功能:
1 voidStart ()2 {3 startTime =Time.time;4 DrawLine (sunrise.position, Color.red);5 DrawLine (sunset.position, Color.cyan);6 StartCoroutine (UpdateLine ());7 }8
9 IEnumerator ShowSlerp ()10 {11 while (Vector3.Distance (transform.position, sunset.position) > 0.05f)12 {13 Vector3 center = (sunrise.position + sunset.position) * 0.5F;14 DrawLine (ce