news 2026/7/18 5:20:58

游戏中的线性插值

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
游戏中的线性插值

文章目录

  • 线性插值
    • Mathf.Lerp
      • 控制灯光强度
    • Vector3.Lerp
      • 物体的空间运动
    • Color.Lerp
      • 颜色渐变

线性插值

线性插值是指找到两个给定值之间的某个百分比值。

L e r p = a + ( b − a ) ∗ t , t ∈ [ 0 , 1 ] Lerp = a + (b - a) * t,t∈[0,1]Lerp=a+(ba)tt[0,1]

例如,我们可以在数字3和5之间线性插值50%,得到数字4。这是因为4在3和5之间占了50%。


Unity中通过Lerp的函数实现。包括Mathf.LerpColor.LerpVector3.Lerp

Mathf.Lerp

Mathf.Lerp会自动将插值因子 t 限制在 [0, 1] 区间内。而Mathf.LerpUnclamped则允许 t 超出范围。

float result = Mathf.Lerp (3f, 5f, 0.5f); // result = 4

a = 3 a = 3a=3b = 4 b = 4b=4,插值因子t = 0.5 t = 0.5t=0.5,则插值结果为:4

f ( t ) = a + ( b − a ) ∗ t = 3 + ( 4 − 3 ) ∗ 0.5 = 4 \begin{aligned} f(t) &= a+(b-a)*t\\&= 3+(4-3)*0.5\\&= 4 \end{aligned}f(t)=a+(ba)t=3+(43)0.5=4

控制灯光强度

在某些情况下,Lerp函数可以用来随时间平滑一个值。

void Update () { light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f); }

如果灯光强度是0,那么第一次更新后会被设置为4。
下一帧会先是6,然后7,再7.5,依此类推。
因此,在多个帧内,光的强度会趋近8,但随着接近目标,变化速度会减慢。

注意,这种情况发生在多个帧内。

如果我们希望这不依赖帧率,务必使用Time.deltaTime来缩放插值速度。

void Update () { light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime); }

这意味着强度的变化将是每秒发生,而不是每帧。

平滑值时通常最好使用SmoothDamp函数。只有确定想要的效果时才用Lerp平滑。


Vector3.Lerp

Vector3 from = new Vector3(1f, 2f, 3f); Vector3 to = new Vector3(5f, 6f, 7f); Vector3 result = Vector3.Lerp(from, to, 0.75f); // result = (4, 5, 6)

在线性变换中,a ⃗ = [ 1 2 3 ] , b ⃗ = [ 5 6 7 ] , t = 0.75 \vec{a} = \begin{bmatrix}1 \\ 2 \\ 3\end{bmatrix}, \vec{b} = \begin{bmatrix}5 \\ 6 \\ 7\end{bmatrix}, t = 0.75a=123,b=567,t=0.75,则插值结果为:[ 4 5 6 ] \begin{bmatrix}4 \\ 5 \\ 6\end{bmatrix}456

向量插值的计算:
u ⃗ = a ⃗ + ( b ⃗ − a ⃗ ) ∗ t = [ 1 2 3 ] + ( [ 5 6 7 ] − [ 1 2 3 ] ) ∗ 0.75 = [ 1 2 3 ] + [ 4 4 4 ] ∗ 0.75 = [ 1 2 3 ] + [ 3 3 3 ] = [ 4 5 6 ] \begin{aligned}\vec{u} &= \vec{a} + (\vec{b} - \vec{a}) * t\\&= \begin{bmatrix}1 \\2 \\ 3\end{bmatrix} + (\begin{bmatrix}5 \\ 6 \\ 7\end{bmatrix} - \begin{bmatrix}1 \\ 2 \\ 3\end{bmatrix}) * 0.75\\&= \begin{bmatrix}1 \\2 \\ 3\end{bmatrix} +\begin{bmatrix}4 \\ 4 \\ 4\end{bmatrix} * 0.75\\&= \begin{bmatrix}1 \\2 \\ 3\end{bmatrix} +\begin{bmatrix}3 \\ 3 \\ 3\end{bmatrix}\\&= \begin{bmatrix}4 \\5 \\ 6\end{bmatrix}\end{aligned}u=a+(ba)t=123+(567123)0.75=123+4440.75=123+333=456

