Vector3.Lerp

article/2025/10/17 19:06:35

Unity3D中的线性插值Lerp()函数解析

在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间、两个向量之间、两个浮点数之间、两个颜色之间,其函数原型如下:

Material.Lerp 插值

function Lerp(start : Material, end : Material, t : float) : void

在两个材质之间插值

 

Vector2.Lerp 插值

static functionLerp (from : Vector2, to : Vector2, t : float) : Vector2

两个向量之间的线性插值。按照数字t在form到to之间插值。

t是夹在0到1之间。当t=0时,返回from。当t=1时,返回to。当t=0.5时放回from和to之间的平均数。

Vector3.Lerp 插值

static functionLerp (from : Vector3, to : Vector3, t : float) : Vector3

两个向量之间的线性插值。按照数字t在from到to之间插值。

Vector4.Lerp 插值

static functionLerp (from : Vector4, to : Vector4, t : float) : Vector4

两个向量之间的线形插值。按照数字t在from到to之间插值。t是夹在[0...1]之间的值。,当t = 0时,返回from。当t = 1时,返回to。当t = 0.5 返回from和to的平均数。

 

Mathf.Lerp 插值

static functionLerp (from : float, to : float, t : float) : float

基于浮点数t返回a到b之间的插值,t限制在0~1之间。当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。

 

Color.Lerp 插值

static functionLerp (a : Color, b : Color, t : float) : Color

通过t在颜色a和b之间插值。

"t"是夹在0到1之间的值。当t是0时返回颜色a。当t是1时返回颜色b。

 

插值,从字面意思上看,就是在其间插入一个数值,这种理解是否正确呢?我们先从最简单的浮点数插值函数来分析:

Mathf.Lerp 插值

static functionLerp (from : float, to : float, t : float) : float

基于浮点数t返回a到b之间的插值,t限制在0~1之间。当t = 0返回from,当t = 1 返回to。当t = 0.5 返回from和to的平均值。

 

首先,我们来做一个试验,启动Unity3D,任建一个脚本文件,在其Start()中输入内容如下:

voidStart () {

        print(Mathf.Lerp(0.0f,100.0f, 0.0f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.1f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.2f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.3f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.4f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.5f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.6f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.7f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.8f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 0.9f).ToString());

        print(Mathf.Lerp(0.0f,100.0f, 1.0f).ToString());

       }

运行Unity,在控制台将打印出:


这个实验是在0到100之间插值,插入什么值,取决于第3个参数,从打印结果可看出,第3个参数是个比例因数,是0.1时表示0到100这个长度的十分之一,同理,0.2表示十分之二,依此类推。从这点上看来,我们起初从字面上所理解的插值就是插入一个数值是可以这样理解的。

如果我们把上面那个脚本里的插值函数里的第一个参数变为100.0f,第二个参数变为110.0f,第三个参数保持不变,大家想想其运行结果该是什么呢?可不要认为是0、1、2、3、4、5、6、7、8、9、10了哟,实际结果是100、101、102、103、104、105、106….,因插值是把值插在原来的两数之间,这说明这个函数首先是根据第三个参数所给定的比例算出净增量,再加上起始数,最终算出插值值的。

在Unity3D游戏开发中,应用最多的是Vector3.Lerp 向量插值,下面我们以此插值来猜推其内部实现机理以及一些应用。



如图,在空间中存在两点A(0,10,0)与B(10,0,-10),我们在A、B两点间插入一C点,假设C点的位置在AB的五分之二处,即AC/AB=0.4,根据相似图形对应边成比例的初中几何知识可知,在⊿ABO中AC/AB=OD/OB,同理在⊿OBF中OD/OB=OE/OF,所以AC/AB=OD/O=OE/OF = 0.4,则C点的X坐标值为:OE=0.4*OF=0.4*10=4。

根据上图,还可知ED/FB=0.4,所以C点的Z坐标值DE=0.4*BF=0.4*(-10)=-4。

C点的Y坐标值请看下图:


Lerp函数在游戏开发过程使用较多,在Unity的帮助文档里就有为我们列举了Vector3.Lerp的两个应用的例子,一个是在1秒时间动画位置移动从start.position开始到end.position结束:

using UnityEngine;

usingSystem.Collections;

public classexample : MonoBehaviour {

         public Transform start;

         public Transform end;

         void Update() {

                   transform.position =Vector3.Lerp(start.position, end.position, Time.time);

         }

}

另一个例子:

//像弹簧一样跟随目标物体

using UnityEngine;

usingSystem.Collections;

public classexample : MonoBehaviour {

         public Transform target;

         public float smooth = 5.0F;

         void Update() {

                   transform.position =Vector3.Lerp(transform.position, target.position, Time.deltaTime * smooth);

         }

}

这个例子中的transform.position是去跟随的那个物体的空间坐标,target.position是目标物体的空间坐标,整句的结果是让跟随物体的坐标不断地变化为它们两者之间的插值,然而随着时间的推移,第三个参数的值最终会为1,所以最终跟随物体的位置会与目标物体重合的。我们以前所玩的游戏中,主人公身上依附着一只宠物如鹰,主人公移动时,鹰会跟随着飞动,主人公移动得快它就飞行跟动得快,始终不会离开主人公,使用Lerp插值函数就可实现。






