SAT kullanarak bileşik şekillerdeki çarpışmalar nasıl çözülür?


16

SAT , keyfi dışbükey çokgenler arasındaki çarpışmaları belirlemenin iyi bir yoludur. Bir çarpışmayı çözmek için gereken vektörü bile alırsınız.

Karmaşık (dışbükey olmayan) şekiller arasındaki çarpışmaları çözmek için, birkaç dışbükey çokgen içeren bir tür bileşik şekil düşünüyordum. Geniş fazda (örn. Daire ile daire veya AABB vs AABB) bir çarpışma meydana gelirse, çarpışma, bileşik şekildeki her çokgenin diğer bileşik şekildeki her bir çokgene karşı kontrol edilmesiyle çözülecektir.

Acaba nesneleri gerçekten ayırmanın en iyi yolu nedir? Saf bir yaklaşım, sadece vektörü en yüksek büyüklükte almak ve ayırma için kullanmaktır. Aşağıdaki resimde, bu V 2 olurdu

SAT örneği 1

Ancak, ayırma vektörleri farklı yönlere işaret ediyorsa, çarpışma hemen çözülemez ve birkaç yineleme gerektirebilir. Bir sonraki resimde V 1 ve başka bir yinelemede V 2 (veya V 2'ye yakın bir şey) kullanarak ayırırdık şekil V miktarıyla taşımış gibi 1 ).

SAT örneği 2

Bu yaklaşım, birbirinin zıt yönüne işaret eden vektörlerin ayrılması veya aşağıdaki resimde gösterildiği gibi bir durumda başarısız olacaktır:

SAT örneği 3

Burada, soldaki durum ile sağdaki durum arasında sonsuz bir şekilde tekrar ederdik.

Burada gerçek bir soru sormak için: Bu soruna makul bir yaklaşım nedir? Karmaşık şekiller için bileşik çokgenler kullanmak makul bir fikir ama bu durumda çarpışmaların nasıl çözülmesi gerektiğini merak ediyorum? Üçüncü resimde gösterildiği gibi bir çıkmazı nasıl tespit edebilirim?


Vektörü ne için kullanmak istediğinizi açıklayabilir misiniz?
Will

@Will Vektör çarpışmayı gidermek için kullanılmalıdır, böylece şekiller artık çakışmayacaktır. Böylece sarı nesneyi sonuçtaki vektörle hareket ettirebilirdim ve iki nesne artık çarpışmayacaktı.
bummzack

Yanıtlar:


7

Sanırım burada olduğu gibi SAT uygulayarak yuvarlak bir deliğe kare bir anahtar takmaya çalışıyor olabilirsiniz. Açıkçası, içbükey-içbükey çarpışmalar için tasarlanmamıştır ve bunu bu amaç için uyarlamak için çaba harcadığım halde, bunu işe yaramaz hale getiren düşünceler var.

gerçekçilik

Açısal dürtü ve devirme efektleri burada oyunun adıdır.

Temas noktalarının sırası, gerçekçi çarpışma çözümü için önemlidir. Gerçek dünyada, bu noktalardan biri her zaman diğerinden önce vuracaktır. Ve sadece o temas sırasını ve bununla temsil edilen her "alt çarpışma" nın sonuçlarını taklit ederek, simülasyonda gerçekçi bir sonuç elde etmeyi bekleyebilirsiniz. Bu, ilk önce içbükeyinizi dışbükeyde parçalamanızın nedenlerinden biridir - ilk önce hangi parçanın vurulduğunu parçalı olarak tespit etmenizi sağlar. Tabii ki, bu da benim "Az gerçekçilik" başlığı altındaki yorumuma göre taklit edilebilir.

Dışbükey fikstürleriniz, nesneye hem anahat hem de sentroidini vermek için birleşir (ve elbette daha karmaşık simülasyonlarda, her fikstür de yoğunluğu farklı şekilde etkileyebilir). Bundan bahsetmemin sebebi, çarpışmaları gerçekçi bir şekilde çözerken, temas noktalarınızın her bir "alt çarpışmasını" takiben sadece lineer değil, aynı zamanda açısal dürtü de hesaplamanız gerekecek. SAT ile uyguladığınız temel "itme" kadar basit değildir.

Bu, probleminizin doğasını tamamen değiştirir, çünkü gördüğünüz gibi, 2 veya daha fazla temas noktası kullanmak ve kullanmak anlamsızdır , çünkü gerçekten önemli olan ilk şeydir. Daha sonra ilkini doğrusal ve açısal dürtü açısından çözdükten sonra, daha fazla çarpışma için yeniden hesaplamanız gerekir, çünkü her nesnenin yönleri değişmiş olacaktır. Ayrıca, adımdaki her bir tekil temasın algılanmasının aynı adımda yapılması gerekebilir veya gerekmeyebilir - nesnelerin ilk temas noktası dokunduğunda temaslar arasındaki zamanlamaya bağlı olarak, müteakip doğrusal ve açısal dürtü uygulanır, ikinci olarak temas noktası dokunur vb.

Daha az gerçekçilik

Tabii ki, açısal dürtü için çözmekle ilgilenmediğinizi varsayarsak, SAT ile yapabileceğiniz en iyi şey, bu çokgenleri Graham'ın Taraması gibi bir şey kullanarak dışbükey olarak sararsanız tam olarak ne yapacağınız olur: Tek ayırma ile birbirinden ayırmak vektör. Başka bir deyişle, gösterdiğiniz gibi, üç vektörü birlikte çözmeye çalışmak pek mantıklı değildir. Önemli olan en büyük grup.

Sorunuza yanıt olarak DÜZENLE

Basit bir yaklaşım istiyorsanız yapmanız gereken şudur:

  • Doğru yer değiştirme yönünü belirleyin . Bu en kolay şekilde her biri dışbükey gövde ve normalleri ayırma eksenine belirleyerek yapılır.

  • Şimdi deplasman büyüklüğünü belirlemelisiniz . Neden SAT tarafından verilen büyüklüğü kullanamıyoruz? Çünkü düşünürseniz, içbükeylik derinlikleri dışbükey gövdeler için potansiyel olarak içbükey gövdeleri için olduğundan daha büyük olacaktır - birbirleriyle dişleri olan iki E'yi düşünün! Yukarıda yaptığınız gibi, belirli bir adım için tüm temas noktalarını bulun, ancak bunları eksen normallerine paralel olarak bulun , çünkü bu doğru yer değiştirme yönüdür. Şimdi bu paralel örtüşme vektörlerinden hangisinin en uzun olduğunu belirleyin. Birini atın, gerisini atın ve bir sonraki fizik adımına geçin.


Ne demek istediğini anlıyorum. Yani "daha az gerçekçilik" senaryosunda sadece SAT'ın tek tek çokgenler için verdiği (en kısa) vektörleri değerlendirmekle kalmayacak, aynı zamanda diğer (daha büyük) çakışmaları ve en kötü durumda dışbükey gövdeyi kullanarak mı düşünmeliyim?
bummzack

Bkz. (En son) düzenleme.
Mühendis
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.