我已经看过几个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的一个加法和一个乘法。我想我会这样做。
答案 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
。它们是衬垫组合的特例。
现在,如果您只有两个点A
和B
在任何维度(1,2,3等)中由A
定义到{{1}的直线可以看作是所有仿射组合生活的地方:
B
在这个只有两点的特殊情况下,你也可以只用一个参数来表达它们
s*A + t*B (s + t = 1)
当您 (1 - t)*A + t*B.
t = 0
时A
t=0.5
A
B
t=1
和B
之间t
,你在A
。
因此,您可以将B
视为时间,并考虑当t
从0
转到1
时您从t
前往t > 1
(B - A)*t + A
。参数(1-t)*A + t*B
的负值对应于线上的点,但不对应于线段,return
也是如此。
换句话说,使用{{1}}(再次,在任何维度上都有效)是完全可以的,除了{{1}}使其显示与仿射几何的链接。
答案 1 :(得分:0)
中有一定的对称优雅
(1-bias) * start + bias * end
形式。这意味着start
或end
都没有特别重要的意义。
如果我们看一下操作速度,乘法并不比加法快得多。 (参见例如Does each Floating point operation take the same time?)如果我们将每个操作视为同一时间,那么对于第一个近似,两个方法具有相同的操作计数。
我没有遇到这样的情况,即lerp代码被证明是代码中的一个重要瓶颈,因此有一个过早优化的情况,在这里。