¿Cómo interpolar linealmente entre dos vectores?

16

Tengo un vector de velocidad donde está mi cliente y hacia dónde va, y tengo el mismo vector que proviene del servidor que indica dónde debe estar el cliente. A veces es un poco diferente, por lo que quiero interpolar entre mi posición actual y la posición correcta del servidor.

ingrese la descripción de la imagen aquí

La flecha negra es el vector de velocidad del cliente, la flecha roja es el vector de velocidad del cliente en el servidor y la flecha azul es la que quiero calcular e interpolar.

¿Cómo calculo el vector azul? Entonces, ¿cómo puedo interpolar linealmente entre ellos?

gmemario
fuente

Respuestas:

18

El vector azul se puede calcular fácilmente: rojo - negro (el signo entre vectores es negativo). Pero si solo quiere interpolar entre el vector negro y el rojo, no tiene que calcularlo. La interpolación lineal es solo una combinación lineal. Entonces puede simplemente tomar: alpha * black + (1 - alpha) * red, donde alpha debe ser del intervalo <0,1>. Si alfa será 1, obtendrá un vector negro, cuando alfa sea 0, obtendrá un vector rojo.

Y si lo entendí bien, interpolarás entre estos vectores a tiempo. Así que solo elija el incremento correcto de alfa en el tiempo.

¿Te entendí bien? ¿O quisiste decir algo completamente diferente?

zacharmarz
fuente
Sí, me entendiste bien. Solo una pregunta más, ¿cómo multiplico el número del vector? ¿Esa operación me devolverá un nuevo vector? Por ejemplo, el rojo es un vector (0, 10) con una longitud de 8 y el negro es (-2, 5) con una longitud de 4. ¿Cómo hago alfa * negro o (1 - alfa) * rojo? Gracias.
gmemario
Simplemente multiplica cada coordenada vectorial por separado. Si alfa es, por ejemplo, 0.5, entonces alpha * negro + (1 - alfa) * rojo = (0,5) + (-1, 2.5) = (-1, 7.5) - si va a dibujar esto en algún papel, usted verá que es realmente exactamente entre esos dos vectores.
zacharmarz
10

Tomando esta foto:

ingrese la descripción de la imagen aquí

AB es el vector rojo de A a B.

Digamos que P es el 25% del camino de A a B. La forma básica de llegar a P desde el origen es

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

Entonces 3/4 A y 1/4 B.

Otra forma de encontrar eso es decir que quiere un vector que esté 75% "cerca" de A y 25% "cerca" de B. (Un vector que está 100% "cerca" de A es solo el vector A).

Entonces también podría encontrar P como:

A*t + (1-t)*B

Con t = 0.75 (para decir 75% "cerca" de A)

0.75A + 0.25B

Entonces, una función LERP simple en C para una clase Vector3f sería:

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