为什么一个 lerp 函数是这样写的:(1 - bias) * start + bias * end;

Why is a lerp function written like this: (1 - bias) * start + bias * end;

我见过几个 lerp 函数,主要用于 lerping 向量,它们似乎是这样的:

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 | 

我是不是混杂了,误以为这些是等价的?我有时会为简单的数学概念而苦恼。

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

中有一种对称的优雅
(1-bias) * start + bias * end

形式。这意味着 startend 都没有特别的意义。

如果我们看一下运算速度,乘法并不比加法慢很多。 (参见示例 )如果我们将每个操作视为同一时间,那么两种方法都具有相同的操作计数。

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

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

线性变换满足

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。参数t的负值对应的是直线上的点而不是线段中的点,t > 1.

也是如此

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