【问题标题】:Why is a lerp function written like this: (1 - bias) * start + bias * end;为什么 lerp 函数是这样写的: (1 - bias) * start + bias * end;
【发布时间】:2016-11-06 12:49:56
【问题描述】:

我见过几个 lerp 函数,主要用于 lerp 向量,它们看起来像这样:

vector lerp(float bias, vector start, vector end)
{ return (1-bias) * start + bias * end; }

而我的幼稚做法是:

vector lerp(float bias, vector start, vector end)
{ return (end - start) * bias + start;

我下面展示了这两种方法的细分:

two float by vector multiplications | one vector addition                            | one float subtraction | 
one float by vector multiplication  | one vector addition and one vector subtraction | 

简化,意思是:

6 float multiplications  | 3 additions | one float subtraction
3 float multiplications  | 6 additions | 

我是不是混合了,并且错误地认为这些是等价的?我有时会为简单的数学概念而苦恼。

编辑:我刚刚意识到,在我的情况下,我需要一个中途的 lerp,通过获取两个向量分量的平均值来完成它甚至更便宜。这只是每个轴 X、Y、Z 的一次加法和一次乘法。我想我会这样做的。

【问题讨论】:

  • 它是起点和终点之间的简单线性插值。看起来很漂亮。

标签: math vector graphics algebra lerp


【解决方案1】:

这是来自数学的传统,与 仿射 变换有关,这是一种以线性方式将向量映射到向量中的变换,而不必将原点映射到自身.

线性变换满足

f(a1*v1 + ... + an*vn) = a1*f(v1) + ... + an*f(vn)

仿射变换满足相同条件

a1 + a2 + ... + an = 1.

为什么?因为仿射变换恰好是f() + c 的形式,对于一些线性变换f() 和一些常数c

仿射组合是形式的表达

a1*v1 + ... + an*vn  

ai 的总和是1。它们是班轮组合的特例。

现在,如果您在任何维度(1、2、3 等)中只有两个点 AB,则由 A 定义的直线到 B 可以看作是所有仿射组合都有效:

 s*A + t*B  (s + t = 1)

在这种只有两个点的特殊情况下,也可以只用一个参数来表达

 (1 - t)*A + t*B.

t = 0 位于A 时,当t=0.5 位于AB 之间,当t=1 时,您位于B 中。

因此,您可以将t 视为时间,并认为当t01 时,您正在从AB。参数t的负值对应的是线上的点,而不是线段中的点,t > 1也是如此。

换句话说,使用(B - A)*t + A 是完全可以的(同样,它在任何维度上都有效)除了(1-t)*A + t*B 使与仿射几何的链接变得明显。

【讨论】:

  • 谢谢。我不太欣赏您之前所说的内容,但是根据那个公式来看待它,我可以想象出来。我把它想象成添加一个向量的 t% 和另一个向量的 1-t,它们似乎总是(视觉上)指向线上。
  • 没关系。请注意,您所描绘的内容对应于更一般的数学概念,这就是为什么有些人试图明确关系的原因。
【解决方案2】:

有一定的对称优雅

(1-bias) * start + bias * end

表格。这意味着startend 都没有特别的意义。

如果我们看一下运算的速度,乘法并不比加法慢很多。 (例如,参见Does each Floating point operation take the same time?)如果我们将每个操作视为相同的时间,那么对于第一个近似值,两种方法具有相同的操作计数。

我没有遇到过 lerp 代码被证明是代码中的重大瓶颈的情况,因此这里存在过早优化的情况。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多