Bagaimana cara interpolasi linier antara dua vektor?

16

Saya memiliki vektor kecepatan di mana klien saya berada dan kemana arahnya, dan saya memiliki vektor yang sama yang berasal dari server yang memberitahukan di mana klien seharusnya berada. Kadang-kadang agak berbeda, jadi saya ingin interpolasi antara posisi saya saat ini ke posisi server yang benar.

masukkan deskripsi gambar di sini

Panah hitam adalah vektor kecepatan klien, panah merah adalah vektor kecepatan klien di server dan panah biru adalah salah satu yang ingin saya hitung dan sisipkan ke.

Bagaimana cara menghitung vektor biru? Lalu, bagaimana saya bisa interpolasi linier di antara mereka?

gmemario
sumber

Jawaban:

18

Vektor biru dapat dihitung dengan mudah: merah - hitam (tanda antara vektor minus). Tetapi jika Anda ingin hanya menyisipkan antara vektor hitam dan merah, Anda tidak perlu menghitungnya. Interpolasi linier hanyalah kombinasi linear. Jadi Anda bisa mengambil: alpha * black + (1 - alpha) * red, di mana alpha harus dari interval <0,1>. Jika alpha akan menjadi 1, maka Anda akan mendapatkan vektor hitam, ketika alpha adalah 0, Anda akan mendapatkan vektor merah.

Dan jika saya memahaminya dengan benar, Anda akan menyisipkan di antara vektor-vektor ini pada waktunya. Jadi pilih saja kenaikan alpha yang tepat pada waktunya.

Apakah saya mengerti Anda? Atau apakah Anda bermaksud sesuatu yang benar-benar berbeda?

zacharmarz
sumber
Ya, Anda benar. Hanya satu pertanyaan lagi, bagaimana cara melipatgandakan angka untuk vektor? Apakah operasi itu akan mengembalikan saya vektor baru? Misalnya, merah adalah vektor (0, 10) dengan panjang 8 dan hitam adalah (-2, 5) dengan panjang 4. Bagaimana saya melakukan alpha * hitam atau (1 - alpha) * merah? Terima kasih.
gmemario
Anda hanya mengalikan setiap vektor secara terpisah. Jika alfa misalnya 0,5, maka alfa * hitam + (1 - alfa) * merah = (0,5) + (-1, 2,5) = (-1, 7,5) - jika Anda akan menggambar ini ke kertas, Anda akan melihat itu benar-benar tepat di antara kedua vektor tersebut.
zacharmarz
10

Mengambil gambar ini:

masukkan deskripsi gambar di sini

AB adalah vektor merah dari A ke B.

Katakanlah P adalah 25% dari jalan dari A ke B. Cara dasar untuk sampai ke P dari titik asal adalah

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

Jadi 3/4 A dan 1/4 B.

Cara lain untuk menemukan itu adalah mengatakan Anda ingin 75% vektor "tutup" ke A, dan 25% "tutup" ke B. (Vektor yang 100% "tutup" ke A hanyalah vektor A.)

Jadi, Anda juga dapat menemukan P sebagai:

A*t + (1-t)*B

Dengan t = 0,75 (untuk mengatakan 75% "tutup" ke A)

0.75A + 0.25B

Jadi fungsi LERP sederhana dalam C untuk kelas Vector3f adalah:

static Vector3f lerp( const Vector3f& A, const Vector3f& B, float t ){
  return A*t + B*(1.f-t) ;
}
bobobobo
sumber