Birden fazla cisimle çarpışma durumunda çarpışma çözünürlüğü


15

Statik nesnelerim ve hareketli nesnelerim var. Çarpışmalar, ayırma ekseni-teoremi kullanılarak tespit edilir.

Örneğin, bu durumda iki statik nesnem var (kırmızı):

resim açıklamasını buraya girin

ve ikisi arasında hareketli bir nesne:

resim açıklamasını buraya girin

Algoritmam bu nesnelerden ikisi arasındaki çarpışmayı hesaplayabilir ve ayrıca çarpışmaya mükemmel bir çözünürlük vektörü (minimum yer değiştirme-vektör anlamına gelir) verir.

Yani, örneğin, yeşil dikdörtgen ve sağ kırmızı dikdörtgen arasındaki çarpışmayı kontrol ettiğimde, algoritma bana çarpışmayı çözmek için yeşil dikdörtgeni nasıl hareket ettirmem gerektiğini söyleyen bir vektör verir:

resim açıklamasını buraya girin

Bunu hızlı bir şekilde MSPaint'te çizdiğime dikkat edin, bu resimde aslında minimum çeviri vektörünün yeşil dikdörtgeni üste doğru itmesi olabilir, ancak burada sola / aslında hakikaten daha kısadır.

Buna yaklaşmanın genel yolu, bir kerede değil, her kare başına bir çarpışmanın çarpışmasını çözmek olacaktır. Ama benim durumumda, bu flip-flopping ile sonuçlanır:

İlk olarak, çözücü iki çarpışmayı algılar, ancak yalnızca sağ dikdörtgen ile yeşil dikdörtgen arasındaki çarpışmayı giderir:

resim açıklamasını buraya girin

Ardından, sonraki karede, sol kırmızı dikdörtgen ile yeşil dikdörtgen arasındaki yalnızca bir çarpışma algılar ve çözer:

resim açıklamasını buraya girin

Gördüğünüz gibi, bu aslında çarpışmayı çözmez (örneğin yeşil dikdörtgeni yukarıya doğru iterek) ve bunun yerine iki durum arasındaki flopları sonsuz bir şekilde çevirin.

Bunu Nasıl Çözebilirim?


Örneğinizde dikdörtgenler kullanıyorsunuz. Çarpışma algoritmanız yalnızca tek bir eksende çarpışmayı çözüyor mu? Öyleyse, tanımladığınız davranışın gerçekleşmesi mantıklıdır.
chaosTechnician

Hayır, onları tüm olası eksenlerde her türlü şekil ile çözebilir (sadece dikdörtgenler değil, MS boya ile çizmek en kolay olanıdır: P) ve her zaman iki nesneyi birbirinden ayıran en kısa vektörü bulacaktır. .
TravisG

+1 Güzel soru. (2D) "etiketi" başlıktan kaldırdım, kaçınmanız gereken bir şey ( meta'ya bakın ).
bummzack

Yanıtlar:


7

Tam olarak neyi elde etmeye çalıştığınıza bağlı olarak (yüksek fiziksel doğruluk veya sadece yeterince yakın gerçek zamanlı simülasyon) spekülatif kontakları kullanmayı deneyebilirsiniz.

İşte detaylar: http://www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/

Bu makalede, onu uygulamak için bilmeniz gerekenler açıklanmaktadır ve diğer yaklaşımlara kıyasla çok basittir (küre döküm ve daha sonra çarpışma kararlarını etki zamanına göre sıralamak gibi).

Daha fazlasına ihtiyacınız varsa / istiyorsanız, kaynak kodunu (IIRC) $ 7 için satın alabilirsiniz.

İşte 3D uygulamamın bir videosu: http://www.youtube.com/watch?v=JvT2H1RmOas

Simülasyonun tek bir yineleme ile ne kadar kararlı olduğuna dikkat edin. Birden çok çarpışmayı kararlı bir duruma çözmek için çerçeve başına birden çok yineleme kullanabilirsiniz; bu daha doğru olur.


2

Önce her bir çarpışmayı çözmek için gerekli tüm vektörleri hesaplayabilir, sonra onlardan bir sonuç hesaplayabilirsiniz.

Bunun sizi bayt edebileceği tek durum, bu vektörlerin örneğinizde olduğu gibi birbirini geçersiz kılmasıdır. Bu durumda çarpışma çözülemez.


Çarpışmalara yaklaşık epsilon * 10 büyüklüğünde küçük bir rastgele vektör eklensin mi? Kayan nokta aritmetiği gerisini halletmelidir.
Martin Sojka

2
Evet, bu işe yarayabilir, sanırım. Ama aynı zamanda titreme hareketleri de yaratabilir.
Mihai Maruseac

1
Umarım bu konuda hala bir cevap alabilirim: bir sonuç hesaplamak "sonsuz döngü" sorununu düzeltir, ancak aynı boyuttaki fayanslardan yapılmış bir duvarda kayarken hareket eden "çatlak" sorununu yeniden sunar fayans "çatlaklar" arasında sıkışmış. Her iki sorunu da çözmenin bir yolu var mı?
Vittorio Romeo

Kabul ediyorum ... böyle bir imkansız katı cisim çarpışmasını çözmek için en iyi "doğru cevap" yoktur. Ya titriyor, ya da bir ya da daha fazla nesnede biraz “mantar” a izin veriyorsunuz.
david van brink

0

Eğer ona yakından bakarsanız, nesnelerin durumu ulaşılamazdır (ya da olmalıdır).

En soldaki kırmızı şekil R1 şekli, en sağdaki kırmızı şekil R2 şekli olsun. Yeşil şekil G olsun.

yani her üç nesnenin boyutu ve geometrisi göz önüne alındığında ve tüm nesnelerin nüfuz etmediği göz önüne alındığında:

 (1) G could not have been just directly to the left of R2, since R1 has been there 
     already. Consequently, the translation of G from left to right, penetrating R2
     could not have occurred.
 (2) G could not have been just directly to the right of R1 since R2 has been there 
     already. Consquence of which is the same as that from (1).
 (3) Had G come from the top, the movement will be blocked by both R1 and R2, given
     that their geometry and Y coordinate is the same.

Şimdi, onunla kaynaşır, eğer algoritmanız nesnelerinizi tek tek sorgularsa, bu bir eşzamanlılık meselesidir, yani bir anlamda, algoritmanın TÜM nesneleri aynı anda kontrol etmesi gerekir, ancak algoritma sizi sınırlar nesneleri teker teker işlemek ...

G, R2'ye karşı kontrol edildikten sonra R1'e karşı kontrol edilirse, G yasal olarak R1'in sağında gibi görünür (G demek R1'e <1, -1> vektörü yönü ile keyfi büyüklükte (veya mesafe) yaklaşırsa ), çünkü R1 ve G arasındaki kontrol buna izin verir ve daha önce yapılan R2 ve G arasındaki kontrolü unutur.

Yapabileceğiniz bir çözüm, tüm minimum yer değiştirme vektörlerini bir diziye veya istediğiniz herhangi bir veri yapısına toplamak ve TÜM Nesnelerin yasal olduğunu kanıtlayan bir seçim yapmaktır.

Belirli bir karede nesnenin (örneğin G) yalnızca BİR yöne sahip olabileceğini unutmayın. (oh adamım, erkek çocuk kulağına benziyor ...)

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.