Как смоделировать давление с частицами?


11

Я пытаюсь симулировать давление с помощью набора сферических частиц в игре Unity, которую я создаю. Пара замечаний по поводу проблемы:

  • Цель состоит в том, чтобы заполнить постоянно меняющееся 2-мерное пространство / пустоту маленькими сферами без трения. Игра пытается симулировать постоянно растущее давление все большего количества объектов, попадающих в это пространство.
  • Сам уровень постоянно прокручивается слева направо, а это означает, что если размеры пространства не изменятся пользователем, он автоматически уменьшится (самая левая часть пространства будет постоянно прокручиваться за пределы экрана).

Мне интересно, какие есть некоторые подходы к решению этих проблем ...

  1. Зная, когда определить, когда есть место для заполнения, а затем добавить сферы в это пространство.
  2. Удаление сферы из пространства, когда оно сжимается.
  3. Стратегии для имитации давления на сферы так, что они «взрываются наружу», когда создается больше места.

Текущий подход, который я рассматриваю, заключается в использовании постоянно движущейся стены, которая находится за пределами экрана и движется вместе с экраном, как показано на этом рисунке:

давление!,

Эта движущаяся стена будет толкать и удерживать сферы в пространстве. Что касается добавления новых сфер, я собирался, чтобы либо (1) сферы размножались при обнаружении свободного пространства, ИЛИ (2) порождали их слева от пространства (где находится стена) - подталкивая остальные сферы к заполнить пространство. Я предвижу проблемы с идеей № 1, потому что это, скорее всего, не будет создавать / имитировать давление; Идея № 2 кажется более многообещающей, но поднимает вопрос о том, как обеспечить место для появления этих новых сферных частиц (и последствиях их появления, когда пространства нет).

Большое спасибо заранее за вашу мудрость!

Ответы:


6

Я не совсем уверен, чего вы хотите достичь: толкает ли стена частицы, когда пространство скатывается с экрана, игровой механик?

Что касается ваших трех пунктов, я думаю, что все эти поведения возникнут, если вы будете обращаться со своими частицами так: пусть каждая частица отталкивает каждую другую частицу, обратно пропорциональную расстоянию, а также сталкивает их со стенами вашего пространства, чтобы остановить их.

Частицы, расположенные близко друг к другу, будут отталкивать друг друга и таким образом распространяться, заполняя пустое пространство, пока не будут остановлены препятствиями. Если / когда стены перемещаются, чтобы уменьшить пространство и толкать частицы, они будут подталкиваться ближе к другим частицам, отталкивать их сильнее, что, в свою очередь, будет давить на другие частицы, увеличивая общее давление.

Это было бы очень похоже на моделирование n-тела с отрицательным притяжением, поэтому в зависимости от количества частиц, это может быть довольно дорого, чтобы вычислить отталкивание для каждой частицы с каждой другой частицей. Возможно, вы могли бы попытаться упростить это, если бы каждая частица отталкивалась только усредненным центром тяжести вашей массы частиц, что могло бы привести к странному поведению в длинных тонких областях с изгибами (ваш газ не расширяется в области, которые отклоняются от центр тяжести, например).

Что касается создания и удаления частиц (чтобы убедиться, что есть только правильное количество, чтобы визуально заполнить пространство, которое я предполагаю?), Вы, вероятно, захотите убедиться, что вы просто не добавите или не удалите частицы, когда плотности не хватает, так как это может привести к больше частиц отталкивает другие частицы и, следовательно, увеличивает или уменьшает давление.

Таким образом, вы можете захотеть ввести коэффициент в расчет отталкивания, скажем, начните с 1,0, а когда вы добавляете x частиц, перед добавлением новых добавьте новый коэффициент n / (n + x), где n - количество всех частиц.


2

Давление (как в газе) является просто результатом простых упругих столкновений между вашими частицами и между частицами и стеной. Вы просто измеряете количество столкновений со стенами за раз, чтобы получить значение для вашего давления.

Две идеи, которые вы даете, не имеют прямой связи с давлением, поскольку давление дается с постоянным количеством частиц в закрытом объеме и определенной температурой (что приводит к тому, что частицы движутся быстрее или медленнее).

Если вы добавите частицы в эту замкнутую систему, давление должно возрасти, потому что во всей системе больше энергии (вы только что добавили новую частицу с заданной температурой <-> скорости).


частицы должны иметь массу для упругих столкновений, так как предполагается, что стены имеют массу около + бесконечности
Aron_dc

Я сказал, что «давление - это количество столкновений со стенами за один раз», что точно на 100%. В упругом столкновении вы берете импульс этой частицы и измеряете, сколько импульса подается на стену. Таким образом, если одна частица сталкивается в вертикальном направлении со стеной, стенка получает импульс 2 мВ (m = масса частицы; v = скорость частицы). Таким образом, вы фактически измеряете поступающий импульс на стене. Частица просто отражается (v до столкновения = -v после столкновения). Это даже помогает измерить давление смесей разных газов (разных м для частиц).
Aron_dc

0

Каждый цикл, вы должны пройти через все ваши частицы, а затем рассчитать конечную силу на этой частице. По сути, стена всегда дает им положительный вектор силы на оси x, если они сталкиваются с ней (частицы.х - частица.r <= 0).

Затем каждая частица, с которой они сталкиваются, также дает им вектор силы, зависящий от угла между ними. Вы собираете эти углы для всех частиц, вычисляете среднее значение, и все!

Здесь также можно использовать множество методов оптимизации, просто посмотрите учебник по физике шаров. По сути, вы хотите пройти через каждую пару частиц только один раз, рассчитать вектор силы для обоих и сохранить их в них.

Это, в принципе, будет имитировать газы, и если вы дадите им постоянную силу, я полагаю, что и жидкости.

Что касается создания и удаления частиц, я реализую класс ParticleEmitter, у которого есть позиция, направление и некоторые другие полезные вещи. Ваш пример был бы лучше с эмиттером, который может создавать частицы в определенном диапазоне, или даже лучше, прямоугольник.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.