1

我见过几个 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 的一次加法和一次乘法。我想我会这样做。

4

2 回答 2

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。它们是衬垫组合的特​​例。

现在,如果您只有两个点A并且B在任何维度(1、2、3 等)中,由Ato定义的直线B可以看作是所有仿射组合存在的地方:

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

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

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

t = 0你处于正确的位置A时,当你在和和t=0.5之间的中间时,你就在。ABt=1B

因此,您可以t将时间视为时间,并认为您正在旅行 from Ato Bwhent去 from 0to 1。参数的负值t对应于直线上的点,而不是线段中的点,同样适用于t > 1

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

于 2016-11-23T21:48:49.960 回答
0

有一定的对称优雅

(1-bias) * start + bias * end

形式。这意味着两者都没有startend没有特定的意义。

如果我们看一下运算的速度,乘法并不比加法慢得多。(例如,请参见每个浮点运算是否花费相同的时间?)如果我们将每个运算视为相同的时间,那么对于第一个近似值,两种方法都具有相同的运算计数。

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

于 2016-11-06T13:15:56.523 回答