No Çarpışma tespiti değil , her zaman O (N ^ 2).
Örneğin, 10x10 boyutunda nesnelerle 100x100 alanımız olduğunu varsayalım. Bu alanı 10x10 hücrelerinde bir ızgara ile bölebiliriz.
Her nesne en fazla 4 ızgara hücresinde olabilir (bir bloğa tam olarak sığabilir veya "hücreler arasında" olabilir). Her hücredeki nesnelerin bir listesini tutabiliriz.
Sadece bu hücrelerdeki çarpışmaları kontrol etmemiz gerekiyor. Izgara hücresi başına maksimum sayıda nesne varsa (aynı blokta asla 4'ten fazla nesne yoksa), her nesne için çarpışma algılama O (1) ve tüm nesneler için çarpışma algılama O (N) olur.
O (N ^ 2) karmaşıklığını önlemenin tek yolu bu değildir. Diğer kullanım durumları için daha yeterli olan - genellikle ağaç tabanlı veri yapılarını kullanan başka yöntemler vardır.
Açıkladığım algoritma bir tür Uzay bölümlemesidir , ancak başka uzay bölümleme algoritmaları da vardır. O (N ^ 2) zamansal karmaşıklığını önleyen bazı algoritmalar için bkz . Alan bölümleme veri yapılarının türleri .
Hem Box2D hem de Bullet, kontrol edilen çift sayısını azaltmak için mekanizmaları destekler.
Gönderen kılavuzda , bölüm 4.15:
Bir fizik adımında çarpışma işleme, dar faz ve geniş faza ayrılabilir. Dar fazda, şekil çiftleri arasındaki temas noktalarını hesaplıyoruz. N şeklimiz olduğunu hayal edin. Kaba kuvvet kullanarak, N * N / 2 çiftleri için dar fazı gerçekleştirmemiz gerekir.
B2BroadPhase sınıfı, çift yönetimi için dinamik bir ağaç kullanarak bu yükü azaltır. Bu, dar faz çağrılarının sayısını büyük ölçüde azaltır.
Normalde geniş faz ile doğrudan etkileşime girmezsiniz. Bunun yerine, Box2D dahili olarak geniş bir faz oluşturur ve yönetir. Ayrıca, b2BroadPhase, Box2D'nin simülasyon döngüsü göz önünde bulundurularak tasarlanmıştır, bu nedenle diğer kullanım durumları için uygun değildir.
Gönderen Bullet Wiki :
Sadece çiftlerin tam listesini döndüren naif O (n ^ 2) algoritmasını geliştiren çeşitli geniş fazlı algoritmalar vardır. Bu optimize edilmiş geniş fazlar bazen daha da çarpışmasız çiftleri ortaya çıkarır, ancak bu genel olarak iyileştirilmiş yürütme süreleri ile dengelenir. Farklı performans özelliklerine sahiptirler ve hiçbiri her durumda diğerlerinden daha iyi performans göstermez.
Dinamik AABB Ağacı
Bu, Bullet'teki btDbvtBroadphase tarafından uygulanır.
Adından da anlaşılacağı gibi, bu dinamik bir AABB ağacı . Bu geniş fazın kullanışlı bir özelliği, yapının dünyanın boyutlarına ve içeriğine dinamik olarak uyum sağlamasıdır. Çok iyi optimize edilmiş ve çok iyi bir genel amaçlı geniş faz. Birçok nesnenin hareket halinde olduğu dinamik dünyaları ele alır ve nesne ekleme ve kaldırma SAP'den daha hızlıdır.
Süpürme ve Kurulama (SAP)
Bullet'te bu AxisSweep sınıf aralığıdır. Bu aynı zamanda, önceden bilinen sabit bir dünya boyutu gerektirmesi sınırlaması ile iyi bir genel amaçlı geniş fazdır. Bu geniş faz, çoğu nesnenin hareketinin çok az olduğu veya hiç hareket etmediği tipik dinamik dünyalar için en iyi performansa sahiptir. Hem btAxisSweep3 hem de bt32AxisSweep3, performansı artırmak için her bir eksenin başlangıç ve bitiş noktalarını kayan nokta sayıları yerine tamsayı olarak hesaplar.
Aşağıdaki bağlantı, geniş faza genel bir giriş ve ayrıca Süpürme ve Kurulama algoritmasının bir açıklamasıdır ("Sırala ve Süpür" olarak adlandırılmasına rağmen):
http://www.ziggyware.com/readarticle.php?article_id=128
Ayrıca wikipedia sayfasına bir göz atın:
http://en.wikipedia.org/wiki/Sweep_and_prune