2011-07-30 7 views
5

Estoy tratando de desarrollar un juego.Algoritmo para seguir la ruta con una cierta inercia

image demonstrating concept

I tienen un punto de partida con y a partir del vector (azul), al lado que dibujo en la pantalla la trayectoria (negro) que quiero seguir con una cierta inercia, o ángulo limitado y un paso cada vez que debería resultar en una línea roja.

¿Tiene algún consejo sobre cómo programar dicho algoritmo?

+1

¡Bienvenido a Stack Overflow!Al hacer su pregunta, es demasiado vaga para obtener una respuesta particularmente buena. ¿Con qué restricciones específicas estás operando? ¿Qué podemos asumir sobre la estructura del mundo? Cuantos más detalles proporciones, mejor podremos ayudar. – templatetypedef

+0

¿La ruta negra está completamente disponible antes del primer movimiento? O bien, ¿los puntos negros están disponibles gradualmente a medida que avanza el tiempo, y la línea roja debe seguir lo más posible el punto negro recién descubierto? La primera opción es preferible. – Dialecticus

+0

@Dialecticus Creo que al menos parte de la línea negra debe estar disponible antes de que pueda comenzar a dibujar una línea roja, sin embargo, debería poder dibujar una línea roja antes de que termine el dibujo del negro. @ templatetypedef No puedo pensar en ninguna restricción, estoy tratando de simular un vuelo que seguiría una trayectoria dibujada a mano, pero tratando de simular la inercia (un radio mínimo que el objeto puede cambiar) – orko

Respuesta

3

Puede simplemente crear un esquema diferencial, es decir, la velocidad del modelo y la coordinación del punto fuente en momentos discretos en el tiempo. Digamos que arregla algunos dt = 0.1 sec por ejemplo, la velocidad de inicio está dada por el vector azul como v0. Comenzamos en x0. Diga y[j] son los puntos de la ruta negra.

Deje x1 = x0 + v1 * dt, donde v1 = v0 + (y[k(x0)+1] - x0) * f(abs(y[k(x0)+1] - x_0)). Donde
k(x0) es el índice de la más cercana a x0 puntos entre y[j],
f(x) es una función que caracteriza la 'fuerza' tirando de su trayectoria a la de la trayectoria definida. Se definió para los no negativos x es solamente.

Este modelo tira de su trayectoria al siguiente punto de la trayectoria definida hasta la posición más cercana a la posición modelada actual en la trayectoria.

Un buen ejemplo de f(x) podría ser una modelización de la fuerza de la gravedad: f(x) = K/(x * x), donde K se deben ajustar de forma experimental estar dando los resultados deseados naturales.

Entonces x2 = x1 + v2 * dt, donde v2 = v1 + (y[k(x1) + 1] - x1) * f(abs(y[k(x1) + 1] - x_1)) y así sucesivamente:

x[n+1] = x[n] + v[n+1] * dt, donde v[n+1] = v[n] + (y[k(x[n]) + 1] - x[n]) * f(abs(y[k(x[n])+1] - x[n])) ...

Vas a tener que ajustar dt y K aquí. dt debe ser lo suficientemente pequeño para que la trayectoria sea suave. Más grande K hace la trayectoria más cercana a la definida con precisión, más pequeña K lo hace más relajado.

Editar ahora en realidad cuando pensé un poco, entiendo que la selección de la función de la fuerza f no fue buena, ya que la fuerza gravitacional permite velocidades espaciales, es decir, la capacidad de su trayectoria a volar lejos de la deseada infinitamente si la velocidad inicial es muy grande. Entonces debería construir otra función, posiblemente algo similar a f(x) = K x o f(x) = K x^alpha, donde alpha > 0. Usted ve, este esquema es bastante general, por lo que debe experimentar.

+2

Creo que [este artículo] (http://www.red3d.com/cwr/steer/gdc99/) explica el mismo enfoque descrito en su respuesta, pero de una manera más sostenida. Me pareció una lectura muy entretenida e instructiva. –

1

Otra opción sería la de hacer algo como esto ...

1. Compute the average value of k points in the target path 
    to get (<x>,<y>). 
    2, Compte the angle between the most recent point in the path 
    and (<x>,<y>) and turn that way; if the angle is too big, 
    turn as hard as possible. 
    3. Recompute (<x>,<y>) for the next set of k elements by sliding 
    the window by 1; repeat step 2. 

Esto podría hacer bastante para el comportamiento apropiado. Me gustaría ver un ejemplo, pero esto sería bastante tedioso. Tenga en cuenta que esto es similar al método Unkulunkulu contornos, pero un poco diferente en términos de un enfoque.

+0

¡Bien! Esto parece ser controlable un poco más fácil que el mío. – unkulunkulu

Cuestiones relacionadas