LERP - Interpolação Linear
Eu dei essa resposta para um problema semelhante há alguns dias, mas aqui vamos nós:
Interpolação linear é uma função que fornece um número entre dois números, com base no progresso. Você poderia, na verdade, obter um ponto entre dois pontos.
A Grande Fórmula - Como calcular
A fórmula geral do LERP é dada por pu = p0 + (p1 - p0) * u
. Onde:
- pu: O número do resultado
- p0: o número inicial
- p1: O número final
- u: O progresso. É dado em porcentagem, entre 0 e 1.
Como obter porcentagem
Você pode estar se perguntando: "Como posso obter essa porcentagem !?". Não se preocupe. É assim: quanto tempo leva para viajar até o vetor inicial terminar? Ok, divida pelo tempo que já passou. Isso lhe dará a porcentagem.
Olha, algo como isto: percentage = currentTime / finalTime;
Cálculo de vetores
Para obter um vetor resultante, tudo que você precisa fazer é aplicar a fórmula duas vezes, uma para o componente X e outra para o componente Y. Algo assim:
point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;
Cálculo do tempo variável
Você pode querer que seus pontos viajem a uma velocidade de 0,5 pontos, sim? Então, digamos, uma distância maior será percorrida em um período maior.
Você pode fazer o seguinte:
Obter o comprimento da distância Para isso, você precisará de duas coisas. Obtenha o vetor de distância e depois transforme-o em um valor de comprimento.
distancevec = final - start;
distance = distancevec.length();
Espero que você conheça matemática de vetores. Caso contrário, você pode calcular um comprimento vetorial por esta fórmula d = sqrt(pow(v.x, 2) + pow(v.y, 2));
.
Obtenha o tempo necessário e atualize a hora final. Este é fácil. Como você deseja que cada tick receba um comprimento de 0,5, basta dividir e obter quantos ticks conseguimos.
finalTime = distance / 0.5f;
Feito.
AVISO: Talvez essa não seja a velocidade pretendida para você, mas esta é a certa. para que você tenha um movimento linear, mesmo em movimentos diagonais. Se você quiser fazer x + = 0,5f, y + = 0,5f, leia um livro de matemática vetorial e verifique novamente seus planos.
goal_dist
com suaif
condição?