1.Vector3.Slerp是指球形插值。官网用法如下
- //在日出和日落之间动画弧线
- usingUnityEngine;
- usingSystem.Collections;
- publicclass example : MonoBehaviour
- {
- publicTransform sunrise;
- publicTransform sunset;
- voidUpdate()
- {
- //弧线的中心
- Vector3 center = sunrise.position + sunset.position * 0.5f;
- //向下移动中心,垂直于弧线
- center -= newVector3(0, 1, 0);
- //相对于中心在弧线上插值
- Vector3 riseRelCenter = sunrise.position - center;
- Vector3 setRelCenter = sunset.position - center;
- transform.position = Vector3.Slerp(riseRelCenter,
- setRelCenter, Time.time);
- transform.position += center;
- }
- }
对于此例子进行解析,插值的时候需要设定圆心。可按照上面的固定模式来,而圆心的位置可以根据自己的情况去修改 12-14行代码。
2.另外需要注意的是最后一步位置值又加了一次圆心坐标。这里是为了将插值偏移到空间中圆心的周围。
如果没有这一步,会因为riseRelCenter,setRelCenter只表示方向,而将插值算到原点周围。
所以最后一步要注意。
3.通过测试
带循环时
for(int j = 0; j < 10; j++)
{
Vector3 center = (pos1 + pos2) * 0.5f;
center -= new Vector3(0, 0.5f, 0);
Vector3 vecA = pos1 - center;
Vector3 vecB = pos2 - center;
Vector3 drawVec = Vector3.Slerp(vecA, vecB, 0.1f * j);
if(j == 4)
print(drawVec.ToString("0.0000"));
}
还有不带循环时
Vector3 center = (pos1 + pos2) * 0.5f;
center -= new Vector3(0, 0.5f, 0);
Vector3 vecA = pos1 - center;
Vector3 vecB = pos2 - center;
Vector3 drawVec = Vector3.Slerp(vecA, vecB, 0.1f * 4);
print(drawVec.ToString("0.0000"));
结果在0.4 的时候是一致的。即我们可以根据情况直接选取某些单独的值,这里跟mathf.Lerp有些区别。