Mengapa kita menggerakkan dunia alih-alih kamera?

87

Saya mendengar bahwa dalam permainan OpenGL apa yang kita lakukan untuk membiarkan pemain bergerak bukan untuk memindahkan kamera tetapi untuk memindahkan seluruh dunia.

Sebagai contoh di sini adalah ekstrak dari tutorial ini: OpenGL View matrix

Dalam kehidupan nyata Anda terbiasa menggerakkan kamera untuk mengubah tampilan adegan tertentu, di OpenGL sebaliknya. Kamera di OpenGL tidak dapat bergerak dan didefinisikan berada di (0,0,0) menghadap arah Z negatif. Itu berarti bahwa alih-alih memindahkan dan memutar kamera, dunia dipindahkan dan diputar di sekitar kamera untuk membentuk tampilan yang sesuai.

Mengapa kita melakukan itu?

danijar
sumber
1
Kamera tidak mewakili apa pun selain tampilan proyeksi. Jadi Anda mengubah dunia untuk mendapatkan proyeksi yang Anda inginkan. Konsepnya aneh, tetapi sebenarnya masuk akal ... dengan cara ... Saya pikir
Sidar
@sharethis, saya telah meningkatkan jawaban saya dengan penjelasan yang lebih baik. Menambahkan perspektif proyeksi dengan opsi matematika dan Kamera 3D (Kamera Virtual). Semoga bermanfaat bagi Anda dan orang lain.
Md Mahbubur Rahman
4
Ini sebenarnya tidak benar, karena kedua operasi (menggerakkan kamera, atau objek di dunia) simetris, tidak ada cara untuk mengetahui operasi yang telah dilakukan. Anda sedang berpikir tentang dunia bergerak tentang kamera, tetapi orang lain yang sama dapat memvisualisasikan kamera bergerak terbalik tentang dunia ... Oke, sehingga Anda dapat memindahkan objek relatif satu sama lain, jadi satu cara mungkin lebih intuitif, tetapi tidak satu pun orang itu "salah", kedua cara memvisualisasikan situasi baik dalam situasi yang berbeda. Seringkali ada baiknya untuk memikirkan keduanya.
user3728501

Jawaban:

72

Mengapa

Karena, kamera mewakili tampilan proyeksi.

Tetapi dalam kasus Kamera 3D (Kamera Virtual), kamera bergerak bukan dunia. Saya telah membuat penjelasan terperinci nanti dari jawaban ini.

Memahami secara matematis

Tampilan Proyeksi bergerak di sekitar ruang dan mengubah orientasinya. Hal pertama yang perlu diperhatikan adalah bahwa proyeksi yang diinginkan pada layar tidak berubah dengan arah tampilan.

Untuk alasan ini, kami mengubah hal-hal lain untuk mendapatkan proyeksi yang diinginkan.

Memahami Dari http://opengl.org

Untuk memberikan tampilan menggerakkan kamera, aplikasi OpenGL Anda harus memindahkan adegan dengan kebalikan dari transformasi kamera. dalam hal OpenGL terkait, tidak ada kamera. Lebih khusus lagi, kamera selalu terletak di koordinat ruang mata (0, 0, 0)

Memahami Dari http://open.gl

Juga ingin berbagi baris berikut dari bagian View matrix dari http://open.gl/transformations

Untuk mensimulasikan transformasi kamera, Anda benar-benar harus mengubah dunia dengan kebalikan dari transformasi itu. Contoh: jika Anda ingin memindahkan kamera ke atas, Anda harus memindahkan dunia ke bawah.

Memahami dengan perspektif

Di dunia nyata, kita melihat sesuatu dengan cara yang disebut "perspektif".

Perspektif mengacu pada konsep bahwa objek yang lebih jauh tampak lebih kecil daripada yang lebih dekat dengan Anda. Perspektif juga berarti bahwa jika Anda duduk di tengah jalan lurus, Anda benar-benar melihat batas jalan sebagai dua garis konvergen.

Itu perspektif. Perspektif sangat penting dalam proyek 3D. Tanpa perspektif, dunia 3D tidak terlihat nyata.

Meskipun ini mungkin tampak alami dan jelas, penting untuk mempertimbangkan bahwa ketika Anda membuat rendering 3D di komputer Anda mencoba untuk mensimulasikan dunia 3D di layar komputer, yang merupakan permukaan 2D.

