Onde meu personagem vai parar?


12

Muitos anos atrás, eu codifiquei alguma IA para um jogo pseudo-3d de orçamento. Havia um cálculo que eu nunca descobri realmente a melhor maneira de fazer, e era calcular onde o inimigo terminaria se parasse agora. Por exemplo:

  • O inimigo está atualmente em X = 540.0.
  • O inimigo está se movendo a 10 pixels por quadro.
  • Quando o inimigo quer parar, sua velocidade cairá 1 pixel por quadro até chegar a zero.

Existe uma fórmula simples que me daria a posição de onde o inimigo termina quando ele está totalmente parado? Acabei pré-calculando e codificando o deslocamento que funcionava para minhas necessidades, mas teria que ser calculado separadamente para inimigos com velocidades diferentes.

Respostas:


7

Eu geralmente concordo com a resposta de John. Vou oferecer uma fórmula levemente modificada (que adiciona um V / 2 extra ao valor dele):

D = V / A * (V + A) / 2 

Com V = 10e A = 1, isso obtém D = 55. Este é exatamente o resultado de

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

que é o movimento quadro a quadro do inimigo.

Aqui está como você vai chegar a essa etapa.

  1. V : Velocidade atual = 10 pixels / quadro, A : Aceleração atual = 1 pixel / quadro ^ 2
  2. T : Hora de parar = V / A = 10 quadros.
  3. Distância percorrida em 10 quadros = quadro1 + quadro2 + quadro3 + ... = V + (VA) + (V-2 * A) + ...
  4. Isso é igual a T * V - A / 2 * T * (T-1), que simplifica a equação acima.

+1 Não vejo falhas de lógica na sua solução e realmente não me lembro de como me deparei com minha solução. Então, minha expressão deve estar errada e eu provavelmente não percebi devido à pequena diferença e falta de testes detalhados? Minha expressão ficaria correta se eu adicionasse metade da velocidade?
John McDonald

Eu respondi minha própria pergunta usando power calc. Tomando minha expressão + (v / 2) parece sempre igualar sua expressão para qualquer dado v e a.
John McDonald

Graças a @John e você, isso me salvou muito esforço nos dias de hoje! Estou aceitando esta resposta, já que é mais simples e mais eficiente, mas a resposta de John também é muito apreciada. Saúde Gente!
Kaivosukeltaja 27/10/11

6

Eu tive exatamente o mesmo problema ao trabalhar no meu jogo, e levei uma eternidade para acertar as contas (bleh). Então aqui está:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Reescrito em matemática regular:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Onde a aceleração no seu caso é 1 e linearVelocity é 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

EDITAR

O resultado e a explicação de Jimmy estão corretos. Minha fórmula requer que você também adicione metade da velocidade.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

ou

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55

2
Apenas para constar, Math.Pow () é uma péssima idéia aqui. Pode ser um caso especial do expoente '2.0', se for inteligente o suficiente, mas de qualquer maneira, você reescreve essa expressão como '0.5 * linearVelocity * linearVelocity / Acceleration' deve ser uma grande vitória.
Steven Stadnicki 26/10/11

4

Cálculos sobre mudanças de velocidade são o ponto principal do cálculo. Eu não faço isso há um tempo, então não me lembro de nada, mas acho que sua situação está simplesmente tomando a integral de -1 (ou seja, a desaceleração).


0

Não é esse constante movimento de aceleração?

X = Xi + V*t + (1/2) * a * (t^2)

Onde:
X: Última posição
Xi: Posição inicial
V: Velocidade
t: Tempo
a: Aceleração

A única parte complicada aqui é como determinar "t", já que desaceleramos com uma aceleração de -1, então podemos calcular t = V / a, então t é 10.

então,
Xi: 540
V: 10
t: 10
a: -1

Coloque tudo:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

A fórmula vem da integração da aceleração: confira aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.