Как я могу линейно интерполировать между двумя векторами?

16

У меня есть вектор скорости, где находится мой клиент и куда он движется, и у меня есть тот же вектор, который исходит от сервера, сообщающего, где должен быть клиент. Иногда это немного отличается, поэтому я хочу интерполировать мою текущую позицию на правильную позицию сервера.

введите описание изображения здесь

Черная стрелка - вектор скорости клиента, красная стрелка - вектор скорости клиента на сервере, а синяя стрелка - это та, которую я хочу вычислить и интерполировать.

Как рассчитать синий вектор? Тогда как я могу линейно интерполировать между ними?

gmemario
источник

Ответы:

18

Синий вектор можно легко вычислить: красный - черный (знак между векторами минус). Но если вы хотите просто интерполировать черный и красный вектор, вам не нужно его вычислять. Линейная интерполяция - это просто линейная комбинация. Таким образом, вы можете просто взять: альфа * черный + (1 - альфа) * ​​красный, где альфа должна быть из интервала <0,1>. Если альфа будет 1, то вы получите черный вектор, а когда альфа 0, вы получите красный вектор.

И если я правильно понял, вы будете интерполировать эти векторы во времени. Так что просто выберите правильный шаг альфа во времени.

Правильно ли я вас понял? Или вы имели в виду что-то совершенно противоположное?

zacharmarz
источник
Да, вы поняли меня правильно. Еще один вопрос, как мне умножить число для вектора? Эта операция вернет мне новый вектор? Например, красный - это вектор (0, 10) длиной 8, а черный - (-2, 5) длиной 4. Как мне сделать альфа * черный или (1 - альфа) * ​​красный? Спасибо.
gmemario
Вы просто умножаете каждую векторную координату отдельно. Если альфа равна, например, 0,5, то альфа * черный + (1 - альфа) * ​​красный = (0,5) + (-1, 2,5) = (-1, 7,5) - если вы нарисуете это на какой-то бумаге, вы увидим, что это действительно точно между этими двумя векторами.
zacharmarz
10

Принимая эту картину:

введите описание изображения здесь

AB - красный вектор от A до B.

Скажем, P составляет 25% пути от A до B. Основной способ добраться до P от источника

A + ( B - A ) / 4
= 3/4 A   +   B / 4

Так 3/4 А и 1/4 Б.

Другой способ найти это - сказать, что вы хотите, чтобы вектор на 75% был «близок» к A, и на 25% «закрывался» к B. (Вектор, который на 100% «близок» к A, - это просто вектор A.)

Таким образом, вы также можете найти P как:

A*t + (1-t)*B

С t = 0,75 (скажем, 75% «близко» к A)

0.75A + 0.25B

Таким образом, простая функция LERP в C для класса Vector3f будет выглядеть так:

static Vector3f lerp( const Vector3f& A, const Vector3f& B, float t ){
  return A*t + B*(1.f-t) ;
}
bobobobo
источник