İzometrik bir görünüm flash oyununda çizim sırasını nasıl belirlerim?


12

Bu izometrik manzaralı bir flash oyun içindir. Çizim sırasında z-buffer denetimi gerek yok böylece nesne sıralamak için bilmek gerekir. Bu kolay görünebilir, ancak başka bir kısıtlama vardır, bir sahnede 10.000'den fazla nesne olabilir, bu nedenle algoritmanın O (n ^ 2) 'den daha azında çalıştırılması gerekir. Tüm nesneler dikdörtgen kutulardır ve sahnede hareket eden 3-4 nesne vardır. Bunu yapmanın en iyi yolu nedir?

GÜNCELLEME

her döşemede sadece nesne vardır (yani nesneler üst üste istiflenemez). ve hem Objeler hem de Objeler haritasına erişiyoruz.

Update2

şu rakamlara bakın:

resim açıklamasını buraya girin resim açıklamasını buraya girin

ilk önce ilk mavi nesne sonra yeşil, sonra kırmızı çizilmelidir. ikincisinde ise ters sırada çizmeniz gerekir. önce kırmızı, sonra yeşil ve son olarak mavi nesne çizmeniz gerekir. gördüğünüz gibi mavi ve kırmızı nesnelerin konumlarında hiçbir fark yoktur, her ikisinin de kameradan farklı mesafeleri vardır. ancak yeşil kutuya göreceli konumları nedeniyle, iki resim arasındaki çizim sırasını değiştirmeniz gerekir. bu sorunu dağınık yapan da budur.

yan not: tüm nesneler dikdörtgen prizma olduğundan, problem ihtiyaçlarını karşılamak için en az bir çizim sırası olduğu matematiksel olarak kanıtlanabilir.


2
Daha fazla bilgi göndermelisiniz. Nesneler istiflenebilir mi (3d)? Nesnelerin konumları veya haritada nesneler mi var? vb.
kaoD


@ Tetrad evet, ama sahneye koyduğumuz nesneler arasında biraz küçük bir fark var.
Ali1S232

@Gajet (güncellemenizden sonra) nesneler yalnızca 1 * X ve X * 1 veya ayrıca X * Y olabilir mi? Nesneleri birkaç alt nesneye bölmeyi göze alabilir misiniz? (yeşilin 4 alt yeşil nesne olması gibi) Nesnenin yönü sabit mi?
kaoD

Ayrıca: nesnenizin yüksekliği kaç bitişik karo gizliyor?
kaoD

Yanıtlar:


8

Nesneleriniz izometrik karolarınızla eşleşiyorsa bu aslında çok basittir. Bu resme bir göz atın:

İzometrik çizim sırası

Önce nesneyi kırmızı konumda, sonra mavi, sonra yeşil, sonra sarı, sonra macenta vb. Çizmelisiniz ... Tahtanızda nesneler yerine nesneler varsa bunu nasıl uygulayacağınız oldukça açık olmalıdır. nitelik olarak pozisyona sahip. Durumunuz bu değilse, bir nesne hareket ettiğinde güncelleyen ayrı bir veri yapısı tutmalısınız (bu da oldukça kolay olmalıdır).

Bunun yeni bir sorunu var: karmaşıklığının O (N) olduğunu ve N'nin tahta boyutunuz ( N=W*H) olduğunu kolayca görebilirsiniz . Bu sorunun üstesinden gelmek için, yapınızdaki her dizinin belirli bir derinlikle eşleştiği yeni bir doğrusal veri yapısı oluşturun ve bir nesne derinliği her değiştiğinde güncelleyin.

Bir nesnenin tek bir döşemeyle eşleşmediği durum biraz daha zordur, bu yüzden sorunuzu güncellediğiniz anda ihtiyacınız olursa gönderirim.


bu algoritma da ilk aklıma geldi, ama güncellememe bakın, bu yüzden bir değişiklik yapmadan kullanamazsınız.
Ali1S232

1
@Gajet ve ilk etapta sorunuzda yayınlamanız gereken bir şey: P
kaoD


2

Bu konuda özel bir bilgim yok, ama işte bir düşünce.

Her hücreyi "çizilmedi" olarak işaretleyerek başlayın. (Ya da, eşdeğer olarak, hücrelerin her "en yakın çizgisinde" en yakın "çizilmiş" şeyin konumunu veya bir kümeyi, vb. Temsil etmek için bir dizi kullanın.) Sonra, her hücre için (muhtemelen tarif edilen kaoD sırası): bu hücrenin çizilip çizilmediğini kontrol edin; çizilmemişse ve bir nesne içeriyorsa, o nesne tarafından gizlenecek her hücrenin çizilip çizilmediğini kontrol edin ve eğer tekrarlamıyorsa; gerekirse bu hücrenin içerdiği nesneyi çizin; ve bu hücreyi ve nesnesi tarafından işgal edilen hücreleri "çizilmiş" olarak işaretleyin.

Varsa, bir hücreyi içindeki nesneyle hızlıca eşleştirebileceğinizi varsayıyorum. Ben o (n) zaman olduğuna inanıyorum, ancak (yığın alanı tükenme konusunda endişeli iseniz bağlantılı bir listeye dönüştürmek isteyebilirsiniz) büyük bir yığın inşa sonunda olabilir.

Gerçekten bir listeye ihtiyacınız varsa, çizim yerine bir listeye ekleyebilirsiniz. Çoğunlukla sıralanmış bir listeden başlamanın yardımcı olmadığını düşünüyorum.


Bu algoritmanın probleme uyarlanmış bir topolojik çeşit biçimi olarak görülebileceğine inanıyorum ; Kendimi belirsiz bir şekilde bu yöne çekmek üzereydim. Topolojik sıralama çoğu sipariş / bağımlılık sorununa bir çözümdür.
Kevin Reid

1

Bana kalırsa doğru ressamın algoritmasını ilk kameraya en yakın olanları çizim ve ardından dışarı hareket, kameradan en uzağa hücreden bir taksi mesafe ile.

Düzenle: Her hücrenin içeriğini ayrı ayrı çizemediğiniz sürece bu çalışmaz.


Bu işe yarayabilir, ancak önerilen algoritma byte56 veya kaoD farklı olduğunu söyleyemem. bana göre hala ikinci düzenlememde anlatılanla aynı problemleri var.
Ali1S232

1

Sizi “problem ihtiyaçlarını karşılamak için en az bir çekiliş siparişinin matematiksel olarak kanıtlanabilir” olduğuna inandıran nedir? İşte z-sıralama nesnelerine güvenemeyeceğiniz önemsiz bir karşı örnek:

resim açıklamasını buraya girin


Sadece meraktan ... karşı örneği ayrıntılı olarak açıklayabilir misiniz? Bu bir ızgara değil.
kaoD

her döşemede yalnızca bir nesne olduğunu ve nesnenin bir veya daha fazla döşemeyi içerebileceğini, ancak her zaman düzlemde dikdörtgen çıkıntıya sahip olduklarını unutmayın. bu iki durum bu ifadeyi kanıtlamak için yeterlidir.
Ali1S232

Tamam, bu kısıtlamalar ve şebekenin düz olması gerçeği ile bir çözüm var. Daha sonra göndereceğim.
sam hocevar
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.