Determinar la posición de un objeto a lo largo de una curva a lo largo del tiempo

8

Tengo algunos objetos en mi juego que son "arrojados". En este momento estoy tratando de implementar esto haciendo que estos objetos sigan una curva parabólica. Sé el punto de inicio, el punto final, el vértice y la velocidad del objeto.

  1. ¿Cómo puedo determinar en un momento dado o encuadrar cuáles son las coordenadas x & y?
  2. ¿Es una curva parabólica incluso la curva correcta para usar?
Ben Williams
fuente
Sus entradas son ambiguas. Supongo que vértice significa la posición de observación. Y punto final significa la posición final. ¿Qué significa la velocidad? ¿Qué tan lejos puede viajar el objeto en un segundo? ¿Es la velocidad cuánto tiempo debe tardar el objeto en llegar de principio a fin?
deft_code
Disculpas por no estar claro. Trataré de hacerlo simple: me gustaría hacer que una pelota se mueva desde un lado de la pantalla (x = 0) hacia el otro lado (x = 480), comenzando desde y = 0 y llegando a un máximo de y = 320 (a mitad de camino, x = 240). Quiero que haga esto durante 2 segundos. A partir de esta información, ¿puedo determinar a partir de una fórmula mis coordenadas x e y para cada cuadro?
Ben Williams

Respuestas:

4

Lo que buscas es una gráfica paramétrica de la función parabólica. Es más fácil hacer que la función paramétrica use un rango de p ∈ [0,1].

La forma canónica para una parábola paramétrica es

k: = alguna constante
f_x (p) = 2kp
f_y (p) = kp²

Usando esta fórmula y un poco de álgebra básica para la función de transformación y obtuve

p ∈ [0,1] → x, y ∈ [0,1]
o, en otras palabras, mantenga p entre 0 y 1 yx, y también estará entre 0 y 1.
x = p
y = 4p - 4p²

Entonces, para obtener estas funciones producirá los números que está buscando.

float total_time = 2;
float x_min = 0;
float x_max = 480;
float y_min = 0;
float y_max = 320;

float f_x( float time )
{
   float p = time/total_time;
   return x_min + (x_max-x_min)*p;
}

float f_y( float time )
{
   float p = time/total_time;
   return y_min + (y_max-y_min)*(4*p-4*p*p);
}
deft_code
fuente
tu notación es un poco confusa. ¿Su s f_xutiliza f_yla aceleración acomo su velocidad media? Deberías hacer eso x(t) = x0 + vx0*tyy(t) = y0 + vy0*t + .5*ay*t*t
Tobias Kienzler
A propósito no utilicé las fórmulas de movimiento euler. ay tsolo eran nombres mal elegidos. Debes notar que no hay un componente de velocidad en las fórmulas. El movimiento de Euler y las parábolas paramétricas no son lo mismo, pero son muy similares al vuelo balístico que traza una trayectoria parabólica.
deft_code
4

Encontrar la ecuación de una curva por la que desea que se mueva su objeto es una forma de lograr lo que desea, pero probablemente no sea la mejor.

En cambio, uno generalmente realiza un seguimiento de las propiedades locales de un objeto (velocidad, aceleración) y luego usa estos valores para actualizar la posición del objeto en cada cuadro.

Como mencionó una parábola, supongo que está lanzando una pelota en 2D y desea que caiga a lo largo del eje y. Por lo tanto, su objeto tiene una aceleración constante en la dirección y (llamémosle así g) y ninguna aceleración en la dirección x. Cuando se arroja el objeto se le da cierta velocidad, llamemos a eso vxy vy.

Luego, en cada cuadro de su aplicación, agregaría la aceleración del objeto a su velocidad, y luego agregaría su velocidad a su posición. Algo como:

vy += g;
x += vx;
y += vy;

Haga esto cada cuadro y su bola comenzará a moverse. Hay mucho más que saber sobre esto, pero es un comienzo.

Brandon Williams
fuente
Estoy lanzando una pelota en 2D, pero la pelota tiene aceleración en la dirección x. Quiero que se lance de un lado a otro de la pantalla (vea el comentario sobre la pregunta original). Entiendo cómo actualizar basado en vx y vy, pero no estoy seguro de cómo actualizar esos valores ellos mismos.
Ben Williams
2
@Ben Williams Solo necesita configurar el vx y el vy al comienzo. Y agregue gravedad a la vy cada cuadro. También podría tener una fricción al multiplicar vx y vy por un número inferior a 1 (algo como .95 podría funcionar dependiendo de su velocidad de fotogramas). Busque en Google "bouncing ball YourProgrammingLanguageHere" y probablemente obtendrá algunos tutoriales básicos pero útiles.
AttackingHobo
3
En realidad, si sabe que su objeto sigue una trayectoria parabólica, es mucho, mucho mejor implementarlo como una función de curva, en lugar de pasos físicos discretos. Sí, puede ser 'más difícil' codificar inicialmente, pero la recompensa es que el movimiento de su objeto se desacopla de las preocupaciones por la velocidad de fotogramas.
Blair Holloway
1
Segundo @Blair, a menos que separe la velocidad de fotogramas de la física de la velocidad de fotogramas del video, esto puede causar efectos horribles como errores de recorte
Tobias Kienzler
0

En los juegos de consola, a menudo usamos Bicubic Interpolation para resolver este problema. Primero, muestree la posición de un objeto a intervalos regulares de tiempo t. Para un proyectil, agregue aceleración gravitacional [0, dy / dt / dt] a su velocidad [dx / dt, dy / dt] en cada intervalo. Registre todas las coordenadas [x, y] generadas en una matriz.

Más tarde, para reconstruir la posición del objeto [x, y] para una t determinada, lea las cuatro muestras más cercanas a esa t del búfer que registró: [t-1, t, t + 1, t + 2]. Mezcle las cuatro muestras de acuerdo con los coeficientes en el artículo de Wikipedia vinculado para obtener un movimiento suave en el espacio.

Esto no es tan preciso físicamente como realizar cálculos físicos sobre la marcha, pero permite una licencia artística y una economía de escala para ayudar a su simulación.

bmcnett
fuente