- Sebagian besar layar 2D / sistem koordinat bitmap memiliki sumbu Y positif mengarah ke bawah (dengan asal di sudut kiri atas).
- Ini bertentangan dengan bagaimana kebanyakan orang berpikir secara geometris dengan sumbu Y positif mengarah ke atas (dengan asal di tengah).
Bagaimana sebagian besar game mengelola dua sistem koordinat 2D yang berbeda? Ada dua jenis utama koordinat (layar vs Cartesian), tetapi mungkin ada banyak ruang koordinat yang berbeda: ruang sprite, ruang dunia, ruang tampilan, ruang layar, dll ...
Latar Belakang:
Saya awalnya membuat koordinat dunia dalam game saya cocok dengan konvensi koordinat layar 2D. Ini membuatnya sangat alami untuk menggunakan rutinitas menggambar grafik, tetapi masalah halus muncul ketika menggunakan fungsi trigonometri seperti atan2 (). Hasil pengumpanan atan2 () koordinat layar 2D sangat membingungkan karena atan2 () mengasumsikan sumbu y positif mengarah ke atas.
Jadi saya mengubah koordinat dunia saya untuk mengikuti sistem koordinat Cartesian klasik (dengan asal di bagian kiri bawah layar). Penalaran dengan atan2 () jauh lebih mudah, tetapi sekarang lebih sulit untuk melakukan jenis penalaran lain:
- Jika saya mengklik layar di sini, sprite apa yang ada di bawahnya?
- Di mana saya mengklik sprite itu?
- Jika sprite diambil di lokasi yang salah, apa yang salah dihitung? Layar koordinat atau koordinat dunia?
Saya menyadari konversi dari layar ke koordinat Cartesian hanya melibatkan penskalaan nilai y dengan -1 dengan terjemahan opsional dari kedua nilai (x, y). Saya lebih tertarik dengan praktik terbaik untuk desain game:
- Apakah sebagian besar game hanya bertahan dengan konvensi koordinat layar dan mengubah pemikiran mereka tentang bagaimana hal-hal seperti atan2 () harus bekerja?
- Kapan / bagaimana konversi sistem koordinat dilakukan? (Menggunakan matriks, abstraksi OOP, dll)
- Apakah lokasi sprite disimpan sebagai pusat sprite atau salah satu sudut? Tinggi / lebar sprite yang mengarah ke arah yang "salah" tampaknya menjadi masalah yang umum ketika saya menggambar mereka.
Meskipun pertanyaan saya terutama tentang game 2D, tampaknya OpenGL menggunakan sistem koordinat di mana sumbu Y mengarah. OpenGL akhirnya harus memproyeksikan koordinat 3D tersebut ke sistem koordinat layar 2D. Mungkin beberapa panduan dapat ditemukan dalam metode OpenGL ...
sumber
Saya lebih suka menggunakan tampilan pohon seperti di Flash. Saya akan memiliki simpul akar (tampilan permainan) yang berisi anak untuk dunia (simpul dunia) dan satu di atas untuk HUD. Di dalam simpul dunia akan menjadi simpul untuk objek di dunia game.
Saya kemudian hanya mengubah simpul dunia. Bersamaan dengan terjemahan (panning kamera) dan penskalaan proporsional (zoom kamera) saya juga menerapkan dua transformasi lainnya:
Saya kemudian menggunakan koordinat y-up / world dalam kode menggambar objek game dan koordinat y-down / layar dalam kode menggambar HUD, yang keduanya terasa sangat alami.
Untuk menjawab pertanyaan seperti "objek apa yang saya klik" Saya menggunakan metode tampilan node untuk mengkonversi koordinat antara sistem koordinat (seperti
globalToLocal
dan kebalikannya di Flash).Ngomong-ngomong,
atan
tidak benar-benar bekerja secara berbeda ketika Anda turun, Anda hanya perlu memikirkan semua sudut sebagai arah jarum jam, bukan berlawanan arah jarum jam.sumber
OpenGL, seperti DirectX, memiliki sumbu X dan Z di sepanjang bidang horizontal dan Y menghadap ke atas.
Saya tidak pernah memiliki masalah dengan koordinat layar, dan saya pikir cara termudah adalah dengan memperlakukannya seperti itu: jika sesuatu, seperti atan2, tidak menyukainya, maka ubah parameter yang diumpankan.
Jika Anda menggunakan koordinat relatif atau lokal, seperti grafik adegan, maka fungsi sederhana seperti ToGlobalCoords () bagus. Bahkan, jika Anda ingin mempelajari lebih lanjut tentang penentuan posisi spasial, grafik adegan, dan localToGlobal, ekstrak gratis dari Game Engine Architecture adalah tentang itu.
Sprite diambil dari sudut kiri atas atau (0,0) asal. Alasan mengapa adalah karena asal kiri atas jendela.
Tampaknya agak konyol untuk mengubah sistem koordinat jendela, dan akan membuat hal-hal seperti input, yang memainkan peran yang lebih besar untuk sebagian besar gim daripada trigonometri, secara signifikan lebih sulit. Ini juga mengasingkan Anda dari norma dan semua pengguna kode Anda.
sumber