¿Dónde se detendrá mi personaje?

12

Hace muchos años codifiqué un poco de IA para un juego de pseudo-3d económico. Hubo un cálculo que realmente nunca descubrí la mejor manera de hacer, y fue calcular dónde terminaría el enemigo si se detuviera ahora. Por ejemplo:

  • El enemigo está actualmente en X = 540.0.
  • El enemigo se mueve a la derecha a 10 píxeles por cuadro.
  • Cuando el enemigo quiere detenerse, su velocidad caerá 1 píxel por fotograma hasta que llegue a cero.

¿Existe una fórmula simple que me lleve a la posición donde el enemigo termina cuando está completamente detenido? Terminé precalculando y codificando el offset que funcionaba para mis necesidades, pero tendría que calcularse por separado para enemigos con diferentes velocidades.

Kaivosukeltaja
fuente

Respuestas:

7

Generalmente estoy de acuerdo con la respuesta de John. Voy a ofrecer una fórmula ligeramente modificada (que agrega un V / 2 adicional a su valor):

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

Con V = 10y A = 1, eso obtiene D = 55. Este es exactamente el resultado de

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

que es el movimiento cuadro por cuadro del enemigo.

A continuación se detalla cómo se llega a ese paso.

  1. V : Velocidad actual = 10 píxeles / fotograma, A : Aceleración actual = 1 píxeles / fotograma ^ 2
  2. T : Hora de detenerse = V / A = 10 cuadros.
  3. Distancia recorrida en 10 cuadros = cuadro1 + cuadro2 + cuadro3 + ... = V + (VA) + (V-2 * A) + ...
  4. Esto es igual a T * V - A / 2 * T * (T-1), lo que simplifica la ecuación anterior.
Palanqueta
fuente
+1 No puedo ver ningún defecto lógico en su solución, y realmente no puedo recordar cómo encontré mi solución. ¿Entonces mi expresión debe ser incorrecta y probablemente no me di cuenta debido a la pequeña diferencia y la falta de pruebas detalladas? ¿Se corregirá mi expresión si simplemente agrego la mitad de la velocidad?
John McDonald
Respondí mi propia pregunta usando power calc. Tomar mi expresión + (v / 2) parece ser siempre igual a su expresión para cualquier v y a.
John McDonald
Gracias a ambos @John y a ti, ¡esto me habría ahorrado mucho esfuerzo en aquellos días! Estoy aceptando esta respuesta, ya que es más simple y más eficiente, pero la respuesta de John también es muy apreciada. ¡Animo amigos!
Kaivosukeltaja
6

Tuve exactamente el mismo problema al trabajar en mi juego, y me llevó una eternidad hacer las matemáticas correctamente (bleh). Asi que aqui esta:

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

Reescrito en matemáticas regulares:

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

Donde la aceleración en su caso es 1, y linearVelocity es 10:

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

EDITAR

El resultado y la explicación de Jimmy son correctos. Mi fórmula requiere que también agregues la mitad de la velocidad.

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

o

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55
John McDonald
fuente
2
Solo para que conste, Math.Pow () es una idea terrible, terrible aquí. Se puede especial de los casos el '2.0' exponente si es lo suficientemente inteligente, pero cualquier forma que se mire, la reescritura de esa expresión como '0,5 * * linearVelocity linearVelocity / Aceleración' debe ser una gran victoria.
Steven Stadnicki
4

Los cálculos sobre el cambio de velocidades es el punto completo del cálculo. No lo he hecho en mucho tiempo, así que no me acuerdo de mi cabeza, pero creo que su situación es simplemente tomar la integral de -1 (es decir, la desaceleración).

jhocking
fuente
0

¿No es este movimiento de aceleración constante?

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

Donde:
X: última posición
Xi: posición inicial
V: velocidad
t: tiempo
a: aceleración

La única parte difícil aquí es cómo determinar "t", ya que disminuimos la velocidad con una aceleración de -1, entonces podemos calcular t = V / a, entonces t es 10.

entonces,
Xi: 540
V: 10
t: 10
a: -1

Pon todo en:

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

La fórmula proviene de la integración de la aceleración: marque aquí

tesla
fuente