Bayangkan di balik layar komputer ada semacam adegan 3D nyata, dan Anda menontonnya melalui "kaca" layar komputer Anda. Menggunakan perspektif, tujuan Anda adalah membuat kode yang membuat apa yang "diproyeksikan" pada "kaca" layar Anda ini seolah-olah ada dunia 3D nyata di belakang layar. Satu-satunya peringatan adalah bahwa dunia 3D ini tidak nyata ... itu hanya simulasi matematis dari dunia 3D.

Jadi, ketika menggunakan rendering 3D untuk mensimulasikan adegan dalam 3D dan kemudian memproyeksikan adegan 3D ke permukaan 2D layar Anda, proses ini disebut proyeksi perspektif.

Mulailah dengan membayangkan secara intuitif apa yang ingin Anda capai. Jika suatu objek lebih dekat ke penampil, objek tersebut harus tampak lebih besar. Jika objek lebih jauh, itu harus tampak lebih kecil. Selain itu, jika suatu objek bergerak menjauh dari penampil, dalam garis lurus, Anda ingin objek itu menyatu ke tengah layar, karena bergerak lebih jauh ke kejauhan.

Menerjemahkan perspektif ke dalam matematika

Saat Anda melihat ilustrasi dalam gambar berikut, bayangkan bahwa suatu objek diposisikan dalam adegan 3D Anda. Dalam dunia 3D, posisi objek dapat digambarkan sebagai xW, yW, zW, mengacu pada sistem koordinat 3D dengan asal pada titik mata. Di situlah objek sebenarnya diposisikan, dalam adegan 3D di luar layar.

masukkan deskripsi gambar di sini

Saat pemirsa melihat objek ini di layar, objek 3D "diproyeksikan" ke posisi 2D yang digambarkan sebagai xP dan yP, yang merujuk sistem koordinat 2D layar (bidang proyeksi).

Untuk memasukkan nilai-nilai ini ke dalam rumus matematika, saya akan menggunakan sistem koordinat 3D untuk koordinat dunia, di mana sumbu x menunjuk ke kanan, menunjuk ke atas, dan titik z positif di dalam layar. Asal 3D mengacu pada lokasi mata pemirsa. Jadi, kaca layar berada pada bidang ortogonal (pada sudut kanan) ke sumbu z, pada beberapa z yang saya sebut zProj.

Anda dapat menghitung posisi yang diproyeksikan xP dan yP, dengan membagi posisi dunia xW, dan yW, dengan zW, seperti ini:

xP = K1 * xW / zW
yP = K2 * yW / zW

K1 dan K2 adalah konstanta yang berasal dari faktor geometris seperti rasio aspek bidang proyeksi Anda (viewport Anda) dan "bidang pandang" mata Anda, yang memperhitungkan tingkat penglihatan sudut lebar.

Anda dapat melihat bagaimana transformasi ini mensimulasikan perspektif. Poin di dekat sisi layar didorong ke tengah saat jarak dari mata (zW) meningkat. Pada saat yang sama, titik yang lebih dekat ke pusat (0,0) jauh lebih sedikit dipengaruhi oleh jarak dari mata dan tetap dekat dengan pusat.

Pembagian oleh z ini adalah "pembagian perspektif" yang terkenal.

Sekarang, pertimbangkan bahwa objek dalam adegan 3D didefinisikan sebagai serangkaian simpul. Jadi, dengan menerapkan transformasi semacam ini ke semua simpul geometri, Anda secara efektif memastikan bahwa objek akan menyusut ketika lebih jauh dari titik mata.

Kasus Penting Lainnya

  • Dalam hal Kamera 3D (Kamera Virtual), kamera bergerak sebagai ganti dunia.

Untuk mendapatkan pemahaman yang lebih baik tentang kamera 3D, bayangkan Anda merekam film. Anda harus mengatur adegan yang ingin Anda potret dan Anda membutuhkan kamera. Untuk mendapatkan rekaman, Anda akan menjelajahi adegan dengan kamera Anda, memotret objek dalam pemandangan dari berbagai sudut dan sudut pandang.

Proses pembuatan film yang sama terjadi dengan kamera 3D. Anda memerlukan kamera "virtual", yang dapat berkeliaran di sekitar adegan "virtual" yang telah Anda buat.