插值因子的变化:

物体的空间运动

控制移动开关

private float t = 1.1f; public void BeginLerp() { t = 0f; }

固定时长平滑移动

public float lerpTime = 1f; private void FixedUpdate() { if (t < 1f) { t += Mathf.Clamp01(1f / lerpTime * Time.fixedDeltaTime); objectToLerp.transform.position = Vector3.Lerp(objectToLerp.transform.position, destinationTransform.position, t); } }

移动到目的地


Color.Lerp

在颜色结构中,颜色由4个浮点表示,分别代表红、蓝、绿和阿尔法。使用 Lerp 时,每个浮点数会像对Mathf.Lerp一样进行插值。

颜色渐变

public Image background; public List<Color> socials = new List<Color>(); public float frequency = 3f; private float t = 1.1f; public void BeginLerp() { t = 0f; } private void Update() { if (t < 1) { t = Mathf.Sin(Time.time * frequency); background.color = Color.Lerp(socials[0], socials[1], t); } }

自定义要渐变的颜色

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 5:20:42

HarmonyOS7 手势交互页实战:点击、长按、拖拽 不只是会用,还要用得顺手

文章目录每个手势都要有明确反馈拖拽和捏合要注意收口手势冲突别靠猜完整代码写在最后手势交互最容易写成“能触发就行”。但真到页面里&#xff0c;点击、双击、长按、滑动、拖拽、捏合放在一起&#xff0c;重点就不是 API 名字&#xff0c;而是每个区域到底响应什么、状态怎么…

作者头像 李华
网站建设 2026/7/18 5:20:29

人形机器人从仓库到家庭:核心技术演进与商业化路径解析

1. 项目概述&#xff1a;从仓库到客厅的人形机器人浪潮最近几年&#xff0c;如果你关注科技新闻&#xff0c;会发现一个有趣的现象&#xff1a;人形机器人&#xff08;Humanoid Robots&#xff09;的新闻不再仅仅出现在实验室论文或科幻电影的宣传片里&#xff0c;而是越来越多…

作者头像 李华
网站建设 2026/7/18 5:20:11

PHP开发全栈指南:从基础到架构实战

1. PHP资源大全&#xff1a;从入门到精通的完整指南作为一名使用PHP开发超过8年的全栈工程师&#xff0c;我深知优质学习资源对程序员成长的重要性。今天要分享的这个"国外程序员收集整理的PHP资源大全"堪称PHP领域的宝藏库&#xff0c;它系统性地整理了从基础语法到…

作者头像 李华
网站建设 2026/7/18 5:20:08

SQL分组聚合原理:GROUP BY与HAVING执行顺序与实战避坑

1. 为什么 GROUP BY 和 HAVING 是 SQL 里最常被误解、也最常被写错的两个关键词刚入行那会儿&#xff0c;我带过几个实习生&#xff0c;几乎每个人在写完第一个带聚合的查询后&#xff0c;都会卡在同一个地方&#xff1a;想筛出“平均订单金额超过 500 的产品线”&#xff0c;结…

作者头像 李华
网站建设 2026/7/18 5:19:45

Harness Engineering for Self-Improvement——用于自我改进的工程框架

这篇文章是 Lilian Weng 对 “框架工程”&#xff08;Harness Engineering&#xff09; 在 AI 递归自我改进&#xff08;RSI&#xff09; 中核心作用的系统性梳理与前瞻。文章的核心观点是&#xff1a;AI 自我改进的近期突破不依赖于模型直接重写自身权重&#xff0c;而在于优化…

作者头像 李华
网站建设 2026/7/18 5:17:50

微信公众号智能自动回复系统开发实战

1. 项目背景与核心价值微信公众号自动回复功能是提升用户互动体验的关键组件。传统的关键词匹配回复方式存在响应单一、缺乏智能化的痛点。通过整合EasyWeChat&#xff08;PHP微信开发SDK&#xff09;和ChatterBot&#xff08;Python智能对话库&#xff09;&#xff0c;我们可以…

作者头像 李华