zoukankan      html  css  js  c++  java
  • 对Vector3.Lerp 插值的理解

    有时,我们在做游戏时会发现有些跟随动作不够圆滑或者需要一个缓冲的效果,这时,一般会考虑到插值。所以对插值的理解是必需的。(比如摄像机跟随主角)

    插值是数学上的一个概念,在这里用公式表示就是:from + (to - from) * t;这也就是Lerp的返回值(用这个公式分别算出x,y,z)。

    static function Lerp (from : Vector3, to : Vector3, t : float) : Vector3 

    from 是起始的位置,to是目标位置,按照数字t在from到to之间插值。这句话比较难理解,下面举个例子。

    这和我们用公式算出来的如出一辙。现在我们再看一个具体的例子

    //在1秒时间动画位置移动从from开始到to结束。(这是官方的例子)

    using UnityEngine;
    using System.Collections;
    public class example : MonoBehaviour {
        public Transform start;
        public Transform end;
        void Update() {
            transform.position = Vector3.Lerp(start.position, end.position, Time.time);
        }
    }

    位置移动从start开始到end结束,这好理解,但是为什么是1秒呢?

    Time.time是从0开始随时间增加的。

    例1的t是一个固定的值,返回一个固定的向量。此时t是变量,在不断增加。那么:

    当Time.time = 0时--->transform.position = start.position,位置没有变化;

    当Time.time从0趋向于1时--->transform.position 不断接近start.position,该脚本是挂在start物体上的,所以start会不断靠近end。

    那么问题来了,当Time.time>1的时候,会怎么样呢?额(⊙o⊙)…我们说不会。

    由上面的公式from + (to - from) * t可知,当t=1时,to - from = 0,此时t就无效了。

    例1是从静态角度看,例2是从动态角度看的(两个变量,一个是时间在变化,一个是位置在变化)。

    想一想例2,如果不是Time.time,而是0.5,会怎么样?(只看一个变量)

    由图易知:A物体会不断以0.5的比例无限接近于B

     

  • 相关阅读:
    文件字符输入输出流
    ava.io.InputStream & java.io.FileInputStream
    java.io.OutputStream & java.io.FileOutputStream
    java.lang.String & java.lang.StringBuilder
    文件过滤器
    递归
    原生camera应用 保存设置界面参数方法
    android 获取调用camera service的进程
    linux 查找,替换 常用命令
    将一个项目修改记录提交另外一个项目-> patch获取提交记录,repo 提交代码
  • 原文地址:https://www.cnblogs.com/unity3ds/p/5737183.html
Copyright © 2011-2022 走看看