Dua gaya pemotretan populer melibatkan menonton dunia melalui mata karakter (juga dikenal sebagai kamera orang pertama) atau mengarahkan kamera ke suatu karakter dan membuatnya tetap terlihat (dikenal sebagai kamera orang ketiga).

Ini adalah premis dasar dari kamera 3D: kamera virtual yang dapat Anda gunakan untuk berkeliaran di sekitar adegan 3D, dan membuat rekaman dari sudut pandang tertentu.

Memahami ruang dunia dan melihat ruang

Untuk mengkode perilaku seperti ini, Anda akan merender konten dunia 3D dari sudut pandang kamera, tidak hanya dari sudut pandang sistem koordinat dunia, atau dari sudut pandang tertentu lainnya.

Secara umum, adegan 3D berisi serangkaian model 3D. Model didefinisikan sebagai seperangkat simpul dan segitiga, dirujuk ke sistem koordinat mereka sendiri. Ruang di mana model didefinisikan disebut ruang model (atau lokal).

Setelah menempatkan objek model ke dalam adegan 3D, Anda akan mengubah simpul model ini menggunakan matriks "transformasi dunia". Setiap objek memiliki matriks dunianya sendiri yang menentukan di mana objek berada di dunia dan bagaimana ia berorientasi.

Sistem referensi baru ini disebut "ruang dunia" (atau ruang global). Cara sederhana untuk mengelolanya adalah dengan mengaitkan matriks transformasi dunia ke setiap objek.

Untuk menerapkan perilaku kamera 3D, Anda harus melakukan langkah-langkah tambahan. Anda akan mereferensikan dunia — bukan ke asal dunia — tetapi ke sistem referensi kamera 3D itu sendiri.

Strategi yang baik melibatkan memperlakukan kamera sebagai objek 3D aktual di dunia 3D. Seperti objek 3D lainnya, Anda menggunakan matriks "transformasi dunia" untuk menempatkan kamera pada posisi dan orientasi yang diinginkan di dunia 3D. Matriks transformasi dunia kamera ini mengubah objek kamera dari aslinya, melihat rotasi ke depan (sepanjang sumbu z), ke posisi dunia nyata (xc, yc, zc), dan rotasi dunia.

Gambar berikut menunjukkan hubungan antara sistem koordinat Dunia (x, y, z) dan sistem tampilan (kamera) (x ', y', z ').

masukkan deskripsi gambar di sini

Md Mahbubur Rahman
sumber
5
Jawaban lain ada di sana. Anda tidak perlu mengeditnya menjadi milik Anda sendiri.
Jesse Dorsey
1
@Noctrine, Terima kasih. Bagi saya tidak diketahui cara membuat tautan antar halaman.
Md Mahbubur Rahman
"Di bagian selanjutnya, Anda akan menggunakan rumus proyeksi perspektif ini ke dalam ActionScript yang dapat Anda gunakan dalam proyek Flash 3D Anda." Karena tidak ada menyebutkan proyek Flash 3D dalam pertanyaan awal, ini membuat saya berpikir Anda menyalin-menempelkan ini dari tempat lain, yang baik-baik saja, jika Anda mengutip sumber Anda.
Gilles
@Gilles, Maaf atas kesalahan saya. Saya telah mengedit jawaban saya. Saya sudah menyiapkan jawaban mempelajari beberapa sumber. Dan banyak terima kasih kepada Anda seperti yang Anda tunjukkan. :)
Md Mahbubur Rahman
Perhatikan bahwa glMatrixMode()dan beberapa fungsi lainnya yang dirujuk dalam: eng.utah.edu/ ~cs6360 / Lectures / frustum.pdf dan opengl.org/archives/resources/faq/technical/viewing.htm tidak digunakan lagi. Namun deskripsi matematis tetap benar dan bermanfaat.
patryk.beza
28

Jawaban Mahbubar R Aaman cukup benar dan tautan yang ia berikan menjelaskan matematika secara akurat, tetapi jika Anda menginginkan jawaban yang kurang teknis / matematika, saya akan mencoba pendekatan yang berbeda.