http://chatgpt.dhexx.cn/article/lXXeMKXB.shtml

相关文章

Unity 的Vector3.Project 和 Vector3.ProjectOnPlane

目录 1.public static Vector3 Project(Vector3 vector, Vector3 onNormal); 描述 : 代码: 效果: 结论: 2.public static Vector3 ProjectOnPlane(Vector3 vector, Vector3 planeNormal);返回向量在平面上的位置。 描述 …

Vector3——简单的3D向量类

参考资料:1、 [美] 邓恩(Dunn F.)著. 3D数学基础——图形设计与开发. 史银雪,陈洪,王荣静 译 清华大学出版社 p57-65 2、http://www.2cto.com/kf/201311/260139.html 编程环境 QT4.8.4 VS2010 本文用 C实现一个简单…

Unity Vector3.Dot(VectorA, VectorB)

Unity Vector3.Dot(VectorA, VectorB) Vector3.Dot(VectorA, VectorB) 等于 VectorA * VectorB。 而对于两个向量的乘积计算: VectorA * VectorB Ax * Bx Ay * By Az * Bz 例如: VectorA(1,2,3) * VectorB(4,5,6) 1*42*53*632 一般应用于判断飞行…

Unity - 优化 Vector3.ProjectOnPlane

文章目录 起因好奇绘制 Vector3.ProjectOnPlane 的参数,与返回结果绘制结果定位作用、优化完整脚本ProjectReferences 起因 之前偶然项目中看到过 API Vector3.ProjectOnPlane API 的使用 然在这篇文章也看到:Unity3d那些你不常用但确有其用的方法—Ve…

Unity —— Vector3

Vector3向量,在三维坐标系中带有方向和大小的数据 Vector3中一些常量: 1、Vector3.back(0,0,-1) 2、Vector3.forward(0,0,1) 3、Vector3.left(-1,0,0) 4、Vector3.right&#xff0…

Unity3D_向量(Vector3)数学基础

向量(Vector3) 在虚拟的游戏世界中,3D数学决定了游戏,如何计算和模拟出开发者以及玩家看到的每一帧画面。学习基础的3D数学知识可以帮主用户对游戏引擎产生更深刻的了解。 向量定义:既有大小又有方向的量叫做向量。在…

Vector3类详解

|| 欢迎讨论技术的可以相互加微信:windgs (请备注csdnxx职业) || --------------------- 作者:隨意的風 来源:CSDN 原文:https://blog.csdn.net/Windgs_YF/article/details/86550843 版权声明:本文为博主原创文章…

面试真的被问麻了......

前几天组了一个软件测试面试的群,没想到效果直接拉满,看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经,感觉非常有参考价值,于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋,打开…

实事求是,虚事求应

休谟之问,能否从“是”中得“应”?孟子回答说:二者不可得兼,舍身(是)取义(应)者也。 ​ 智能涉及人、机、环境三部分,其中人通过算计形成的意图、直觉、抽象等&#xff0…

管理就要“实打实”

https://www.toutiao.com/a6642491590042452483/ 2019-01-07 10:13:32 导语 如何才能使得企业的经营管理高效呢?这个问题没有什么捷径可走,唯有实打实的来落实各项工作。归纳起来就是三个方面的内容:说实话、办实事、讲实效。 一、 说实话…

8分钟的面试,我直呼太变态了......

干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…

【不就是java设计模式吗】设计模式七大原则,用代码对比方式,化抽象为具体,实打实的教会你

💗作者简介:大家好,我是卷心菜~~,第二季新星计划java领域第十名。📝个人主页:卷心菜的CSDN博客📕系列专栏:本文写在Java设计模式专栏:不就是java设计模式吗📧…

Java岗:实打实掌握[Java多线程]和[并发编程]

概述 面试中,多线程和并发编程已经是必不可少的了,我经常看到此类问题,当时也简单了解过,什么继承Thread类,实现Runnable接口,这些都被说烂了,知道这些当然是远远不够的,于是这几天…

我用Java能干什么?

Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,…

什么是JAVA?JAVA能做什么?

什么是Java? Java既是一种编程语言,又是一个平台。 Java程序语言 Java是具有以下特征的高级程序语言: 简单   面向对象   可分布   可解释   强壮   安全性   结构化   轻便   功能强大   多线程   动态 Java既可以被编译…

Java是什么?主要是干什么的?

随着Java技术不断发展,许多人都想问:Java是什么?主要是干什么的呀?现在小朗来为大家解惑。java是一种高级计算机语言,一种可以编写跨平台应用软件、完全面向对象的程序设计语言。那Java主要是干嘛的呀? 一、java可以做…

学java可以从事什么工作-java岗位有哪些?

学java可以从事的工作主要有:企业级应用开发、网站开发、软件开发、嵌入式领域、大数据、科学应用等。java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。 1、企业级应用开发 企业级应用开发大可以做全国联网的系统,小到中小企…