Saya menulis permainan 2D di mana dunia permainan saya memiliki sumbu x yang berjalan dari kiri ke kanan, sumbu y berjalan dari atas ke bawah, dan sumbu z keluar dari layar:
Sementara dunia gim saya top-down, gim ini sedikit miring:
Saya sedang mengerjakan proyeksi dari ruang dunia ke ruang layar, dan sebaliknya. Saya memiliki mantan bekerja sebagai berikut:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
The NegateY()
metode penyuluhan tidak persis apa yang terdengar seperti, karena XNA ini y sumbu berjalan bawah ke atas, bukan atas ke bawah. Tangkapan layar di atas menunjukkan ini berfungsi semua. Pada dasarnya, saya memiliki banyak titik dalam ruang 3D yang kemudian saya render dalam ruang layar. Saya dapat memodifikasi properti kamera secara real time dan melihatnya hidup dengan posisi baru. Jelas permainan saya yang sebenarnya akan menggunakan sprite daripada poin dan posisi kamera akan diperbaiki, tapi saya hanya mencoba untuk mendapatkan semua matematika di tempatnya sebelum sampai ke sana.
Sekarang, saya mencoba untuk mengkonversi kembali ke arah lain. Artinya, diberi titik x dan y di ruang layar di atas, tentukan titik yang sesuai di ruang dunia. Jadi jika saya arahkan kursor ke, katakanlah, kiri bawah trapesium hijau, saya ingin mendapatkan pembacaan ruang dunia dari (0, 480). The z koordinat tidak relevan. Atau, lebih tepatnya, koordinat z akan selalu nol ketika memetakan kembali ke ruang dunia. Pada dasarnya, saya ingin menerapkan metode tanda tangan ini:
public Vector2 ScreenPointToWorld(Vector2 point)
Saya sudah mencoba beberapa hal untuk membuatnya bekerja tetapi saya tidak beruntung. Pemikiran terakhir saya adalah bahwa saya perlu menelepon Viewport.Unproject
dua kali dengan nilai z dekat / jauh yang berbeda , menghitung hasilnya Ray
, menormalkannya, lalu menghitung persimpangan Ray
dengan Plane
yang pada dasarnya mewakili permukaan tanah dari dunia saya. Namun, saya terjebak pada langkah terakhir dan tidak yakin apakah saya terlalu rumit.
Adakah yang bisa mengarahkan saya ke arah yang benar tentang cara mencapai ini?