Як я лінійно інтерполюю між двома векторами?


16

У мене є вектор швидкості, де знаходиться мій клієнт і куди він переходить, і у мене той самий вектор, який надходить від сервера, який говорить, де повинен бути клієнт. Іноді вона трохи відрізняється, тому я хочу інтерполювати між моєю поточною позицією на правильну позицію сервера.

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

Чорна стрілка - це вектор швидкості клієнта, червона - це вектор швидкості клієнта на сервері, а синя - стрілка, яку я хочу обчислити та інтерполювати.

Як обчислити синій вектор? Тоді, як я можу лінійно інтерполювати між ними?

Відповіді:


18

Синій вектор можна легко обчислити: червоний - чорний (знак між векторами - мінус). Але якщо ви хочете просто інтерполювати між чорним і червоним вектором, вам не доведеться його обчислювати. Лінійна інтерполяція - це лише лінійна комбінація. Тож ви можете просто взяти: альфа * чорний + (1 - альфа) * ​​червоний, де альфа має бути від інтервалу <0,1>. Якщо альфа буде дорівнює 1, то ви отримаєте чорний вектор, коли альфа 0, ви отримаєте червоний вектор.

І якщо я правильно це зрозумів, ви будете вчасно інтерполювати між цими векторами. Тому просто виберіть правильний приріст альфа в часі.

Я правильно тебе зрозумів? Або ти мав на увазі щось суцільно інше?


Так, ти мене правильно зрозумів. Ще одне запитання: як я помножую число на вектор? Чи поверне мені ця операція новий вектор? Наприклад, червоний - вектор (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 - A ) / 4
= 3/4 A   +   B / 4

Отже 3/4 A і 1/4 B.

Ще один спосіб знайти те, що говорить про те, що ви хочете, щоб вектор на 75% був "близький" до A, а 25% "близький" до B. (Вектор, який на 100% "близький" до 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) ;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.