Como interpolar linearmente entre dois vetores?

16

Eu tenho um vetor de velocidade em que meu cliente está e para onde está indo, e eu tenho o mesmo vetor que vem do servidor informando onde o cliente deve estar. Às vezes é um pouco diferente, então eu quero interpolar entre minha posição atual e a posição correta do servidor.

insira a descrição da imagem aqui

A seta preta é o vetor de velocidade do cliente, a seta vermelha é o vetor de velocidade do cliente no servidor e a seta azul é a que eu quero calcular e interpolar.

Como calculo o vetor azul? Então, como posso interpolar linearmente entre eles?

gmemario
fonte

Respostas:

18

O vetor azul pode ser calculado facilmente: vermelho - preto (o sinal entre os vetores é negativo). Mas se você quiser apenas interpolar entre os vetores preto e vermelho, não precisará calculá-lo. A interpolação linear é apenas uma combinação linear. Então você pode simplesmente pegar: alfa * preto + (1 - alfa) * vermelho, onde alfa deve ser do intervalo <0,1>. Se alfa for 1, você obterá o vetor preto; quando alfa for 0, o vetor será vermelho.

E se eu entendi direito, você interpolará entre esses vetores no tempo. Então, basta escolher o incremento certo de alfa no tempo.

Eu te entendi certo? Ou você quis dizer algo completamente diferente?

zacharmarz
fonte
Sim, você me acertou. Apenas mais uma pergunta, como multiplicar o número do vetor? Essa operação me retornará um novo vetor? Por exemplo, vermelho é um vetor (0, 10) com comprimento de 8 e preto é (-2, 5) com comprimento de 4. Como faço para alfa * preto ou (1 - alfa) * vermelho? Obrigado.
Guemario #
Você apenas multiplica cada coordenada de vetor separadamente. Se alfa for, por exemplo, 0,5, então alfa * preto + (1 - alfa) * vermelho = (0,5) + (-1, 2,5) = (-1, 7,5) - se você desenhar isso em algum papel, verá que é exatamente exatamente entre esses dois vetores.
Zacharmarz 17/10/11
9

Tirando esta foto:

insira a descrição da imagem aqui

AB é o vetor vermelho de A a B.

Digamos que P seja 25% do caminho de A a B. A maneira básica de chegar a P desde a origem é

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

Então 3/4 A e 1/4 B.

Outra maneira de descobrir isso é dizer que você quer um vetor 75% "próximo" de A e 25% "próximo" de B. (Um vetor 100% "próximo" de A é apenas o vetor A.)

Então você também seria capaz de encontrar P como:

A*t + (1-t)*B

Com t = 0,75 (para dizer 75% "próximo" de A)

0.75A + 0.25B

Portanto, uma função LERP simples em C para uma classe Vector3f seria:

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