Çarpışma Çözümü


23

Çarpışmaları kontrol etmeyi gayet iyi biliyorum, ancak çarpışmayı iyi idare etmeyi bilmiyorum.

Basitleştirilmiş, iki nesne çarpışırsa hız yönünü değiştirmek için bazı hesaplamaları kullanırım. İki nesneyi hareket ettirmezsem üst üste gelecekler ve hız yeterince büyük değilse bir sonraki güncellemeden sonra da çarpışacaklar. Bu, nesnelerin birbirine sıkışmasına neden olabilir.

Fakat iki nesneyi taşımaya çalışırsam üst üste binmemeleri için. Bu iyi bir fikir gibi geliyor ama ikiden fazla nesne varsa bunun çok karmaşık bir hale geldiğini anladım. Ya iki nesneyi hareket ettirirsem ve bir tanesi diğer nesnelerle çarpışırsa, ben de onları hareket ettirmeliyim ve duvarlarla çarpışabilirler.

Aklıma bir 2D oyun aklımda ama bunun bununla bir ilgisi olduğunu sanmıyorum. Çarpışmalar genellikle nasıl yapılır?

Bu soru Wooh adına sorulur.


1
Oyunun türünü netleştirebilir misiniz? "Yukarıdan aşağıya 2D" bir çok anlama gelebilir: Zelda tarzı bir aksiyon-macera oyunu, dikey bir kaydırma atıcı ya da bir cep bilardo oyunu. Bunların hepsi, çarpışmaların ele alınmasında çok farklı standart stillere sahip olacak!
Ian Schreiber

2
Bunu netleştiremiyorum. Soru, bir çarpışma sonucunda ne olacağı ile ilgili değildir, çoklu örtüşme problemini ele almakla ilgilidir. Birbirimden nesneleri zıplattığımı ve bu soruyu cevaplamak için gerçekçi davranmalarını istiyorum.
CiscoIPPhone

Yanıtlar:


16

Daniel Kodicek, bu konuyu, Programcılar İçin Matematik ve Fizik adlı kitabında ayrıntılı olarak ele alıyor .

Kodicek doğal görünümlü çarpışma çözünürlüğüne ulaşmak için iki şey yapıyor:

  • Çarpışma algılama fonksiyonu, iki nesnenin çarpışacağı tam zamanı hesaplar.
  • Çarpışma anında yeni hızları yeniden hesaplar, böylece nesneler asla çakışmaz.

Kodicek'in çarpışma tespitine ve çözülmesine dayanan bir demo yükledim .

güncelleme: İşte Kodicek'in metoduna çok benzeyen bir çarpışma algılama ve çözünürlük algoritması . İle kaynak kodu . Yine de Kodicek'in kitabını öneriyorum, çünkü algoritması biraz farklı şekilde uygulandı ve çok daha ayrıntılı olarak açıklandı.


1
Demo bağlantınız kopmuş görünüyor.
ashes999

@ ashes999: bağlantı şimdi düzeltildi!
Leftium

Daireler için bir algoritma. Kutulara ne dersin?
Anton Chikin

