Parçacıklar ile basınç nasıl simüle edilir?


11

İnşa ettiğim Bir Birlik oyununda küresel parçacıklar koleksiyonuyla baskıyı simüle etmeye çalışıyorum. Sorun hakkında birkaç not:

  • Amaç, sürekli değişen 2d alanı / boşluğu küçük, sürtünmesiz kürelerle doldurmaktır. Oyun, bu alana itilen daha fazla nesnenin sürekli artan baskısını simüle etmeye çalışıyor.
  • Seviyenin kendisi sürekli olarak soldan sağa kayar, yani alanın boyutları kullanıcı tarafından değiştirilmezse otomatik olarak küçülür (alanın en sol kısmı sürekli olarak ekran dışında kayar).

Bu sorunların üstesinden gelmek için bazı yaklaşımların neler olabileceğini merak ediyorum ...

  1. Doldurulacak alanın ne zaman tespit edileceğini bilmek ve daha sonra alana küreler eklemek.
  2. Küçülürken kürelerin boşluktan çıkarılması.
  3. Daha fazla alan yaratıldığında "dışa doğru patlayacak" şekilde küreler üzerindeki baskıyı simüle etme stratejileri.

Şu anda düşündüğüm yaklaşım, sürekli hareket eden bir duvar kullanıyor, bu da ekran dışında ve ekranla birlikte hareket ediyor, bu resimde gösterildiği gibi:

basınç!.

Bu hareketli duvar küreleri uzaya itecek ve sıkıştıracaktır. Yeni küreler eklemeye gelince, (1) kürenin boş alanı algıladıktan sonra kendilerini çoğaltacağını, VEYA (2) onları alanın sol tarafında (duvarın olduğu yerde) ortaya çıkaracaktım - geri kalan küreleri boşluğu doldurun. Fikir # 1 ile ilgili problemleri öngörüyorum, çünkü bu gerçekten baskı oluşturmayacak / taklit etmeyecek; 2. fikir daha umut verici görünüyor, ancak bu yeni küre parçacıklarının ortaya çıkması için nasıl bir yer sağlanacağı sorusunu gündeme getiriyor (ve yer olmadığında onları ortaya çıkarmanın sonuçları).

Bilgeliğiniz için şimdiden çok teşekkürler!

Yanıtlar:


6

Ne elde etmek istediğinizden tam olarak emin değilim, boşluk ekrandan çıkarken duvar parçacıkları iterek bir oyun tamircisi mi?

Üç noktanıza gelince, parçacıklarınıza böyle davranırsanız bu davranışların hepsi ortaya çıkacağını düşünüyorum: Her parçacığın diğer her parçacığı mesafeyle ters orantılı olarak itmesini sağlayın ve onları durdurmak için alanınızın duvarlarıyla çarpışmasını sağlayın.

Birbirine yakın parçacıklar birbirini itecek ve böylece engellerle duruncaya kadar boş alanı doldurmak için yayılacaklardı. Duvarlar alanı küçültmek ve parçacıkları itmek için hareket ettiğinde / diğer parçacıklara yaklaşırlar, daha güçlü iterler, bu da diğer parçacıkları iter ve genel basıncı arttırır.

Bu, negatif çekiciliğe sahip bir n-vücut simülasyonuna oldukça benzer olacaktır, bu nedenle parçacık sayısına bağlı olarak, her parçacık için her parçacık için itme hesaplamak oldukça pahalı olabilir. Her parçacığın sadece parçacık kütlenizin ortalama ağırlık merkezi tarafından geri püskürtülmesini basitleştirmeye çalışabilirsiniz, ancak uzun ince alanlarda bükülmelerle garip davranışlar üretebilir (gazınız, bükülmeyen alanlara genişlemez) örneğin ağırlık merkezi).

Parçacıklar oluşturmaya ve silmeye gelince (tahmin ettiğim alanı görsel olarak doldurmak için sadece doğru miktarda olduğundan emin olmak için?), Muhtemelen yoğunluk eksik olduğunda parçacıkları eklememekten veya çıkarmamaya dikkat etmek istersiniz, çünkü bu daha fazla partikül diğer partikülleri iter ve böylece basıncı arttırır veya azaltır.

Bu nedenle, itme hesaplamasına bir faktör katmak isteyebilirsiniz, diyelim 1.0 ile başlayın ve x parçacıkları eklediğinizde, yeni faktörü n / (n + x) yapın ; burada n, yenilerini eklemeden önce toplam parçacık sayısıdır.


2

Basınç (bir gazda olduğu gibi) sadece parçacıklarınız arasında ve parçacıklar ve duvar arasındaki düz elastik çarpışmaların sonucudur. Basıncınız için bir değer elde etmek için sadece duvarlarla çarpışma miktarını ölçersiniz.

Kapalı bir hacimde ve belirli bir sıcaklıkta sabit bir partikül miktarı ve verilen partiküller (partiküllerin daha hızlı veya daha yavaş hareket etmesine neden olur) ile verildiği için, verdiğiniz 2 fikrin basınca doğrudan bağlantısı yoktur.

Bu kapalı sisteme parçacıklar eklerseniz, basınç yükselmelidir, çünkü tüm sistemde daha fazla enerji vardır (belirli bir sıcaklıkta <-> hıza sahip yeni bir parçacık eklediniz).


duvarların + sonsuzluğa yakın bir kütleye sahip olduğu varsayıldığı için, parçacıklar elastik çarpışmalar için bir kütleye sahip olmalıdır
Aron_dc

Dedim ki "basınç duvarlarla çarpışmanın miktarı her seferinde" çentik% 100 hassas. Elastik bir çarpışmada, o parçacığın dürtüsünü alırsınız ve duvara ne kadar dürtü verildiğini ölçersiniz. Dolayısıyla, bir parçacık duvara dikey yönde çarpışırsa, duvar 2mv'lik bir dürtü alır (m = parçacık kütlesi; v = parçacık hızı). Yani aslında duvardaki gelen darbeyi ölçüyorsunuz. Parçacık az önce yansır (çarpışmadan önce v = çarpışmadan sonra -v). Bu, farklı gazların (partiküller için farklı m) karışımlarının basıncını ölçmeye bile yardımcı olur.
Aron_dc

0

Her döngü, tüm parçacıklarınızı tekrarlamanız ve daha sonra bu parçacık üzerindeki son kuvveti hesaplamanız gerekir. Temel olarak, duvar, çarpışıyorlarsa, onlara daima x ekseni üzerinde pozitif bir kuvvet vektörü verir (particle.x - particle.r <= 0).

Daha sonra çarpıştıkları her parçacık, aralarındaki açıya bağlı olarak onlara bir kuvvet vektörü verir. Bu açıları tüm parçacıklar için toplar, ortalamayı hesaplarsınız ve işte gidiyorsunuz!

Burada da kullanabileceğiniz birçok optimizasyon tekniği var, sadece bazı top fiziği öğreticisine bakın. Temel olarak her bir parçacık çiftini sadece bir kez tekrarlamak ve her ikisi için kuvvet vektörünü hesaplamak ve içinde saklamak istiyorsunuz.

Bu, temel olarak gazları simüle edecektir ve eğer onlara sabit bir kuvvet verirseniz, sıvılar da, sanırım.

Parçacıklar oluşturmak ve silmek için, bir konum, yön ve diğer bazı yararlı şeylere sahip bir ParticleEmitter sınıfı uyguluyorum. Örneğiniz, belirli bir aralıkta parçacıklar veya daha da iyisi bir dikdörtgen oluşturabilen bir yayıcıyla daha iyi olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.