为什么一个 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
形式。这意味着 start
或 end
都没有特别的意义。
如果我们看一下运算速度,乘法并不比加法慢很多。 (参见示例 )如果我们将每个操作视为同一时间,那么两种方法都具有相同的操作计数。
我还没有遇到过这样的情况,即 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 等)中只有两个点 A
和 B
,则由 A
定义的直线 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
视为时间,当 t
从 0
到 1
。参数t
的负值对应的是直线上的点而不是线段中的点,t > 1
.
也是如此
换句话说,使用 (B - A)*t + A
是完全可以的(同样,在任何维度上都有效)除了 (1-t)*A + t*B
使 link 与仿射几何变得明显。
我见过几个 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
形式。这意味着 start
或 end
都没有特别的意义。
如果我们看一下运算速度,乘法并不比加法慢很多。 (参见示例
我还没有遇到过这样的情况,即 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 等)中只有两个点 A
和 B
,则由 A
定义的直线 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
视为时间,当 t
从 0
到 1
。参数t
的负值对应的是直线上的点而不是线段中的点,t > 1
.
换句话说,使用 (B - A)*t + A
是完全可以的(同样,在任何维度上都有效)除了 (1-t)*A + t*B
使 link 与仿射几何变得明显。