给定 3 个或更多数字或向量,我如何根据百分比在它们之间进行插值?

Given 3 or more numbers or vectors, how do I interpolate between them based on a percentage?

我想知道根据线性百分比在 3 个或更多其他值之间插入一个值所需的最基本的数学原理;因为它适用于编程。

例如,假设我有“0”、“100”、“200”,我想要“50%”的数字。然后数学会 return 类似于“100”,因为 100 是 50%。

另一个例子:我在 3D 中的某处有 3 个点 space。如果我做“75%”,那么结果将是点 2 和点 3 之间的一个点,或者如果我做“25%”,那么结果将是点 1 和 2 的中点。

再举一个例子,像 Unity 这样的游戏引擎使用类似的东西在一个角色的多个动画之间进行混合。

到目前为止我的头脑风暴是我会以某种方式获取输入值并找到最接近它的 2 个相邻“点”(在 3D 或 2d 中更难 space 但在 1d 中易于管理),然后简单地在这两个点之间进行 lerp - 但这需要我分别计算出这两个点的百分比,然后从“0 到 100%”重新映射到“A% 到 B%”。我认为它会起作用,但对我来说似乎有点复杂。

如果可能的话,我希望答案中包含一个 C# 示例或与语言无关的 psuitocode,这样我就可以理解数学。

如果您的游戏对象在同一行,请尝试此代码。

public Transform objStart;
    public Transform objEnd;
    public Transform square;
    public float distance;
    //percent .5 means 50%
    [Range(0f,1f)]
    public float percent;
    public Vector3 distancePercentPosition;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //get distance between two object
        distance = Vector3.Magnitude(objEnd.position - objStart.position);
        //get position based on percent;
        distancePercentPosition = (objEnd.position - objStart.position).normalized * percent * distance;
        square.position = objStart.position + distancePercentPosition;
    }

获得线之间的位置后,您现在可以根据百分比将游戏对象映射到每个位置。

使用分段线性插值的标量浮点对象的简单示例:

int n=3;   // number of your objects
float x[n]={ 0.5,2.0,10.0 };  // your objects

float get_object(float t) // linearly interpolate objects x[] based in parameter t = <0,1>, return value must be the same type as your objects
   {
   int ix;
   float x0,x1; // the same type as your objects
   // get segment ix and parameter t
   t*=n; ix=floor(t); t-=ix;
   // get closest known points x0,x1
   x0=x[ix]; ix++; 
   if (ix<n) x1=x[ix]; else return x0;
   // interpolate
   return x0+(x1-x0)*t;
   }

所以如果 t=0 它 returns 第一个对象在 x[] 如果它是 t=1 是 returns 最后一个并且两者之间的任何东西都是线性插值的。 .. 这个想法只是将我们的 t 乘以段数或点数(取决于你如何处理边缘情况)结果的整数部分将为我们提供最接近我们想要的 2 个对象的索引,然后是乘以 t 的小数部分将直接为我们提供两个最近点之间 <0,1> 范围内的插值参数...

如果对象的权重不同或采样不均匀,则需要添加权重插值或使用高阶多项式(二次,cubic,...)。

您可以将其用于“任何”类型的 T 对象,您只需实施 T+TT-TT*float 操作(如果它们不存在)。