Posisi objek di dunia nyata dan dunia game ditentukan dengan beberapa sistem koordinat. Sistem koordinat memberi makna pada nilai posisi. Jika saya memberi tahu Anda bahwa saya berada di "100,50" yang tidak akan membantu Anda kecuali jika Anda tahu apa arti angka-angka itu (apakah itu mil, kilometer, lintang dan bujur, dll.). Jika mereka adalah koordinat Kartesius (jenis koordinat "normal"), Anda juga perlu tahu asal-usulnya relatif apa; jika saya hanya mengatakan "Saya 100 kaki ke Timur," Anda perlu tahu "Timur dari apa ," yang disebut asal koordinat.

Ada cara mudah untuk memikirkan hal ini. Anda bisa memberi tahu seseorang "stasiun kereta terletak 3 kilometer di utara dan 1,5 kilometer di timur sudut barat daya kota." Anda juga bisa memberi tahu seseorang "stasiun kereta berjarak 1 mil tepat di utara tempat saya berada sekarang." Kedua koordinat benar dan mengidentifikasi lokasi tengara yang sama, tetapi mereka diukur dari asal yang berbeda, dan karenanya memiliki nilai numerik yang berbeda.

Dalam aplikasi 3D, umumnya ada sistem koordinat "dunia", yang digunakan untuk mewakili posisi kamera dan objek-objek dalam game, diukur dengan koordinat Cartesian dengan beberapa asal-usul desainer yang ditentukan secara acak (umumnya pusat dari level apa pun) atau peta yang Anda mainkan). Sistem koordinat lain ada dalam permainan, seperti sistem koordinat Cartesian dengan kamera di tempat asalnya. Anda dapat menentukan sistem koordinat baru dengan cara apa pun yang Anda inginkan kapan saja, dan ini dilakukan sangat sering dalam simulasi 3D untuk mempermudah perhitungan matematika.

Algoritme yang benar-benar membuat segitiga individual ke layar Anda bekerja dengan cara tertentu, dan karenanya tidak nyaman untuk langsung bekerja dengan koordinat dunia saat merender. Matematika tidak benar-benar diatur untuk menangani informasi seperti "objeknya 100 unit di sebelah kanan pusat dunia." Alih-alih matematika ingin bekerja dengan "objek itu tepat di depan kamera, dan 20 unit jauhnya." Oleh karena itu, langkah tambahan ditambahkan ke matematika rendering untuk mengambil posisi objek dunia dan menerjemahkannya dari ke dalam sistem koordinat kamera.

Tentu saja kamera memiliki posisi dan orientasi juga. Jadi jika suatu objek berada pada posisi 20.100.50 dan kamera berada pada posisi 10.200, -30, posisi objek relatif terhadap kamera adalah 10.100.180 (posisi objek minus posisi kamera). Saat kamera bergerak dalam sebuah game, posisi kamera di dunia itu digerakkan persis seperti yang Anda harapkan.

Perhatikan bahwa objek tidak dipindahkan; mereka tinggal tepat di tempat mereka sebelumnya. Namun, posisi mereka sekarang dinyatakan relatif terhadap asal koordinat yang berbeda. Dunia koordinat objek hanya bergerak jika objek itu sendiri bergerak, tetapi koordinat kameranya juga berubah setiap kali kamera bergerak, karena mereka relatif terhadap posisi kamera.

Juga perhatikan bahwa deskripsi dari tutorial yang Anda kutip adalah penjelasan yang disederhanakan dan belum tentu deskripsi yang akurat tentang apa yang dilakukan OpenGL. Saya tidak berpikir penulis artikel gagal memahami itu; penulis hanya mencoba menggunakan analogi sederhana yang dalam hal ini menyebabkan kebingungan daripada menghilangkannya.

