Bir 2D fizik motorunda, nesneler dinlendiğinde işe yaramayan çarpışma çözümlerinden nasıl kaçınırım?


9

Love-2d kullanarak geliştirdiğim (öğrenme için) bir fizik motorunda çarpışma çözümlerini şu şekilde uyguladım:

FixedUpdate(dt)  // I use fixed timestep
 foreach collide c1 in allNotStaticColliders
   c1.integartePhysic // i.e. apply gravitational force..
   foreach collider c2 "near" c1 // "near"= I use spatial hashing 
      if collide(c1,c2)
        resolve collision (c1,c2)  // the heavy operation
        collison callbacks c1
        collison callbacks c2
        ...

düşen ve durma nesnelerin animasyon

Gif animasyonunun sonunda görebileceğiniz gibi, tüm çarpıştırıcılar neredeyse statik bir nesneye topraklandığında bir FPS bozulması var.

2 FPS ile son statik durum

Çünkü nesneler yerleştikçe dokunmak için daha fazla zaman harcadıkça çarpışma çözümlerinin sayısı artar. Ancak, hesaplamaların çoğu "işe yaramaz" çünkü nesneler zaten birbirlerine karşı istikrarlı pozisyonlara yerleşmiştir.

Bu "işe yaramaz" çarpışma tespitlerinden kaçınmak için en iyi uygulama hangisidir (umarım fizik derecesi gerektirmez)?

Düzenleme: kabul edilen DMGregory ipuçları ve bu sonuca gelin (henüz optimal değil)

resim açıklamasını buraya girin

(Kırmızı = statik, Mavi = aktif, Yeşil = uyku)


1
Her zamanki yaklaşım, dinlenmeye başlayan nesneleri "uykuda tutmak" ve uyku / statik nesneler arasındaki etkileşimleri dikkate almamaktır (ancak uyku nesnesi, hala uyanık ve hareket eden dinamik bir nesneden gelen bir etkileşim tarafından uyandırılabilir). Ne yazık ki bu sadece bir nesne tamamen dinlendiğinde yardımcı olur. Örneğinizi doğru okuyorsam, nesnelerin hala yerleşip hafifçe hareket ettiği durumlarda performans sorunlarınız başlıyor gibi görünüyor. Burada yapabileceğim tek şey, sisteme daha fazla sürtünme / sönümleme eklemek (muhtemelen bir hız eşiği ile), böylece küçük hareketler gerçek dinlenmeye daha hızlı çürümek.
DMGregory

@DMGregory Bu iyi bir yanıt gibi geliyor. Eklensin mi?
Anko

Yanıtlar:


9

OP'nin zaten bu yaklaşımı bildiğinden şüpheliydim, bu yüzden bir yorumda sadece bir başlangıç ​​noktası olarak bahsettim, ancak biraz daha etmeyi deneyeceğim ...

Çoğu fizik motoru dinamik nesneleri " uyanık " ve " uyku " olarak ikiye ayırır .

Nesneler istirahat ettiklerinde uyurlar ve dışarıdan bir etki ile hareket ettiklerinde veya hızlandıklarında uyanırlar.

Bir uyku (o istirahat çünkü hiçbir hareketi vardır, böylece) kendi hareketi zamanla entegre edilmemiştir ve uyku olan bina ya da statik arasındaki motor yoksaydıklarınız çarpışmaları - Çoğu bakımdan statik bir nesne gibi nesne davranacağını.

Bir çarpışma tepkisi olmamasına rağmen, statik bir katta oturan bir uyku nesnesi içinden düşmez, çünkü yerçekimi de dahil olmak üzere uyku nesneleri için tüm hareket entegrasyonu atlanır.

Bu nedenle, yalnızca en az bir uyanık dinamik nesne içeren çarpışmaların kontrol edilmesi gerekir:

Collisions    Static          Sleeping           Awake
          ------------------------------------------------
Awake     |    Check        Check & Wake         Check
Sleeping  |     No               No
Static    |     No

Bu, özellikle soruda gösterildiği gibi, net hareketin çok az olup olmadığını kontrol etmek için çok sayıda karşılıklı çarpışmaya sahip yığınlarda aktif simülasyon gerektiren nesne sayısını önemli ölçüde azaltabilir.

Sadece Uyuyan nesneler aslında bir kez yardımcı ulaşması biraz zaman alabilir olsa da, hangi dinlenin.

Daha erken dinlenmek için yapabileceğiniz bazı şeyler:

  • Sıfır olmayan bir minimum hıza veya momentuma sahip olun ve altına düşen her şeyi sıfıra sabitleyin. (Bu, temel olarak, yüzenlerin karşılaştırılmasında yaygın olarak kullanılan bir epsilondur)

  • Enerjiyi sistemden çıkarmak ve genel olarak daha hızlı dinlenmesine yardımcı olmak için sürtünme, sönümleme ve esnek olmayan çarpışmalar kullanın.

  • Yavaş hareket eden nesneler için, daha enerjik cisimlerin davranışını etkilemeden, son dürtüyü dinlendirmek için seçici olarak sürtünme / sönümleme / esnekliği artırma .


İyi cevap. İyi fikirlerin bir demetine dikkat çekiyorsunuz. 2) Uyuyan bir nesnenin altındaki statik bir platformu kaldırırsam, bu nesne
uyanmaz

1
@ dnkdrone.vs.drones İyi gözlemler. Hiç bir fizik motoru yazmamış olsam da, bunun normal olarak nasıl ele alınacağından emin değilim. Bir olasılık, bir nesneyi uyku moduna ayarlarken, dokunduğu nesnelerin bir listesini saklarız (veya yerel bir nesne kümesine ekleriz). Uyuyan bir nesneyi uyandırdığımızda, liste / kümesindeki her şeyi uyanırız. Uyanma anında yakındaki kişileri kontrol etmek gibi daha zarif seçenekler olabilir (taşınmadan önce).
DMGregory
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.