Як імітувати тиск з частинками?


11

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

  • Мета - заповнити постійно мінливий 2d простір / порожнечу невеликими сферами без тертя. Гра намагається імітувати постійно зростаючий тиск більшої кількості предметів, що потрапляють у цей простір.
  • Сам рівень постійно прокручується зліва направо, тобто якщо розміри простору не змінені користувачем, він автоматично зменшиться (сама ліва частина простору буде постійно прокручуватися поза екраном).

Мені цікаво, які існують підходи, які я можу застосувати для вирішення цих проблем ...

  1. Знаючи, коли визначити, коли є простір для заповнення, а потім додати сфери в простір.
  2. Видалення сфер із простору, коли воно скорочується.
  3. Стратегії імітації тиску на сфери такі, що вони «вибухають назовні», коли створюється більше місця.

Поточний підхід, про який я замислююсь, - це використання стіни, що постійно рухається, тобто поза екраном і рухається разом із екраном, як показано на цьому зображенні:

тиск!.

Ця рухома стіна буде штовхати і вловлювати сфери в простір. Що стосується додавання нових сфер, я мав мати або (1) кулі, що повторюються при виявленні вільного простору, АБО (2) породжують їх у лівій частині простору (де стіна) - підштовхуючи решту сфер до заповнити простір. Я передбачаю проблеми з ідеєю №1, тому що це, ймовірно, насправді не створить / моделює тиск; Ідея №2 видається більш перспективною, але ставить питання про те, як забезпечити місце для появи цих нових частинок сфери (і наслідки нересту їх, коли немає місця).

Заздалегідь дякую за вашу мудрість!

Відповіді:


6

Я не зовсім впевнений, чого саме ви хочете досягти, чи стіна штовхає частинки, коли простір скачується з екрана ігровим механіком?

Що стосується ваших трьох моментів, я думаю, що ця поведінка з'явиться, якщо ви ставитеся до своїх частинок так: Нехай кожна частинка відштовхує кожну іншу частинку, обернено пропорційну відстані, а також змушуйте їх стикатися зі стінками вашого простору, щоб зупинити їх.

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

Це було б дуже схоже на моделювання n-тіла з негативним притяганням, тому залежно від кількості частинок, можна обчислити відштовхування для кожної частинки з кожною другою частиною. Можна, можливо, спробувати спростити це шляхом відбиття кожної частинки просто усередненим центром ваги вашої маси частинок, що може спричинити дивну поведінку на довгих тонкіх ділянках із вигинами (ваш газ не розширюється на ділянки, які відгинаються від місця центр ваги, наприклад).

Що стосується створення та видалення частинок (щоб переконатися, що існує лише потрібна кількість для візуального заповнення простору, який я припускаю?), Ви, ймовірно, хочете переконатися, що не просто додавати та не видаляти частинки, коли щільність бракує, як це введено більше частинок відштовхує інші частинки, а значить, збільшує або зменшує тиск.

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


2

Тиск (як у газі) - це лише результат простих пружних зіткнень між частинками та між частинками та стінкою. Ви просто вимірюєте кількість зіткнень за стіни за раз, щоб отримати значення для свого тиску.

Дві ідеї, які ви даєте, не мають прямого зв'язку з тиском, оскільки тиск дається при постійній кількості частинок у закритому об'ємі і заданій температурі (в результаті чого частинки рухаються швидше або повільніше).

Якщо ви додасте частинки до цієї закритої системи, тиск повинен зрости, оскільки в цілій системі є більше енергії (ви просто додали нову частинку з заданою температурою <-> швидкістю).


частинки повинні мати масу для пружних зіткнень, оскільки передбачається, що стіни мають масу біля + нескінченності
Aron_dc

Я сказав, що "тиск - це кількість зіткнень за стіни за один раз", які на 100% точні. При пружному зіткненні ви берете імпульс цієї частинки і вимірюєте, скільки імпульсу подано на стіну. Отже, якщо одна частинка стикається у вертикальному напрямку до стінки, стінка отримує імпульс 2мв (m = маса частинки; v = швидкість частинки). Таким чином, ви фактично вимірюєте вхідний імпульс на стіну. Частка просто відображається (v перед зіткненням = -v після зіткнення). Це навіть допомагає виміряти тиск сумішей різних газів (різних m для частинок).
Aron_dc

0

Кожен цикл ви повинні повторити всі свої частинки, а потім обчислити остаточну силу на цю частинку. В основному, стіна завжди дає їм позитивний вектор сили на вісь x, якщо вони стикаються з нею (particle.x - particle.r <= 0).

Потім кожна частинка, з якою вони стикаються, також дає їм вектор сили, залежно від кута між ними. Ви збираєте ці кути для всіх частинок, обчислюєте середнє значення, і там ви йдете!

Тут також можна використовувати багато методик оптимізації, просто знайдіть підручник з фізики м'яча. Ви в основному хочете повторити кожну пару частинок лише один раз і обчислити вектор сили обох і зберегти їх у них.

В основному це буде імітувати гази, і якщо ви будете надавати їм постійну силу, рідини теж, я припускаю.

Що стосується створення та видалення частинок, я реалізую клас ParticleEmitter, який має положення, напрямок та деякі інші корисні речі. Ваш приклад було б краще з випромінювачем, який може створювати частинки в певному діапазоні, а ще краще, прямокутнику.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.