Jika ini membantu lebih jauh untuk memahami mengapa matematika peduli dengan koordinat kamera, coba latihan ini: angkat kedua tangan Anda menyentuh ibu jari dan jari telunjuk Anda bersama-sama untuk membuat persegi panjang (sebut saja "viewport") dan lihat sekeliling ruangan tempat Anda masuk. Temukan suatu objek, dan lihatlah, lalu lihat sekelilingnya tetapi tidak secara langsung. Ketika Anda melakukannya, tanyakan pada diri Anda, "di mana objek di viewport saya?" Objek itu memiliki beberapa garis bujur dan lintang dunia nyata yang dapat Anda gunakan untuk menentukan lokasi di Bumi, tetapi itu tidak memberi tahu Anda apa pun tentang apa yang Anda lihat. Mengatakan "objeknya ada di sudut kiri atas viewport saya dan terlihat sekitar 2 meter jauhnya" memberitahu Anda sedikit. Anda telah membuat sistem koordinat relatif terhadap kepala Anda dan arah Anda sedang mencari yang menentukan di mana suatu objek sesuai dengan visi Anda. Pada dasarnya itulah yang dibutuhkan oleh bagian rasterizer segitiga dari OpenGL / Direct3D, dan itulah yang disyaratkan matematika bahwa posisi dan orientasi objek diubah dari koordinat dunia mereka yang mudah menjadi koordinat kamera.

Sean Middleditch
sumber
Meskipun bagi saya penjelasan matematisnya jelas dan dapat dimengerti, ini juga merupakan penjelasan yang bagus! Saya percaya bahwa Anda membantu banyak orang lain dengan pertanyaan yang sama.
danijar
+1 untuk menjelaskan apakah kamera bergerak atau dunia hanyalah fungsi dari sistem koordinat yang Anda bicarakan.
David Moles
11

Dengan menambahkan ke dua lainnya (luar biasa) jawaban beberapa elaborasi lebih lanjut tentang suatu hal yang disinggung Mahbubur R Aaman: "tidak ada kamera".

Ini cukup benar dan mewakili kegagalan analogi "kamera" yang umum, karena "kamera" sebenarnya tidak ada. Penting untuk menyadari bahwa analogi kamera persis seperti itu - analogi. Itu tidak menggambarkan (atau pura-pura menggambarkan) cara sesuatu sebenarnya bekerja di belakang layar.

Jadi, pandang (permainan kata) itu sebagai sarana untuk membantu Anda memahami hal-hal ini jika hal itu baru bagi Anda, tetapi selalu ingat bahwa itu hanyalah penolong dan bukan deskripsi apa pun tentang bagaimana keadaan sebenarnya.

Sekarang, Anda memiliki dua kelas objek yang relevan di sini: titik pandang dan semua yang ada di dunia. Anda ingin memindahkan titik tampilan lebih dekat ke beberapa objek, tetapi untuk gerakan ini hasil akhirnya adalah sama apakah tampilan bergerak lebih dekat ke objek atau apakah objek bergerak lebih dekat ke tampilan. Yang Anda lakukan hanyalah mengubah jarak di antara mereka; karena jarak saat ini adalah X dan Anda ingin jarak baru menjadi Y, tidak masalah yang Anda bergerak, asalkan setelah pindah jarak baru adalah Y. Jadi Anda tidak benar-benar bergerak sama sekali, Anda Hanya mengubah jarak. (Aku tidak bermaksud mendekati Einstein dengan ini ... jujur!)

Namun, karena kamera tidak ada, satu-satunya hal yang dapat Anda ubah jaraknya adalah objek. Jadi, Anda mengubah jarak objek dan keluar hasil yang sama. Karena semua benda melalui transformasi pula , ini tidak lebih atau kurang mahal.

Penjelasan matematis yang lebih sederhana dapat membantu lebih banyak. Mari kita berpura-pura bahwa semua koordinat adalah 1D - sudut pandangnya adalah 0, objek Anda berada pada 4 dan Anda ingin sudut pandangnya pergi ke 3. Itu berarti bahwa jarak di antara mereka akan berubah dari 4 (4 - 0) menjadi 1 (4 - 3). Tetapi karena kamera tidak ada, Anda tidak dapat mengubah 0 itu; itu selalu akan menjadi 0. Jadi alih-alih menambahkan 3 ke 0 (yang tidak dapat Anda lakukan) Anda kurangi 3 dari 4 (yang dapat Anda lakukan) - objek sekarang di 1, dan hasil akhirnya adalah sama - jarak antara sudut pandang dan objek adalah 1.

Maximus Minimus
sumber
Meskipun kamera tidak ada, Anda masih dapat menghitung posisinya sebelum transformasi. Namun dalam beberapa kasus (proyeksi paralel yang tidak selaras sumbu) Anda akan berakhir dengan lebih dari satu koordinat biasa "pada tak terhingga" (positif atau negatif), yang kurang berguna daripada matriks transformasi.
Martin Sojka
7

