İki vektör arasında doğrusal olarak nasıl enterpolasyon yapabilirim?


16

İstemcimin nerede ve nereye gittiğini bir hız vektörü var ve ben istemcinin nerede olması gerektiğini söyleyen sunucudan gelen aynı vektör var. Bazen biraz farklı, bu yüzden geçerli konumumu sunucu doğru pozisyonu arasında enterpolasyon yapmak istiyorum.

resim açıklamasını buraya girin

Siyah ok istemci hız vektörü, kırmızı ok sunucudaki istemci hız vektörü ve mavi ok hesaplamak ve enterpolasyon yapmak istediğim oktur.

Mavi vektörünü nasıl hesaplayabilirim? O zaman aralarında nasıl doğrusal enterpolasyon yapabilirim?

Yanıtlar:


18

Mavi vektör kolayca hesaplanabilir: kırmızı - siyah (vektörler arasındaki işaret eksi). Ancak sadece siyah ve kırmızı vektör arasında enterpolasyon yapmak istiyorsanız, bunu hesaplamanıza gerek yoktur. Doğrusal enterpolasyon sadece doğrusal bir kombinasyondur. Böylece alfa * siyah + (1 - alfa) * kırmızı alabilirsiniz; burada alfa <0,1> aralığında olmalıdır. Alfa 1 olacaksa, siyah vektör alacaksınız, alfa 0 olduğunda kırmızı vektör alacaksınız.

Ve eğer doğru anladıysam, bu vektörler arasında zaman içinde enterpolasyon yapacaksınız. Yani zaman içinde doğru alfa artışını seçin.

Seni doğru anladım mı? Yoksa tamamen farklı bir şey mi demek istediniz?


Evet, beni doğru anladın. Sadece bir soru daha, vektörün sayısını nasıl çarparım? Bu operasyon bana yeni bir vektör getirecek mi? Örneğin, kırmızı, uzunluğu 8 olan bir vektör (0, 10) ve siyah, uzunluğu 4 olan (-2, 5) bir vektördür. Alfa * siyah veya (1 - alfa) * kırmızı nasıl yapılır? Teşekkür ederim.
gmemario

Her vektör koordinatını ayrı ayrı çarparsınız. Alfa örneğin 0,5 ise, alfa * siyah + (1 - alfa) * kırmızı = (0,5) + (-1, 2,5) = (-1, 7,5) - bunu bir kağıda çizecekseniz, tam olarak bu iki vektör arasında olduğunu göreceksiniz.
zacharmarz

10

Bu resmi çekmek:

resim açıklamasını buraya girin

AB, A'dan B'ye kırmızı vektördür.

Diyelim ki P, A'dan B'ye giden yolun% 25'idir. Kökünden P'ye ulaşmanın temel yolu

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

Yani 3/4 A ve 1/4 B.

Bunu bulmanın bir başka yolu, A'ya% 75 "yakın" ve B'ye% 25 "yakın" bir vektör istediğinizi söylemektir (A'ya% 100 "yakın" olan bir vektör sadece A vektörüdür.)

Böylece P'yi şu şekilde de bulabilirsiniz:

A*t + (1-t)*B

T = 0,75 ile (A'ya% 75 "yakın" demek)

0.75A + 0.25B

Bir Vector3f sınıfı için C'deki basit bir LERP işlevi şöyle olur:

static Vector3f lerp( const Vector3f& A, const Vector3f& B, float t ){
  return A*t + B*(1.f-t) ;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.