找回密码
 注册帐号

扫一扫,访问微社区

阿升哥哥 unity3d Vector3.Lerp解析

7
回复
2061
查看
[ 复制链接 ]
排名
4538
昨日变化

15

主题

55

帖子

1330

积分

Rank: 9Rank: 9Rank: 9

UID
122233
好友
8
蛮牛币
898
威望
0
注册时间
2015-9-11
在线时间
373 小时
最后登录
2019-8-14

专栏作家

2016-7-10 22:11:05 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 阿升哥哥 于 2016-7-10 22:13 编辑

Vector3.Lerp:http://www.ceeger.com/Script/Vector3/Vector3.Lerp.html
手册中描述的不是很详细,什么叫“按照数字t在from到to之间插值”???t代表什么鬼?还得自己测试一下才知道

我以前这样用过:
from.position = Vector3.Lerp(from.position, to.position, Time.deltaTime);
或者想要快一些我就这样:
from.position = Vector3.Lerp(from.position, to.position, Time.deltaTime * 2f);
不知道大家有没有像我这样用过!第三个参数取值范围0~1,其实就是距离百分比,比如填0.5f,那么就是取A点到B点的中间位置
如果像我上面那种方法去使用,就会导致物体在移动的时候会越来越慢
假设A点到B点距离是10,第三个参数t我填0.5f,那么插值一次后距离就减少了一半,在执行一次,又减少了一半距离
当然,如果需求就是这样的话直接用就行了,但是如果需求是匀速平滑到某点,这咋办呢?
既然都知道第三个参数其实就是距离百分比了,那我们自己算一下距离百分比不就行了吗?
[C#] 纯文本查看 复制代码
public Transform from;
    public Transform to;
    public float mMoveTime;
    private Vector3 mStartPos;
    private float t;

    private bool mIsPlay = false;

    void Update()
    {
        if (!mIsPlay)
            return;

        t += 1f / mMoveTime * Time.deltaTime;
        from.position = Vector3.Lerp(mStartPos, to.position, t);
    }
    
    void OnGUI()
    {
        if(GUI.Button(new Rect(100,100,100,30),"play"))
        {
            mStartPos = from.position;
            mIsPlay = true;
        }
    }
看了上面的介绍,相信对Vector3.Lerp有些了解了!
如果我想要他移动到指定位置后继续保持匀速运动怎么做呢?也许你会说用Vector3.Lerp完全可以啊!
可是你别忘了,它的取值范围是0~1,也就是说>1的值它会忽略掉,我测试了一下的确如此
那看来只能自己实现了!这其实很简单,下面我们就来自己实现一遍
[C#] 纯文本查看 复制代码
void Update()
    {
        if (!mIsPlay)
            return;

        t += 1f / mMoveTime * Time.deltaTime;
        //from.position = Vector3.Lerp(mStartPos, to.position, t);
        from.position = mStartPos + (to.position - mStartPos) * t;
    }
回复

使用道具 举报

7日久生情
2988/5000
排名
671
昨日变化

7

主题

492

帖子

2988

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
46577
好友
1
蛮牛币
3609
威望
0
注册时间
2014-9-24
在线时间
1175 小时
最后登录
2020-9-23
2016-7-11 10:39:44 显示全部楼层
本帖最后由 llupll 于 2016-7-11 11:01 编辑

我看少了,不好意思
回复 支持 反对

使用道具 举报

7日久生情
2988/5000
排名
671
昨日变化

7

主题

492

帖子

2988

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
46577
好友
1
蛮牛币
3609
威望
0
注册时间
2014-9-24
在线时间
1175 小时
最后登录
2020-9-23
2016-7-11 11:45:46 显示全部楼层
lerp好像是自带缓动缓出效果,如果自己实现的话,那么不就少了这些效果么
回复 支持 反对

使用道具 举报

7日久生情
3274/5000
排名
495
昨日变化

3

主题

293

帖子

3274

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
127556
好友
0
蛮牛币
7486
威望
0
注册时间
2015-11-2
在线时间
1446 小时
最后登录
2020-9-3
2016-7-11 15:44:26 显示全部楼层
如果每次都是减少固定百分比,那么什么时候才能到达终点呢。
回复 支持 反对

使用道具 举报

排名
2735
昨日变化

48

主题

367

帖子

2937

积分

Rank: 9Rank: 9Rank: 9

UID
12507
好友
19
蛮牛币
6664
威望
0
注册时间
2014-1-14
在线时间
727 小时
最后登录
2020-9-28

专栏作家

2016-7-12 08:08:27 显示全部楼层
过来溜达下,匀速  可以用  Vector3.MoveTowards。
Lerp 只是 先慢 到快 最后慢的 过程。
当然MoveTowards 仅仅是 匀速 方向,所以到终点的时候,你要判定下。 用碰撞 或 Distance距离。
回复 支持 反对

使用道具 举报

排名
58
昨日变化

3694

主题

4568

帖子

1万

积分

Rank: 9Rank: 9Rank: 9

UID
287
好友
45
蛮牛币
3906
威望
30
注册时间
2013-6-9
在线时间
2198 小时
最后登录
2020-5-28

七夕浪漫情人活力之星原创先锋认证开发者

QQ
2016-7-13 09:46:53 显示全部楼层
之前用了Lerp实现了移动功能。
回复 支持 反对

使用道具 举报

排名
3521
昨日变化

6

主题

33

帖子

882

积分

Rank: 9Rank: 9Rank: 9

UID
103529
好友
10
蛮牛币
1317
威望
0
注册时间
2015-6-18
在线时间
305 小时
最后登录
2019-6-11

专栏作家

QQ
2016-7-14 15:49:59 显示全部楼层
四元素球面插值,可以达到平滑效果,并且可以避免万向锁问题。
回复 支持 反对

使用道具 举报

5熟悉之中
897/1000
排名
2924
昨日变化

0

主题

182

帖子

897

积分

Rank: 5Rank: 5

UID
156196
好友
0
蛮牛币
781
威望
0
注册时间
2016-7-10
在线时间
209 小时
最后登录
2018-11-5
2016-7-23 22:31:23 显示全部楼层
插值运算是根据from和to之间的差值乘以你的t然后加上from得到的值,可以试几次就会懂了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

蛮牛教育10.1大促销!全站6折扣!