Menggerakkan kamera atau menggerakkan dunia adalah dua pilihan yang sama-sama valid yang keduanya sama. Pada akhirnya Anda berubah dari satu sistem koordinat ke yang lain. Jawaban di atas benar tetapi cara Anda memvisualisasikan itu adalah dua sisi dari koin yang sama. Transformasi dapat berjalan baik - mereka hanya kebalikan dari satu sama lain.

Bagian dari proses rendering mengkonversi dari koordinat dunia ke koordinat mata. Namun cara mudah untuk memodelkan ini adalah dengan objek kamera virtual di aplikasi Anda. Kamera dapat mewakili baik matriks proyeksi (yang bertanggung jawab atas efek perspektif) dan juga matriks tampilan yang digunakan untuk mengkonversi dari ruang dunia ke ruang mata.

Jadi meskipun vertex shader menggunakan view matrix untuk mengubah koordinat geometri Anda menjadi ruang mata, seringkali lebih mudah untuk memikirkan objek kamera yang bergerak di sekitar dunia virtual Anda yang saat bergerak menghitung ulang view view.

Jadi dalam aplikasi Anda, Anda memindahkan kamera dalam koordinat dunia, memperbarui matriks pandangan kamera, meneruskan matriks tampilan baru ke vertex shader sebagai seragam atau bagian dari blok, membuat adegan Anda.

Sean Harmer
sumber
5

Saya akan berpendapat bahwa itu analogi yang cacat. Pada dasarnya, "menggerakkan kamera" dan "menggerakkan dunia" adalah konstruksi matematika yang persis sama - hanya saja menggerakkan dunia agak lebih mudah untuk dipikirkan secara konseptual, terutama ketika menyangkut transformasi hierarkis. Pada dasarnya, Anda menggerakkan dunia di sekitar kamera hanya karena Anda menerjemahkan simpul dunia ke dalam ruang koordinat kamera - tetapi ini adalah transformasi affine yang dapat dibalik.

Namun, ketika Anda mulai membawa tekad visibilitas ke dalam campuran, hal TERAKHIR yang ingin Anda lakukan adalah menerjemahkan seluruh dunia di sekitar kamera. Sebagai gantinya, dalam kebanyakan kasus (terutama kasus klasik BSP tetap atau sejenisnya) Anda akan menggunakan posisi kamera di dunia untuk menanyakan struktur visibilitas Anda untuk menentukan hal-hal yang mungkin terlihat, dan kemudian hanya menerjemahkan mereka hal-hal ke dalam ruang koordinat kamera.

halus
sumber
4

Saya tidak berpikir bahwa klaim tersebut benar secara kategoris, karena seseorang jarang "menggerakkan" koordinat dunia dalam sebuah game, tetapi sebenarnya mengubah koordinat kamera virtual.

Apa yang sebenarnya dilakukan konsep kamera, adalah mentransformasikan frustum tampilan terbatas - yaitu piramida terpotong dengan 8 titik sudut (atau ditentukan oleh perpotongan 6 bidang) menjadi unit cube, yang mewakili ruang klip pada tahap akhir openGL render pipa.

Dalam pengertian itu dunia tidak bergerak, tetapi seseorang hanya menghitung koordinat dunia dalam sistem koordinat ruang klip.

Aki Suihkonen
sumber
2

Menggerakkan kamera atau menggerakkan dunia adalah dua pilihan yang sama-sama valid (dan keduanya benar). Pada akhirnya kami berubah dari satu sistem koordinat ke yang lain. Transformasi dapat berjalan baik - mereka hanya kebalikan dari satu sama lain.

CoolProgrammer
sumber
2

Banyak jawaban bagus di sini. Saya akan mencoba untuk tidak mengulanginya. Terkadang lebih mudah untuk dipikirkan dalam hal kamera, seperti bagaimana Direct3D melakukannya (catatan: belum bermain dengan banyak posting 9.0c)