@AntonChikin: Kodicek'in çarpışma çözünürlüğü algoritması sadece üç girdi alır: kütle, hız ve çarpışma noktasında normal. Kodicek, çarpışmaları tespit ederken daima çarpışma noktasında normal hesaplar. Başka bir kutuya vuran bir kutu da dahil olmak üzere birçok farklı çarpışma algılama türünü açıklıyor. Sadece çarpışma algılama algoritmasını çarpışma çözünürlüğü algoritmasına takın. Tam bir açıklama için bkz. Kodicek'in kitabının 8-10. Bölümleri. (Rotasyonel fiziğin daha fazla matematik gerektirdiğine dikkat edin, ki kitapta daha sonra da ele
alınacaktır

1
@ThomasHilbert: demo kaynak kodu ve Windows çalıştırılabilir dosyaları artık leftium.com/asteroid
Leftium

6

Sonradan nesneler hareket etmeden önce çarpışmayı kontrol ederseniz ne olur? Ya da başka bir deyişle, nesneler çarpışırsa, eskisini bu durumda tekrar kullanırken, yeni konumu reddedersiniz?

pseudocode:

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

Bu şekilde nesneler çarpışmak üzereyken birbirleriyle çarpışacaklardır , güncelleme adımınız yeterince küçükse oyuncu gösterimde garip bir şey farketmemelidir.


1
Bu oldukça can sıkıcıdır, çünkü nesnelere kolayca paralel hareket edemezsiniz çünkü diğer nesnelere dokunursanız, hareket edemezsiniz.
Ikke

X ve y'yi ayrı ayrı çözemezseniz
instantaphex

6

İki nesne üst üste geldiğinde, birbirlerine doğru veya uzakta hareket edip etmediklerini kontrol edin. Çarpışmayı sadece birbirlerine doğru hareket ediyorlarsa yapın.

Vektör matematiği ile oldukça kolay, basitçe hesaplayın:

dot_product (B.pozisyon - A. pozisyon, A. Hız - B. Hız)

Sonuç pozitifse nesneler birbirine doğru hareket eder.


4

Yanlış anlıyor olabilirim ama iki soru soruyor gibisin: 1. Çarpışma çözümüyle başa çıkmanın genel yollarından biri, aradığın terim 'dürtü tabanlı simülasyon' ve bir sürü kağıt var. benden daha iyi adalet yapabilirim.

Özetle, euler yapmak istediğiniz fizik simülasyonunuzu momentum uzamına, yani kütle çarpı hıza (adımlara göre zorlama yapmayın, entegratörünüz zaten doğru yapmıyor) adım atmak istiyorsunuz.

Açısal tepki için, neyse ki en büyük ve en az eylemsizlik momentleri her zaman iki ortogonal eksene (2D cinsinden) indirgenebilir, bu da bir matris çarpımının genel olarak çalışacağı anlamına gelir ve bunları X ve Y eksenlerine hizalarsanız, 2B vektör.

Çarpışma noktasında çarpışma noktasında doğrusal ve açısal momentlere dayanarak yanıt bulursunuz ve eğer birbiriyle iç içe geçmişseniz, iki bedeni birbirinden ayırmak için bir miktar ceza kuvveti (yukarıda belirtildiği gibi) uygulamaktır.

Sonunda anormal davranışı kontrol etmek için daha fazla kural ekleyerek sona erersiniz, böylece maksimum açısal momentum kapamak gibi şeyler işler, üstler gibi dönmezler, ama bu iyi bir başlangıçtır.

Yapabiliyorsanız basit tutun.

  1. Çok cisim çarpışma problemlerini nasıl çözersiniz

Bunu yapmanın tek gerçek yolu, bir doğrusal denklem sistemi ve çok fazla çözme ile. Bunu yapmanın pratik yolu yukarıdaki gibi bir sisteme sahip ve fiziğin zamanla doğal olarak çözdüğü.

Hareketli yüzeylerde yuvarlanma veya ayakta durma gibi şeyler yapan çoğu oyun, ayaklarınızın bir yüzeye (veya yola tekerlekleri) bağlı olduğu, fizik zaman adımına ayak uydurmak için (interpenetrasyon-tepki döngüleri ile sonuçlanacak ve işe yaramazsa).

Bu yardımcı olur umarım. Herhangi bir matematik örneğine ihtiyacınız olursa, bana bildirin.


3

Bunun genellikle fizik motorlarında çözülme şekli bir ceza kuvveti uygulamaktır. Bükülmez gövdeyi penetrasyondan sonra taşımak, sert gövdeleriniz daha yüksek hızlarda hareket ediyorsa (anlık sarsıntı hareketlerini görürsünüz) iyi görünmeyecektir, ancak ilk adım olarak bunu denemelisiniz ve gereksinimlerinize uygun olup olmadığına bakın.

A penalty force, bir yay damperi gibi uygulanır, ceza kuvvetinin arttığı yerde, sert gövdeye daha fazla nüfuz ettiğinizde ve sonraki karelerde azaltılır. Bunu yaylar olarak düşünün. İki rijit cisim birbirine nüfuz ettiğinde, her biri ilerlemelerini azaltan (daha fazla nüfuz etmeyi önleyen) görünmeyen bir yay ile karşılaşır ve daha önce belirtilenleri uygular.penalty force cisimleri delip geçene kadar .

Bu geniş bir konudur, ancak umarım yukarıdaki bilgiler sizi başlatacaktır.


Öyleyse, birbirine nüfuz etmeyi önlemek yerine, bu yöntem izin verir, ancak neredeyse nesnelerin sıkıştırıldığı gibi direnç sağlar.
CiscoIPPhone

Direnç sağlar, evet, direnç daha fazla vücuda nüfuz etmeye çalıştığında artar. Uygulamada, yeterince düşük bir delta süreniz varsa (örneğin 10ms), herhangi bir penetrasyon üretmez. Bununla birlikte, bu yöntemin asıl avantajı, çeşitli nedenlerden dolayı birbirine nüfuz etmiş gövdelere sahip olduğunuzda (pozisyon değişti, ağa bağlı sert gövdeler ve pozisyonları düzeltildi) ve şimdi ayrılmaları gerekiyor, çünkü bu teknik olmadan bedenler yavaş yavaş ayrı değil, patlayacak.
Samaursa
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.