Tengo un sprite que tiene Velocity
y Position
, ya sea almacenado como Vector2
. En cada Update
ciclo, la velocidad se agrega a la posición.
Me gustaría dar el sprite de un tercio del vector, Target
. Se pueden dar nuevos objetivos en cualquier iteración. Me gustaría que el sprite se mueva esencialmente en un patrón de caminata aleatorio, sin embargo, se deben exponer dos parámetros:
- Una caminata aleatoria típica es igualmente probable que aumente o disminuya la distancia a cualquier punto dado
Target
(más la pequeña posibilidad de movimiento tangencial). Debo poder sesgar mi caminata aleatoria de tal manera que, aunque todavía sea aleatoria, la dirección en la que el sprite "decide" debería ser más probable que la acerqueTarget
. - La caminata aleatoria debe ser "suave": el sprite no debe cambiar rápidamente de dirección, ya que esto parecerá "parpadeante" o "tembloroso" para el jugador. Debe girar gradualmente de una manera u otra, moviéndose al azar, mientras se acerca lentamente cuando se promedia.
¿Cuál es una manera buena y simple de hacer esto? Si es posible, dé la respuesta como Vector2 RandomWalk(Vector2 target)
método.
Ya tengo un NextGaussian(mean, stdev)
método disponible, si eso es útil.
xna
c#
random
linear-algebra
Superbest
fuente
fuente
Respuestas:
Tomaría el comportamiento de dirección "errante" (el código fuente se puede encontrar aquí ) y lo modificaría de una manera para que los números aleatorios estén sesgados hacia su objetivo.
fuente
Para obtener una caminata aleatoria suave, puede usar splines Catmull-Rom . Este tipo de spline toma una secuencia de puntos y genera curvas suaves que pasan a través de cada punto. Por lo tanto, podría generar puntos de ruta aleatorios para que el sprite se mueva y animarlo a lo largo de una spline Catmull-Rom a través de los puntos de ruta. Para que la spline funcione, necesitará un total de cuatro puntos de referencia: los dos anteriores y los dos siguientes. Cuando el sprite alcanza un punto de referencia, desecha el más antiguo de tu conjunto de cuatro y genera uno nuevo, luego continúa animando a lo largo de la spline.
En cuanto a eventualmente dirigirse hacia el objetivo, una idea sería compensar la distribución de la caminata aleatoria hacia el objetivo. Por ejemplo, si normalmente elige un waypoint aleatorio usando una distribución gaussiana centrada en la posición actual de su sprite, en su lugar, podría compensar el centro del gaussiano por una distancia predeterminada hacia el objetivo. Los tamaños relativos del desplazamiento y la desviación estándar de Gauss determinan qué tan sesgado es el movimiento.
fuente
Aquí hay algo que preparé en unos 20 minutos. Tomamos la dirección del caminante hacia el objetivo, elegimos una dirección dentro de una cierta cantidad de grados de esa dirección (una cantidad que disminuye a medida que el caminante se acerca a su objetivo). Este algoritmo también tiene en cuenta la distancia al objetivo para que no pase por el objetivo. En pocas palabras, básicamente se mueve hacia la izquierda y hacia la derecha una pequeña cantidad aleatoria y se dirige hacia el objetivo a medida que se acerca.
Para probar este algoritmo puse el andador en (10, 0, 10) y el objetivo en (0, 0, 0). La primera vez que el algoritmo lo ejecutó, eligió al azar una posición para que caminara el caminante (3.73f, 0, 6.71f). Después de que el caminante alcanzó esa posición, eligió (2.11f, 0, 3.23), luego (0.96f, 0, 1.68f), luego (0.50f, 0, 0.79f), luego caminó directamente hacia el objetivo porque estaba dentro Una distancia mínima de tolerancia.
Graficado a vista de pájaro, el camino se vería como los puntos en la imagen a continuación, comenzando en 'W' (caminante) y terminando en 'T' (objetivo). Si desea un movimiento más natural, debe calcular previamente algunos puntos con anticipación y crear una spline, que le dará muchos más puntos que puede hacer que el caminante siga. He estimado cómo se vería este camino después de convertirlo en una spline, y eso está representado por la línea en la imagen.
Y aquí está el código de ejemplo:
Según su juego específico, puede ajustar las distancias, el FOV, la aleatoriedad y la frecuencia con la que se ejecuta, hasta que se adapte a sus necesidades. Estoy seguro de que el algoritmo podría limpiarse un poco y optimizarse, no pasé mucho tiempo en eso, solo quería que fuera fácil de leer.
fuente