- Çoğu 2D ekran / bitmap koordinat sistemi, aşağı doğru işaret eden pozitif Y eksenine (menşe sol üst köşedeki) sahiptir.
- Bu, çoğu insanın pozitif Y ekseni yukarı bakacak şekilde (merkezdeki orijinli) geometrik olarak nasıl düşündüklerine karşıdır .
Çoğu oyun iki farklı 2D koordinat sistemini nasıl yönetir? İki ana tür koordinat vardır (ekrana karşılık Kartezyen), ancak birçok farklı koordinat alanı olabilir: sprite alanı, dünya alanı, görüntüleme alanı, ekran alanı vb.
Arka fon:
Başlangıçta oyunumdaki dünya koordinatlarını 2D ekran koordinat kurallarına uydurdum. Bu, grafik çizme yordamlarını kullanmayı çok doğal hale getirdi, ancak atan2 () gibi trigonometrik işlevler kullanıldığında ortaya çıkan ince konular ortaya çıktı. Atan2 () 2B ekran koordinatlarını beslemenin sonuçları çok kafa karıştırıcı çünkü atan2 () pozitif y ekseninin işaret ettiğini varsayıyor.
Böylece dünya koordinatlarımı klasik Kartezyen koordinat sistemini (ekranın sol alt köşesinde bulunan) takip edecek şekilde değiştirdim. Atan2 () ile muhakeme, çok daha yalındır, ancak şimdi diğer akıl yürütme türlerini yapmak daha zor:
- Buradaki ekranı tıklarsam, altındaki sprite nedir?
- O sprite nereye tıkladım?
- Bir sprite yanlış yere çizilirse, yanlış ne hesaplandı? Ekran koordinatları mı yoksa dünya koordinatları mı?
Ekrandan Kartezyen koordinatlarına dönüşümün, her iki (x, y) değerin isteğe bağlı olarak çevrilmesi ile y değerini -1 ile ölçeklendirmesini içerir. Oyun tasarımı için en iyi uygulamalarla daha çok ilgileniyorum:
- Oyunların çoğu ekran koordinatına uyuyor ve atan2 () gibi şeylerin nasıl çalışması gerektiği hakkındaki düşüncelerini değiştiriyor mu?
- Koordinat sistemi dönüşümleri ne zaman / nasıl yapılır? (Matris kullanma, OOP soyutlama, vb.)
- Sprite konumları sprite merkezi olarak mı yoksa köşelerden biri olarak mı depolanıyor? Sprite 'yükseklik / genişlik "yanlış" yönde gidiyor ben onları çizerken yaygın bir sorun gibi görünüyor.
Sorumun esas olarak 2D oyunlar hakkında olmasına rağmen, OpenGL Y ekseninin işaret ettiği bir koordinat sistemi kullanıyor gibi görünüyor. OpenGL sonunda bu 3B koordinatları 2B ekran koordinat sistemine yansıtmalıdır. Belki OpenGL'nin metodunda bazı rehberlikler bulunabilir ...