查看: 2218|回复: 0
打印 上一主题 下一主题

[经验分享] Vector3.Slerp API示例解析

[复制链接]

1

主题

0

听众

19

积分

设计初学者

Rank: 1

纳金币
3
精华
0
跳转到指定楼层
楼主
发表于 2015-4-16 08:49:45 |只看该作者 |倒序浏览
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;
    }
}
疑惑主要是在Update()里面的方法如何实现弧线运动,原来只是天真的以为只要使用了Slerp函数,Unity就会自动进行弧线插值。其实不然,如果只是用transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete)控制运动的话,那么物体在两个点之间只是在做普通的直线运动。
那么,接下来就分享一下,通过画图展示我对此算法的理解。



我们通过构造一个圆来分析
Center为sunrise.position和sunset.position的中心点
center -= new Vector3(0, 1, 0);将center点下移动到圆心O点
Vector3 riseRelCenter = sunrise.position - center;
Vector3 setRelCenter = sunset.position - center;
将起始点和结束点同样分别向下移动到E、F
transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, fracComplete);
从向量OE旋转到向量OF,进行球形插值,我的理解是插值轨迹为弧OEF(需要说明的是O并不是弧OEF的所在圆圆心。弧OEF为弧OAB向下平移所得)
transform.position += center; 将弧OEF按vector3(0,1,0)向上平移后,运动轨迹就是图示中最上面的圆弧,为物体运动的最终轨迹。


这里我们考虑一下,当修改vector(0,1,0)中y的大小时,会改变运动轨迹的圆心位置。我们可以通过辅助圆分析得到以下结论:当y的值越大时,弧度越小;相反减小y的值,弧度增加。



分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-21 04:34 , Processed in 0.088860 second(s), 33 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部