Farseer'de yakındaki nesneleri uzaklaştıran bir bomba patlamasını nasıl oluşturabilirim?


14

Farseer'de bomba patlaması yaratmaya çalışıyorum. Bomba için bir çember oluşturdum. Ancak bomba patlarsa, etrafındaki nesneler (cisimler) uçup gitmelidir çünkü patlamanın muazzam gücü tarafından geri itilirler. Yine de bu gücü nasıl yaratacağımdan emin değilim - nasıl yapabilirim?


Farseer'in patlamaları uygulayan bir örnekle geldiğini belirtmek gerekir. "AdvancedDemo5" (geçerli kaynakta). Klasik Thunder'ın mükemmel cevabındaki yakınlık yöntemine benziyor, sadece daha az karmaşık (AABB içinde sabit büyüklükte bir dürtü).
Andrew Russell

Yanıtlar:


28

Patlama iforce2d sayfasını kontrol etmenizi tavsiye ederim . Performans ve doğruluk dengesiyle patlamaları ele almanın çeşitli yollarını gözden geçirmek harika bir iş çıkarır. Burada özetleyeceğim 3 yöntemin üzerindedir. Bu sadece araştırma yaparken bulduğum bilgileri özetliyor ve hiçbiri benim işim değil.

Ayrıca burada zorlama değil, dürtü uygulamak istiyorsunuz. Okumak anlamak için bu .

Yakınlık yöntemi

Yakınlık yöntemi

Bu, Byte56'nın cevabında geçtiği yöntemle aynıdır. Kavram basit. Bir patlama noktasına sahip olun ve mesafeye göre bir kuvvete sahip tüm nesneleri etkileyecek noktadan uzağa doğru bir dürtü uygulayın.

Artıları:

  • Çok hızlı
  • Kolay kodlama.

Eksileri:

  • Patlamalar taşınmaz cisimlerden ve statik cisimlerden geçer.
  • Patlamanın etki alanındaki nesneler, yalnızca kütle merkezine olan mesafeyi kontrol ederseniz atlanabilir.
  • Yüzey alanı dikkate alınmaz.
  • Her şey bir anda etkilenir.

Raycast yöntemi

Raycast yöntemi

Bu yeterince basittir, patlamanızın kaynağından ışınlar çıkarır ve mesafe tarafından dikte edilen bir dürtü ile bir nesneye çarpıştıklarında impulslar uygulayın.

Artıları:

  • Mermi yönteminden daha az performans yoğun.
  • Patlama nesneler tarafından engellendi.
  • Yüzey alanı dikkate alınmıştır.

Eksileri:

  • Her şey bir anda etkilenir.
  • Patlama büyüdükçe, patlamanın her şeyi etkilediğinden emin olmak için daha fazla ışın gerekir.
  • Yakınlık yönteminden daha fazla performans yoğun.

Parçacık yöntemi

Parçacık yöntemi

Benim kişisel favorim. RaySasting yöntemine benzer ancak ışınlar yerine fizik motorunu kullanır ve sahnenizle etkileşime giren küçük peletler tükürürsünüz.

Artıları:

  • Kod açısından son derece kolay. Topları oluşturun ve her birine bir dürtü uygulayın. Kene başına yazacağınız kod yok. Patlama tamamlandıktan sonra gövdeyi devre dışı bırakan / sıfırlayan bir zamanlayıcıya sahip olmanız yeterlidir.
  • Patlama nesneler tarafından engellenir.
  • Yüzey alanı dikkate alınır.
  • Patlama yüzeylerden yansır.
  • Patlamanın ötesindeki nesneler buna daha yavaş tepki verir.
  • Topları, efektlerinizin patlama etkisini doğru bir şekilde yansıtmasına izin veren kısmi oluşturmanın temeli olarak kullanabilirsiniz.

Eksileri:

  • Kene başına karmaşıklık ekler.

5
Çok güzel bir cevap. Özellikle parçacık yöntemini seviyorum. Yine de güçlü bir patlama yapmayı zorlaştıracak gibi görünüyor . Parçacıkları daha yüksek kütle yapmak önemsiz mi?
MichaelHouse

1
Partiküllerin tüm fiziksel yönlerini etkilemek önemsizdir, en önemlisi yoğunluk, hız ve sönümdür. Yoğunluğu artırmak ve yüksek bir hız ayarlamak, komik bir şekilde şiddetli bir patlama yapmanıza izin verir.
ClassicThunder

Patlama parçacıklarını kasıtlı olarak yavaşlattınız mı yoksa animasyonun tamamı duruyor mu? Parçacıklara sürekli sürtünme eklemek mantıklı olacaktır.
bu

@self Box2D, belirli bir oranda çizgisel olarak yavaşlatan bir nesneye astar sönümlemesi eklemenizi sağlar, bu gifte kullanılan tekniktir.
ClassicThunder

1
Mükemmel cevap :) Son yönteme bir tane daha profesyonel ekleyeceğim, çünkü güzel görünümlü duman veya toz çizmek için pelet pozisyonlarını kullanabilirsiniz.
iforce2d

2
  • Bombanın etki yarıçapındaki tüm nesneleri seçin.
  • Her nesne için
    • Dürtü vektörünü hesaplamak için nesne konumunu ve patlamanın merkezini kullanın. Gibi bir şey normalize(object - center).
    • Dürtü büyüklüğünü hesaplamak için bomba merkezinden nesneye olan mesafeyi kullanın. Gibi bir şey(object - center).length
    • Önceki adımlarda bulunan vektör ve büyüklüğü kullanarak nesneye bir dürtü uygulayın .

Basit doğrusal falloff ile başlayabileceğiniz büyüklüğü hesaplamak için, sonuçları beğenmezseniz diğer formüllere geçin.


Kuvvetler, zaman içinde bir nesneyi etkilemek istediğiniz zamanlar içindir, bu durum buradaki durum değildir. Bir dürtü uygulamak daha doğru olur.
ClassicThunder

Üzgünüm, güç dedim ama dürtü ile bağlantılıyım.
MichaelHouse
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.