Bagaimana mesin game 3D merender lingkungan 3D ke layar 2D?
9
Untuk game sprite 2D, saya dapat memahami bahwa sprite bergerak pada sumbu X dan Y. Namun, untuk game 3D, bagaimana mesin game menghitung cara membuat lingkungan 3D ke monitor komputer 2D datar?
Magic Imps mendesain daratan dan kemudian menembak gambar ke layar menggunakan tongkat sihir mereka.
Math.PIbanyak.
Nick Bedford
Jawaban:
10
Sprite 3D mendapatkan sumbu Z baru yang menyimpan kedalaman, ukuran penskalaan dan gerakan di bidang X / Y. Sprite yang lebih jauh memiliki nilai Z yang lebih besar. Sekarang, bagi ukuran sprite dan gerakan sumbu X / Y dengan sumbu Z. Seperti yang telah dicatat orang lain, ini adalah proyeksi perspektif 3D . Inilah ilustrasi terbaik yang bisa saya temukan:
Ini masuk akal secara konseptual karena hal-hal yang lebih jauh terlihat lebih kecil. Gerakan mereka yang tampak juga terlihat lebih kecil.
Selain itu, objek dekat harus digambar di atas objek jauh. Sekali lagi, ini masuk akal secara konseptual karena objek dekat menghalangi pandangan objek di belakangnya.
Teknik-teknik ini dapat diimplementasikan pada tingkat sprite. Namun, untuk proyeksi paling realistis, setiap sprite memiliki model 3D dan ditampilkan pada tingkat piksel.
Diagram itulah yang membuat saya. Sebuah gambar bernilai ribuan kata.
Kim Jong Woo
17
Ini mirip dengan bagaimana Anda dapat mengambil gambar 2D dunia kami di kamera. Lingkungan 3D dijelaskan dalam hal koordinat X, Y, dan Z, tetapi pada akhirnya Anda perlu memetakannya ke layar 2D dengan hanya sumbu X dan Y. Ini dilakukan dengan proyeksi , di mana setiap titik 3D diproyeksikan ke bidang tampilan 2D.
Sederhananya, Anda dapat membayangkan garis proyeksi dari kamera virtual dalam ruang 3D ke setiap titik 3D dengan melewati bidang tampilan. Titik di mana garis proyeksi memotong bidang 2D adalah proyeksi titik 3D. Dalam proyeksi ortografis, garis proyeksi ini semuanya paralel; jarak antara objek dan kamera tidak membuat perbedaan untuk bentuk yang diproyeksikan. Jenis proyeksi ini tidak realistis tetapi berguna dalam kasus-kasus tertentu seperti menggambar grafik 2D menggunakan mesin 3D (HUD misalnya). Jenis proyeksi lainnya adalah proyeksi perspektif di mana garis-garis ini bertemu membuat objek yang lebih jauh tampak lebih kecil dan memberikan hasil yang lebih realistis. Halaman ini memiliki beberapa angka yang dapat membantu Anda memvisualisasikan proses.
Proyeksi adalah salah satu dari beberapa objek transformasi yang dialami dalam pipa grafik , dan biasanya dilakukan dengan menggunakan matriks proyeksi . Perhatikan bahwa meskipun proyeksi menyiratkan membuang koordinat Z, pada kenyataannya nilai Z yang ditransformasikan masih menggunakan ukuran kedalaman layar sehingga kita dapat mengetahui objek mana yang terlihat dan mana yang terhalang oleh objek lain. Ini dikenal sebagai z-buffering .
Ini semua tentang proyeksi , operasi geometris yang memungkinkan Anda menentukan ruang dari ruang lain dengan dimensi superior (pada dasarnya, dalam kasus Anda, Anda menggambarkan gambar 2D dari lingkungan 3D).
Sederhananya, ini adalah bagaimana mesin rendering 3D menghasilkan gambar (diberikan adegan 3D & proyeksi):
Untuk setiap piksel dari gambar yang dihasilkan
Hitung arah yang dicari (sesuai dengan proyeksi), itu pada dasarnya adalah vektor 3D
Temukan objek terdekat dalam adegan Anda yang "terlihat" dalam arah ini (cukup tebak objek apa yang berpotongan dengan vektor, dan simpan objek terdekat)
Hitung warna objek ini, Anda memiliki warna pixel!
Tentu saja ini adalah model yang sederhana, saya tidak berbicara tentang objek reflektif / bias / tembus efek khusus seperti asap ...
Matriks . Atau lebih tepatnya, banyak matrik matematika.
Ini hal yang menakutkan bagi yang belum tahu. Biasanya ada tiga matriks 4x4 yang terlibat dalam mengubah sekelompok koordinat 3D dalam ruang menjadi koordinat 2D di layar (termasuk kedalaman ke layar sebagai Z).
Matriks 3D adalah seperangkat 16 nilai floating point yang diatur dalam kisi 4x4. Algoritma digunakan untuk menghasilkan nilai-nilai yang dibutuhkan dan kemudian menggunakan perkalian matriks-vektor, angka-angka ini mentransformasikan vektor 3 dimensi (X, Y, Z).
[1,0,0,0][0,1,0,0][0,0,1,0][0,0,0,1]
Ini adalah matriks identitas . Ini pada dasarnya tidak melakukan apa pun terhadap koordinat vektor.
Model
Yang pertama adalah dunia atau matriks model . Matriks ini mengambil simpul dalam model individual (seperti peti) yang dimodelkan di sekitar titik asal (0, 0, 0) dan mentransformasikannya menjadi koordinat titik dunia. Ini mungkin termasuk penskalaan objek, memutarnya di sekitar asalnya dan akhirnya menerjemahkannya ke tempat ia berada di tempat kejadian.
Melihat
Matriks kedua adalah view matrix. Ini mengambil koordinat dunia dan mengubahnya sehingga mereka berada dalam konteks tampilan. Konsep kamera biasanya digunakan untuk menghasilkan matriks ini.
Kamera biasanya berisi vektor posisi , vektor arah atau target , dan vektor atas . Ini sampai vektor menggambarkan 'berputar' kamera.
Vektor ini digunakan untuk menghasilkan apa yang disebut dengan melihat matriks.
Pengaruh yang dimilikinya mirip dengan matriks dunia dalam kenyataan bahwa ia pada dasarnya memutar dan menerjemahkan dunia di sekitar kamera untuk "memposisikan" kamera.
Kamera yang 10 unit di sepanjang sumbu X akan menerjemahkan koordinat dunia 10 unit ke arah lain.
Proyeksi
Bagian terakhir dari teka-teki adalah matriks proyeksi . Dalam proyeksi perspektif seperti kamera, matriks mentransformasikan hampir layar koordinat untuk memberikan ilusi perspektif dengan bidang pandang x derajat.
Jika Anda berpikir tentang sudut-sudut layar (untuk game 640x480), ini adalah bagaimana proyeksi "meluruskan" koordinat di sepanjang sumbu Z dalam koordinat 2D layar. Untuk proyeksi ortografis, tidak ada penskalaan yang terjadi di sepanjang sumbu Z ke layar. Untuk perspektif, semakin jauh objek, semakin kecil hubungannya dengan luasan layar.
Math.PI
banyak.Jawaban:
Sprite 3D mendapatkan sumbu Z baru yang menyimpan kedalaman, ukuran penskalaan dan gerakan di bidang X / Y. Sprite yang lebih jauh memiliki nilai Z yang lebih besar. Sekarang, bagi ukuran sprite dan gerakan sumbu X / Y dengan sumbu Z. Seperti yang telah dicatat orang lain, ini adalah proyeksi perspektif 3D . Inilah ilustrasi terbaik yang bisa saya temukan:
Ini masuk akal secara konseptual karena hal-hal yang lebih jauh terlihat lebih kecil. Gerakan mereka yang tampak juga terlihat lebih kecil.
Selain itu, objek dekat harus digambar di atas objek jauh. Sekali lagi, ini masuk akal secara konseptual karena objek dekat menghalangi pandangan objek di belakangnya.
Teknik-teknik ini dapat diimplementasikan pada tingkat sprite. Namun, untuk proyeksi paling realistis, setiap sprite memiliki model 3D dan ditampilkan pada tingkat piksel.
sumber
Ini mirip dengan bagaimana Anda dapat mengambil gambar 2D dunia kami di kamera. Lingkungan 3D dijelaskan dalam hal koordinat X, Y, dan Z, tetapi pada akhirnya Anda perlu memetakannya ke layar 2D dengan hanya sumbu X dan Y. Ini dilakukan dengan proyeksi , di mana setiap titik 3D diproyeksikan ke bidang tampilan 2D.
Sederhananya, Anda dapat membayangkan garis proyeksi dari kamera virtual dalam ruang 3D ke setiap titik 3D dengan melewati bidang tampilan. Titik di mana garis proyeksi memotong bidang 2D adalah proyeksi titik 3D. Dalam proyeksi ortografis, garis proyeksi ini semuanya paralel; jarak antara objek dan kamera tidak membuat perbedaan untuk bentuk yang diproyeksikan. Jenis proyeksi ini tidak realistis tetapi berguna dalam kasus-kasus tertentu seperti menggambar grafik 2D menggunakan mesin 3D (HUD misalnya). Jenis proyeksi lainnya adalah proyeksi perspektif di mana garis-garis ini bertemu membuat objek yang lebih jauh tampak lebih kecil dan memberikan hasil yang lebih realistis. Halaman ini memiliki beberapa angka yang dapat membantu Anda memvisualisasikan proses.
Proyeksi adalah salah satu dari beberapa objek transformasi yang dialami dalam pipa grafik , dan biasanya dilakukan dengan menggunakan matriks proyeksi . Perhatikan bahwa meskipun proyeksi menyiratkan membuang koordinat Z, pada kenyataannya nilai Z yang ditransformasikan masih menggunakan ukuran kedalaman layar sehingga kita dapat mengetahui objek mana yang terlihat dan mana yang terhalang oleh objek lain. Ini dikenal sebagai z-buffering .
sumber
Ini semua tentang proyeksi , operasi geometris yang memungkinkan Anda menentukan ruang dari ruang lain dengan dimensi superior (pada dasarnya, dalam kasus Anda, Anda menggambarkan gambar 2D dari lingkungan 3D).
Sederhananya, ini adalah bagaimana mesin rendering 3D menghasilkan gambar (diberikan adegan 3D & proyeksi):
Untuk setiap piksel dari gambar yang dihasilkan
Tentu saja ini adalah model yang sederhana, saya tidak berbicara tentang objek reflektif / bias / tembus efek khusus seperti asap ...
sumber
Matriks . Atau lebih tepatnya, banyak matrik matematika.
Ini hal yang menakutkan bagi yang belum tahu. Biasanya ada tiga matriks 4x4 yang terlibat dalam mengubah sekelompok koordinat 3D dalam ruang menjadi koordinat 2D di layar (termasuk kedalaman ke layar sebagai Z).
Matriks 3D adalah seperangkat 16 nilai floating point yang diatur dalam kisi 4x4. Algoritma digunakan untuk menghasilkan nilai-nilai yang dibutuhkan dan kemudian menggunakan perkalian matriks-vektor, angka-angka ini mentransformasikan vektor 3 dimensi (X, Y, Z).
Ini adalah matriks identitas . Ini pada dasarnya tidak melakukan apa pun terhadap koordinat vektor.
Model
Yang pertama adalah dunia atau matriks model . Matriks ini mengambil simpul dalam model individual (seperti peti) yang dimodelkan di sekitar titik asal (0, 0, 0) dan mentransformasikannya menjadi koordinat titik dunia. Ini mungkin termasuk penskalaan objek, memutarnya di sekitar asalnya dan akhirnya menerjemahkannya ke tempat ia berada di tempat kejadian.
Melihat
Matriks kedua adalah view matrix. Ini mengambil koordinat dunia dan mengubahnya sehingga mereka berada dalam konteks tampilan. Konsep kamera biasanya digunakan untuk menghasilkan matriks ini.
Kamera biasanya berisi vektor posisi , vektor arah atau target , dan vektor atas . Ini sampai vektor menggambarkan 'berputar' kamera.
Vektor ini digunakan untuk menghasilkan apa yang disebut dengan melihat matriks.
Pengaruh yang dimilikinya mirip dengan matriks dunia dalam kenyataan bahwa ia pada dasarnya memutar dan menerjemahkan dunia di sekitar kamera untuk "memposisikan" kamera.
Kamera yang 10 unit di sepanjang sumbu X akan menerjemahkan koordinat dunia 10 unit ke arah lain.
Proyeksi
Bagian terakhir dari teka-teki adalah matriks proyeksi . Dalam proyeksi perspektif seperti kamera, matriks mentransformasikan hampir layar koordinat untuk memberikan ilusi perspektif dengan bidang pandang x derajat.
Jika Anda berpikir tentang sudut-sudut layar (untuk game 640x480), ini adalah bagaimana proyeksi "meluruskan" koordinat di sepanjang sumbu Z dalam koordinat 2D layar. Untuk proyeksi ortografis, tidak ada penskalaan yang terjadi di sepanjang sumbu Z ke layar. Untuk perspektif, semakin jauh objek, semakin kecil hubungannya dengan luasan layar.
sumber