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

时间:2016-11-06 12:49:56

标签: math vector graphics algebra 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的一个加法和一个乘法。我想我会这样做。

2 个答案:

答案 0 :(得分: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。它们是衬垫组合的特​​例。

现在,如果您只有两个点AB在任何维度(1,2,3等)中由A定义到{{1}的直线可以看作是所有仿射组合生活的地方:

B

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

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

当您 (1 - t)*A + t*B. t = 0A t=0.5 A B t=1B之间t ,你在A

因此,您可以将B视为时间,并考虑当t0转到1时您从t前往t > 1 (B - A)*t + A。参数(1-t)*A + t*B的负值对应于线上的点,但不对应于线段,return也是如此。

换句话说,使用{{1}}(再次,在任何维度上都有效)是完全可以的,除了{{1}}使其显示与仿射几何的链接。

答案 1 :(得分:0)

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

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

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

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