Hızlı, doğru 2D çarpışma algılamasını nasıl uygulayabilirim?


11

İki veya daha fazla 2B nesnenin çarpışıp çarpışmadığını nasıl tespit edeceğimin farkındayım ama bir çarpışmayı kontrol edip etmemeye nasıl karar vereceğim. Önceki projelerde, her nesneyi diğer tüm nesnelere karşı kontrol ettim (biliyorum, O (n ^ 2) aptallık seviyesi) ve daha az akıcı bir oyun yarattı.

Çeşitli forumlar Quadtrees'in, B-Ağaçların ve aklınıza gelebilecek diğer herhangi bir ağaç veya yapının büyüklüğüne sahiptir.

Bir çarpışmanın kontrol edilmesi gerekip gerekmediğini belirlemek için en verimli yapı nedir?


1
Dikkate almak isteyebileceğiniz bir şey, sadece hareket eden nesneler için çarpışmaları kontrol etmek ve sadece size yakın olan nesneler. Mevcut sistemim iyi çalışıyor (yüz binlerce nesne) - ve işte bu kadar.
ultifinitus

Bence gamedev.stackexchange.com/questions/14369/… size çok yardımcı olabilir. Başlangıçta paralel işleme için tasarlanmıştı ve algoritma da aynı algoritmanın tek iş parçacıklı uygulamaları da geliştirebileceğini düşünüyorum.
Ali1S232

1
@ultifinitus Aslında sorduğum şey bu. Her nesneyi yinelemeden ve konumunu kontrol etmeden yakınlarda hangi nesnelerin bulunduğunu nasıl belirleyebilirim?
Mike Cluck

Mike, kullandığım belirli bir kod için bana e-posta gönderebilirsin, c ++ 'da ya da sana temel yapıyı verebilirim, ancak bu yüzden oldukça belirsiz ve karmaşık olabilir.
ultifinitus

1
Bu bir kopya değil, çünkü bir çarpışma kontrolü yapmaktan rahatsız olup olmadığımızı belirlemek için ne tür bir yapının en uygun olduğunu soruyordum. Bu diğer soru şeffaf ve şeffaf olmayan çarpışmalar hakkında soruyordu. Bahsetmemek gerekirse, bu soru bağlandığınız sorudan yaklaşık bir yıl önce soruldu.
Mike Cluck

Yanıtlar:


12

2D bir oyun için, 2B nesnelerin haritanızın bir tarafına çok ağır bir dağılımı yoksa, tekdüze bir ızgara hemen hemen her zaman yoludur. Bellek karmaşıklığı basittir (haritanızın boyutlarıyla orantılıdır) ve makul bir dağılımla O (1) arama süresi ve ortalama bir günlük (numberOfObjects / (satır * sütunlar)) ^ 2 kavşak testi vardır hücre başına yapılır. Yalnızca içinde nesne hareket eden hücreleri kontrol etmeye karar verebilirsiniz, bu da statik geometriyi daha verimli hale getirir. Düzgün bir ızgarayı anında değiştirmek kolaydır (ağaç bazlı çözümlere göre çok daha az ağrı) ve uygulanması daha kolaydır. Bir 2D oyunda kullanmamayı söyleyeceğim tek zaman, tek biçimli bir ızgaranın bellek gereksinimlerinin çok büyük hale gelmesidir (seviyelerin seyrek ama muazzam olduğu bir uzay simini söyleyin).


Bu çözüm, 2 veya 4 ızgara hücresini sınırlayan nesnelerle nasıl ilgilenir?
ashes999

1
Nesnenin üst üste geldiği herhangi bir hücre, içinde olduğu kabul edilir, böylece bir nesne birden fazla hücrede olabilir. Çoğu uzamsal veri yapısı, örtüşmeler konusunu benzer şekilde ele alacaktır.
Darcy Rayner

Vay be, bu önceden akıllı. +1 Şerefe ahbap.
ashes999


1

Dünyanız diğerlerine kıyasla çok "uzun" bir boyuta (X olarak adlandırın) sahipse, nesneleri hareket ettikçe yeniden sıralayabileceğiniz sıralı bir listede tutabilirsiniz ve çarpışma algılama yalnızca X ekseninde üst üste binme.

Başka bir olasılık, aktif / pasif nesne listelerini tutmak ve pasif nesnelerle (hiç hareket etmiyor) rahatsız etmemektir.

Eğer hepsi ekranda oynatıcı tarafından görülebilen orta büyüklükteki nesneler ise, her şeye karşı her şey muhtemelen çok kötü değildir.

Bunun dışında, Darcy ile birlikteyim, tek tip bir ızgara iyidir.

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.