Bir füze ve bitmap arazisinin kesişim noktasını bulmanın en etkili yolu nedir?


10

Bir 2D bitmap arazisinin eğimini bulma hakkında önceki sorumu takip ederek, şimdi füzenin vurduğu 2D arazide noktayı bulmanın en iyi yolunu bilmem gerekiyor. Açıkçası, füzenin altındaki piksellerin araziyle kesişip kesişmediğini görebiliyorum, ancak arazinin oldukça derinlerine taşındığını söylüyor.

Başlangıçta nerede çarpıştığını bulmak için geri adım atmanın en iyi yolu nedir? Bir seferde X pikselleri füzenin önceki konumuna doğru hareket ettirebilirdim, ancak X'in iyi bir değeri ne olurdu? Daha akıllıca bir yol var mı? Belki mesafenin yarısı, sonra çeyrek vb.


Tanımladığınız fenomene genellikle "tünel açma" denir ve bununla başa çıkmanın en iyi yolu, TetraD ve JasonD'nin her ikisinin de aşağıda belirttiği gibi bir tarama testi uygulamaktır.
jpaver

sadece "süpürme testi" demek aslında bana yardımcı olmaz. Bir bitmap arazisiyle nasıl yaparım?
Iain

Jason'ın önerisi benim için en iyisi gibi görünüyor: her seferinde bir piksel.
jpaver

Yanıtlar:


3

Çarpışma testi için tick-by-tick statik test yapmamalısınız, iz / tarama testleri yapmalısınız.

Burada farklı ilkel çeşitler için çeşitli formüllerin kapsamlı bir listesi var: http://www.realtimerendering.com/intersections.html

Yani, elbette, arazinizi, test edebileceğiniz bir çeşit ilkel kümesine (yani çizgi segmentleri) ayırabileceğinizi varsayarsak. Bunu yapmanın çeşitli yolları vardır.

Ayrıca şu soruya bakın (sadece biraz ilgili): Hareketli küreler arasındaki çarpışmayı tespit etmek için iyi bir algoritma nedir?


Solucanlar'daki gibi yıkılabilir bir bitmap arazisi düşünüyordum. Bir bitmapten dinamik olarak temel öğeler oluşturabilir misiniz yoksa bu çok çılgın olur mu?
Iain

1
Eminim yapabiliyorsunuz, ancak keyfi bir bitmap için piksel testi yaparak piksel yapmak daha kolay / hızlı olabilir.
Tetrad

BİR QUADTREE İLE !! (bu yüzden sonsuza kadar sürmez)
bobobobo

3

İkili arama, ince manzara parçaları ve hızlı hareket eden mermileriniz varsa yardımcı olmaz - onları özleyebilirsiniz.

Bence en iyi seçeneğiniz, merminin önünden geçen yolu, bir kerede piksel boyunca bir çizgi süpürmektir. Her adımda yapmaktan kaçınmak için önce tüm birimde sınırlayıcı bir kontrol yapabilirsiniz.


İkili arama nedir?
Iain

1
Üzgünüz - ikili arama, soruda bahsettiğiniz şeydir. Ortadan başlıyorsunuz ve cevapta yakınlaşana kadar arama alanını ikiye bölüyorsunuz. Çoğu durumda en uygunudur, ancak sizin durumunuzda işe yaramaz (doğru cevabı tamamen atlayabilirsiniz).
JasonD

3

Füzenin her karede çok fazla piksel hareket etmesi olası olmadığından (ekranda düzgün olmaz) sadece yoldaki her pikseli kontrol etmek için bir neden göremiyorum. Bressenham çizgi algoritması sizin dostunuzdur ve genellikle her piksel için video belleğine erişmek istemediğiniz için bitmap'inizin yerel bir kopyasına sahip olduğunuzdan emin olun. Bu, bitmap arazinizin tamamen rastgele olduğunu varsayar (yıkılabilir solucanlar arazisine göre). Eğer dünyanız karo esaslıysa, başlangıçta boş olduğunu bildiğiniz her karoyu atlayabilirsiniz, ancak daha önce de belirtildiği gibi, kontrol etmek için büyük miktarda füzeniz yoksa, çok yavaş bir platform düşünemedim. sadece piksel piksel test etmek için ve dünyanızı ilkel olarak tanımlamanız gerekmeyecek (bir solucan klonu bunu zorlaştıracaktır)


evet Solucan benzeri bir arazi düşünüyordum. Döşemeleri dinamik olarak bölebilir misiniz, sonra boş döşemeleri işaretlenmeyecek şekilde işaretleyebilir misiniz? Bir seferde çok fazla füze olsaydı, belki de işleri biraz hızlandırabilirdi?
Iain

Sence, geriye doğru adım atmak yerine, pikseli piksel ilerletip kavşağı kontrol etmem gerektiğini mi düşünüyorsun?
Iain

Bence her üç cevap da ileri arama önerdi. İleri adım bazı manzarayı atlarsa geriye doğru kontrol etmek işe yaramaz.
JasonD

Evet, kesinlikle ileri.
Kaj

1

Diğer cevaplara ek olarak, bir grup pikseli "bilinen durum" bloklarına "toplamak" ile ilgili küçük bir defter tutma yapmak istiyorsanız bunu hızlandırmak için yapabileceğiniz bazı şeyler vardır. Örneğin, en yüksek arazi parçasının yüksekliğini saklayabilirsiniz, böylece füzenin bunun üstünde olduğu sürece hiçbir şeye çarpmayacağı kabul edilebilir. Ayrıca, en düşük "hava" alanının yüksekliğini de saklayabilirsiniz, böylece füze o yüksekliğe ulaşırsa, bir şeye çarpması gerektiğini bilirsiniz (bu en iyi akıl sağlığı kontrolü olarak kullanılabilir). Bundan da ötesi, tüm alanları temsil eden dikdörtgenleri ve hepsi hava olan diğer dikdörtgenleri depolayabilirsiniz, ancak bu değerden daha fazla iş olabilir.

Nihayetinde, en iyi yöntem muhtemelen "her arazi sütununun yüksekliğini depolamak" ve daha sonra füzenin yüksekliğini yolunun her adımında hesaplamak olacaktır. Daha modern oyunlarla konuşamam, ama Scorched Earth'te bir “mağara” yaptığınızda, o mağaranın üstündeki arazinin dümdüz bırakıldığına inanıyorum. Çıkıntılar istiyorsanız, çalışma biraz daha büyük olacak, ancak bu temel fikrin bir uzantısı olacaktır. (İpucu: önce temel fikri alın!)

Araziniz muhtemelen tamamen keyfi olduğundan, kısayol yoktur. Arazinizi bir spline veya bir şey olmaya zorlasanız bile, onu yok etmeye başladığınızda üzülecek ve line-spline kavşak testleri yinelemeli ve mükemmel olmayan veya kapsamlı ve problem tipiniz için anlamsız bir şekilde yavaş olacaktır.

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.