Recientemente cambié mi motor de juego de comportamientos de dirección a movimiento basado en impulsos con una resolución de colisión adecuada basada en el tiempo. Esto ha resuelto tantos problemas (no más túneles, sí) y ha hecho que la simulación sea mucho más estable. Sin embargo, con la estabilidad ha llegado un nuevo problema.
Las tres bolas comenzaron su viaje cerca de la parte inferior de la imagen, su objetivo era donde se detuvo la bola rosa. En el camino, las bolas rojas y verdes se han quedado atascadas en el punto de estrangulamiento en la pared.
Antes, podía confiar en los errores de coma flotante y la inestabilidad general de los comportamientos de dirección para hacer que las bolas verdes y rojas se empujaran entre sí hasta que lograran atravesar el punto de estrangulamiento. Ahora con una resolución de colisión adecuada, las fuerzas que actúan sobre las bolas se cancelan entre sí, lo que hace que las bolas permanezcan perfectamente inmóviles.
¿Qué métodos se usan comúnmente para resolver tales situaciones? Quizás algún tipo de sistema de colas de prioridad funcionaría, aunque puedo ver que se vuelve complejo una vez que necesito decidir la prioridad entre más de 2 objetos.
fuente
Respuestas:
Asigne a cada objeto móvil un índice único y prohíba que un objeto con un índice más alto mueva un agente con un índice más bajo. Esto permitirá que los objetos 'más viejos' empujen a los 'más nuevos', pero no al revés, y es menos costoso que hacer cola. Esencialmente, el índice actúa como una prioridad de movimiento.
fuente
agregar tiempo a la búsqueda de ruta
Aquí hay un artículo que habla sobre ese cubo de tiempo: http://www0.cs.ucl.ac.uk/staff/D.Silver/web/Applications_files/coop-path-AIWisdom.pdf
y aquí hay una implementación de Objective-C: http://allseeing-i.com/ASIPathFinder
fuente
En realidad, no creo que debas arreglarlo. Si (puedo adivinar) las flechas indican vectores de fuerza aplicados a cualquier esfera, en cualquier posición de la cuadrícula (probablemente interpolada "bi-linealmente" o de manera similar, o de alguna manera más "analógica" que simplemente ser 0/1), entonces el el comportamiento es físicamente correcto y debe felicitarse por tener una solución que se comporte bien.
Las 2 esferas están en un buen equilibrio, ya que se sientan allí y se odian. Aparentemente, si se mueven un poco hacia la derecha, la "flecha de fuerza" hacia la derecha afecta un poco más a la esfera del lado derecho (y viceversa en la esfera del lado izquierdo; un poco menos), por lo que retroceden para equilibrarse. Así es como debería ser.
En mi humilde opinión, lo que debe arreglarse es la pared, o los tamaños de las esferas, o algo más entre las piedras de construcción. Ha creado una imposibilidad y el comportamiento correcto en esa situación es, en consecuencia, un punto muerto (perdón por el mal uso de las palabras, espero que las obtenga de todos modos :-)).
¿Quizás deshabilitar las flechas de fuerza izquierda / derecha más cercanas, o organizarlas de alguna otra manera que no sea simétrica y no aliente el equilibrio ?
Creo que sería una mala solución arreglarlo artificialmente ... se pondría peludo demasiado pronto.
fuente