C# 埃尔米特插值

C# 埃尔米特插值,c#,unity3d,spline,hermite,C#,Unity3d,Spline,Hermite,我正在尝试使用Hermite样条在4个点之间插值。然而,我的样条曲线似乎总是从第二个点开始,只插值到第三个点。我尝试了几个不同的计算,并不断得到相同的结果 谁能告诉我这方面的情况?这是我的密码 public ControlPoint Get(float t) { //speed multiplyer //t = t * 10; return new ControlPoint( new Vector3(Hermite(points[0].pos.x, p

我正在尝试使用Hermite样条在4个点之间插值。然而,我的样条曲线似乎总是从第二个点开始,只插值到第三个点。我尝试了几个不同的计算,并不断得到相同的结果

谁能告诉我这方面的情况?这是我的密码

public ControlPoint Get(float t)
{
    //speed multiplyer
    //t = t * 10;

    return new ControlPoint(
        new Vector3(Hermite(points[0].pos.x,  points[1].pos.x, points[2].pos.x, points[3].pos.x, t)
        , Hermite(points[0].pos.y, points[1].pos.y, points[2].pos.y, points[3].pos.y, t)
        , Hermite(points[0].pos.z, points[1].pos.z, points[2].pos.z, points[3].pos.z, t)
        ),
        new Quaternion(Hermite(points[0].rot.x, points[1].rot.x, points[2].rot.x, points[3].rot.x, t)
        , Hermite(points[0].rot.y, points[1].rot.y, points[2].rot.y, points[3].rot.y, t)
        , Hermite(points[0].rot.z, points[1].rot.z, points[2].rot.z, points[3].rot.z, t)
        , Hermite(points[0].rot.w, points[1].rot.w, points[2].rot.w, points[3].rot.w, t)
        )
        );
}

float Hermite(
    float y0, float y1,
    float y2, float y3,
    float mu,
    float tension = 0,
    float bias = 0)
{
    float m0, m1, mu2, mu3;
    float a0, a1, a2, a3;

    mu2 = mu * mu;
    mu3 = mu2 * mu;
    m0 = (y1 - y0) * (1 + bias) * (1 - tension) / 2;
    m0 += (y2 - y1) * (1 - bias) * (1 - tension) / 2;
    m1 = (y2 - y1) * (1 + bias) * (1 - tension) / 2;
    m1 += (y3 - y2) * (1 - bias) * (1 - tension) / 2;
    a0 = 2 * mu3 - 3 * mu2 + 1;
    a1 = mu3 - 2 * mu2 + mu;
    a2 = mu3 - mu2;
    a3 = -2 * mu3 + 3 * mu2;

    return (a0 * y1 + a1 * m0 + a2 * m1 + a3 * y2);
}

我不是任何想象中的Hermite样条专家,但从我所看到的是,预期的行为是在第二点和第三点之间插值。在我看来,你只是在每个坐标中硬编码到你的
Get
函数,所以当Hermite样条曲线是函数时,你只得到一个插值是有意义的。将第二个点和第三个点视为要在它们之间插值的两个点,第一个点和第四个点只会帮助创建更好的曲线

由于看起来总共只有四个点,要在第一个点和第二个点、第三个点和第四个点之间插值,请尝试重复第一个坐标和最后一个坐标

//在第一点和第二点的x坐标之间插值
Hermite(点[0].x,点[0].x,点[1].x,点[2].x)

//在第三点和第四点的x坐标之间插值
Hermite(点[2].x,点[3].x,点[4].x,点[4].x,点[4].x)

要在第一个点和第二个点之间插值,
点[0]
会重复两次,因为没有
点[-1]
。对于第三点和第四点之间的插值,
点[4]
会重复,因为没有
点[5]

重申一下,不要硬编码坐标,除非只需要一次插值。您必须修改
Get
函数,并多次调用该函数以调整您想要的行为。查看Snea如何在其
DrawGraph
函数中实现Hermite样条曲线,它帮助我更好地理解Hermite样条曲线行为: