Эрмита Интерполяция

Я пытаюсь интерполировать между 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);
}

1 ответ

Решение

Я не эксперт Эрмит-сплайнов, как бы то ни было, но из того, что я видел, ожидаемое поведение будет заключаться в интерполяции между второй и третьей точкой. Мне кажется, что вы просто жестко закодированы в каждой координате Get функция, поэтому имеет смысл, что вы получаете только одну интерполяцию, когда Hermite Spline является функцией. Думайте о второй и третьей точках как о двух точках, между которыми вы хотите интерполировать, а первая и четвертая точки просто помогают создать лучшую кривую.

Поскольку, похоже, у вас всего четыре точки, для интерполяции между первой и второй точками, а также третьей и четвертой точками, попробуйте повторить свои первые координаты и последние координаты.

//Interpolate between 1st and 2nd points' x coord Hermite(points[0].pos.x, points[0].pos.x, points[1].pos.x, points[2].pos.x);

//Interpolate between 3rd and 4th points' x coord Hermite(points[2].pos.x, points[3].pos.x, points[4].pos.x, points[4].pos.x);

Для интерполяции между первой и второй точками points[0] повторяется дважды, потому что нет points[-1], Для интерполяции между третьей и четвертой точками, points[4] повторяется, потому что нет points[5],

Повторим, не используйте жесткий код в координатах, если вы не хотите использовать только одну интерполяцию. Вам придется изменить свой Get функцию и вызовите ее несколько раз, чтобы настроить поведение, которое вы хотите. Посмотрите, как Сня внедрил сплайн Эрмита DrawGraph функция, это помогло мне лучше понять поведение Эрмита Сплайна: кубический Эрмит Сплайн ведет себя странно

Другие вопросы по тегам