Я думаю, что вы на правильном пути с тем, что вы думаете, некоторые частицы в коробке будут хорошо здесь. Я не могу представить, что вы найдете статьи по такому конкретному и простому случаю, но, возможно, по некоторым из необходимых методов, но реализация бэкэнда должна быть относительно простой по сравнению с рендерером.
Для перемещения частиц по простому методу Итерация Эйлера , где вы храните позиции и скорости. положение = положение + скорость * dt; где dt - изменение во времени с момента последнего кадра. Лучше всего сохранять фиксированное значение dt и интерполировать между точками для средства визуализации, если вы можете ... это уменьшит проблемы со стабильностью и облегчит обнаружение столкновений.
Чтобы отразить частицу от стены, проверьте, не превысят ли ее x-компоненты или y-компоненты положения, и затем переверните знак другого компонента скорости, например,
if(Math.Abs(position.x_component + velocity.x_component * dt) > x_bound)
velocity.y_component = -velocity.y_component;
if(Math.Abs(position.y_component + velocity.y_component * dt) > y_bound)
velocity.x_component = -velocity.x_component;
Если у вас есть постоянная dt, это работает довольно хорошо, но если она меняется, вам нужно будет сделать что-то более сложное. найдите точку столкновения с рамкой и отразите часть вектора вне рамки на грани, с которой столкнулись.
Для столкновения частиц друг с другом, вероятно, лучше всего проверить расстояние, вызывая отражение, когда расстояние слишком мало. Т.е. если они подойдут слишком близко, они столкнутся. Отражайте компоненты скорости, как если бы частицы были сферами, поэтому нормальным для отражения является разность их положений.
Вы можете найти эту статью на gamedev тоже полезной ...
Надеюсь, это поможет.