Убедитесь, что значения интерполируются правильно, когда они охватывают 360 градусов - PullRequest
0 голосов
/ 19 июня 2019

У меня есть следующая функция Lerp

  public static headingPitchRollLerp(v1: HeadingPitchRoll, v2: HeadingPitchRoll, t: number): HeadingPitchRoll {
    Math.min(Math.max(t, 0), 1);
    const result = new Cesium.HeadingPitchRoll();
    result.heading = v1.heading + (v2.heading - v1.heading) * t;
    result.pitch = v1.pitch + (v2.pitch - v1.pitch) * t;
    result.roll = v1.roll + (v2.roll - v1.roll) * t;
    return result;
  }

Это прекрасно работает, когда вращение не превышает 360 '.

Но если для примера, у меня курс 350'и мой v2 имеет заголовок 10', вместо того, чтобы перейти от 350 'к 10' (только 20 '), мой код перемещается назад и восстанавливает полный оборот (340').

Что я могу изменить насделать вращение всегда наименьшим?

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Не имеет отношения к вопросу, но, насколько я знаю

Math.min(Math.max(t, 0), 1);

фактически не меняет значение "t". Надо было бы переназначить его

t = Math.min(Math.max(t, 0), 1);
0 голосов
/ 19 июня 2019

я исправил со следующим

  public static headingPitchRollLerp(v1: HeadingPitchRoll, v2: HeadingPitchRoll, t: number): HeadingPitchRoll {
    Math.min(Math.max(t, 0), 1);
    const result = new Cesium.HeadingPitchRoll();

    const v1H = ((v2.heading - v1.heading) > Math.PI) ? v1.heading += 2 * Math.PI : ((v2.heading - v1.heading) < -Math.PI) ? v1.heading -= 2 * Math.PI : v1.heading;
    const v1P = ((v2.pitch - v1.pitch) > Math.PI) ? v1.pitch += 2 * Math.PI : ((v2.pitch - v1.pitch) < -Math.PI) ? v1.pitch -= 2 * Math.PI : v1.pitch;
    const v1R = ((v2.roll - v1.roll) > Math.PI) ? v1.roll += 2 * Math.PI : ((v2.roll - v1.roll) < -Math.PI) ? v1.roll -= 2 * Math.PI : v1.roll;

    result.heading = v1H + (v2.heading - v1H) * t;
    result.pitch = v1P + (v2.pitch - v1P) * t;
    result.roll = v1R + (v2.roll - v1R) * t;
    return result;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...