"Menggerakkan dunia" seperti dalam pengertian Futurama bahwa seseorang di luar sana yang dikutip adalah cara yang sangat baik untuk melihatnya ("Mesinnya tidak menggerakkan kapal sama sekali. Kapal itu tetap di tempatnya dan mesin menggerakkan alam semesta sekitar saya t!"). Ini sebenarnya cukup umum untuk game 2D. Anda benar-benar memiliki viewport yang akan sulit Anda sesuaikan, dan itu terkadang RAM video atau Jendela UI Anda. Jika OpenGL melakukannya karena alasan-alasan seperti itu, eh, sulit dikatakan.

Anda tentu dapat memikirkan gerakan 2D dalam hal kamera juga, dan proses berpikir seperti itu dapat membuatnya lebih mudah untuk mengetahui efek.

Joe Plante
sumber
1
Terlambat, tapi jawabannya juga bagus!
danijar
Terima kasih! Saya selalu menemukan bahwa menambahkan ke diskusi di halaman yang ditemukan melalui mesin pencari ternyata lebih dihargai, terutama jika info ini berguna atau menarik
Joe Plante
2

Tampaknya ada banyak kesalahpahaman di sini, mulai dari penulis dokumen OpenGL ...

Biarkan saya dengan cepat mengembalikan kewarasan Anda: dunia tidak bergerak , ia tetap bertahan. Siapa pun yang mencoba menerapkan dunia saat bergerak di sekitar pemain akan dengan cepat mengalami masalah dalam mode multipemain. Belum lagi bahwa memperbarui posisi jutaan (atau miliaran) objek di dunia pada setiap pergerakan pemain akan membuat gameplay yang agak lambat ...

Jadi, apa yang sebenarnya terjadi di sana, dan ada apa dengan kutipannya?

Ya, pertama-tama Anda perlu memahami konsep sistem koordinat. Secara umum, Anda memilih satu titik di dunia dan menyatakannya sebagai "asal", yaitu titik dengan koordinat (0,0,0). Anda juga memilih tiga arah "utama", yang Anda sebut X, Y, dan Z. Jelas, ada banyak cara untuk menetapkan sistem koordinat. Biasanya ada satu "sistem koordinat dunia", dalam sistem ini dunia ini stasioner (kurang lebih). Dalam permainan sistem ini akan dipilih oleh desainer level.

Sekarang, itu juga nyaman untuk mempertimbangkan sistem koordinat lain, terikat pada mata pemain. Dalam sistem koordinat ini pemain selalu pada koordinat (0,0,0), dan dunia bergerak dan berputar di sekelilingnya. Dengan demikian kutipannya benar jika Anda mengerti dibuat di sistem koordinat pemain .

Namun dunia tidak beroperasi dalam koordinat pemain, ia beroperasi dalam koordinat dunia. Dan di mana dua sistem koordinat terlibat, selalu ada cara untuk mengubah satu jenis koordinat menjadi yang lain. Di OpenGL ini dilakukan menggunakan view matrix 4x4.

Pada akhirnya, ketika pemain bergerak, dunia tetap diam, sementara pemain dipindahkan. Ini ada di koordinat dunia, cara benda disimpan dalam gim Anda. Pemain juga memiliki kamera pandangan yang terkait dengannya, dan kamera ini juga bergerak di seluruh dunia (terlepas dari apa yang dikatakan oleh dokumen OpenGL). Namun, untuk menunjukkan dunia pada layar pengguna, koordinat semua objek yang terlihat diterjemahkan ke dalam sistem koordinat pemain menggunakan matriks transformasi, dan kemudian proyeksi tambahan diterapkan untuk menciptakan efek perspektif. Dalam sistem koordinat pemain ini, dunia tampak bergerak di sekitar pemain. Tapi itu hanya cara berpikir yang sangat tidak membantu dan membingungkan.

Pasha
sumber
" mulai dari para penulis dokumen OpenGL " Benar, karena saya yakin para pembuat OpenGL jelas terlalu bodoh untuk memahami perbedaan antara penyajian sebuah dunia (yang menjadi perhatian OpenGL) dan representasi konseptual dari dunia itu ( yang bukan sesuatu yang berhubungan dengan OpenGL).
Nicol Bolas
" Tapi itu hanya cara berpikir yang sangat tidak membantu dan membingungkan. " Itu juga kebenaran . Dan kebenaran selalu lebih bermanfaat daripada kebohongan. Karena cepat atau lambat, kebohongan itu akan mengejar Anda dan Anda harus menghadapi kebenaran.
Nicol Bolas