Apa yang dilakukan glLoadIdentity () di OpenGL?

132

Saya baru di OpenGL dan saya sedikit kewalahan dengan semua fungsi acak yang saya miliki dalam kode saya. Mereka bekerja dan saya tahu kapan menggunakannya, tetapi saya tidak tahu mengapa saya membutuhkannya atau apa yang sebenarnya mereka lakukan.

Saya tahu itu glLoadIdentity()menggantikan matriks saat ini dengan matriks identitas, tetapi apa sebenarnya yang dilakukan? Jika setiap program membutuhkannya, mengapa matriks identitas tidak secara default kecuali ditentukan lain? Saya tidak suka memiliki fungsi dalam kode saya kecuali saya tahu apa yang mereka lakukan. Saya harus mencatat bahwa saya menggunakan OpenGL khusus untuk klien 2D yang kaya, jadi maafkan ketidaktahuan saya jika ini adalah sesuatu yang sangat jelas untuk 3D.

Juga sedikit bingung tentang glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Alexander
sumber

Jawaban:

139

Matriks identitas, dalam hal matriks proyeksi dan modelview, pada dasarnya mengatur ulang matriks kembali ke keadaan standarnya.

Seperti yang Anda harapkan, glTranslatedan glRotateselalu relatif terhadap kondisi matriks saat ini. Jadi misalnya, jika Anda menelepon glTranslate, Anda menerjemahkan dari 'posisi' matriks saat ini, bukan dari asalnya. Tetapi jika Anda ingin memulai dari awal, saat itulah Anda menelepon glLoadIdentity(), dan kemudian Anda dapat glTranslatedari matriks yang sekarang terletak di asal, atau glRotatedari matriks yang sekarang berorientasi ke arah default.

Saya pikir jawaban Boon, bahwa itu setara dengan 1, tidak sepenuhnya benar. Matriks sebenarnya terlihat seperti ini:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

Itu adalah matriks identitas. Boon benar, secara matematis, bahwa setiap matriks dikalikan dengan matriks itu (atau matriks yang terlihat seperti itu; yang diagonal, yang lainnya 0s) akan menghasilkan matriks asli, tetapi saya tidak percaya dia menjelaskan mengapa ini penting.

Alasan mengapa ini penting adalah karena OpenGL mengalikan semua posisi dan rotasi melalui setiap matriks; jadi ketika misalnya Anda menggambar poligon ( glBegin(GL_FACE), beberapa titik, glEnd()), ia menerjemahkannya ke "ruang dunia" dengan mengalikannya dengan MODELVIEW, dan kemudian menerjemahkannya dari 3D ke 2D dengan mengalikannya dengan matriks PROJECT, dan itu memberikannya titik-titik 2D di layar, bersama dengan kedalaman (dari layar 'kamera'), yang digunakannya untuk menggambar piksel. Tetapi ketika salah satu dari matriks ini adalah matriks identitas, poin dikalikan dengan matriks identitas dan karena itu tidak diubah, sehingga matriks tidak memiliki efek; itu tidak menerjemahkan poin, tidak memutar mereka, itu membuat mereka apa adanya.

Saya harap ini sedikit lebih jelas!

Ricket
sumber
1
Itu berarti, OpenGL mempertahankan matriks 'Master' atau 'Global', dan, setiap matriks berikutnya diterapkan relatif terhadap matriks 'Master' atau 'Global' itu. Apakah saya benar?
user366312
41

Matriks identitas setara dengan 1 untuk angka. Seperti yang Anda tahu angka apa pun yang mengalikan dengan 1 itu sendiri (e.g. A x 1 = A),

Hal yang sama berlaku untuk matriks ( MatrixA x IdentityMatrix = MatrixA).

Jadi memuat matriks identitas adalah cara untuk menginisialisasi matriks Anda ke keadaan yang benar sebelum Anda menggandakan matriks lebih lanjut ke dalam tumpukan matriks.

glMatrixMode(GL_PROJECTION) : berkaitan dengan matriks yang digunakan oleh transformasi perspektif atau transformasi ortogonal.

glMatrixMode(GL_MODELVIEW): berkaitan dengan matriks yang digunakan oleh transformasi model-view. Artinya, untuk mengubah objek Anda (alias model) ke ruang koordinat tampilan (atau ruang kamera).

Anugerah
sumber
6

Matriks proyeksi digunakan untuk membuat volume tampilan Anda. Bayangkan sebuah adegan di dunia nyata. Anda tidak benar-benar melihat segala sesuatu di sekitar Anda, hanya apa yang mata Anda biarkan Anda lihat. Jika Anda seorang ikan misalnya Anda melihat sesuatu yang sedikit lebih luas. Jadi ketika kita mengatakan bahwa kita mengatur matriks proyeksi kita maksudkan bahwa kita mengatur apa yang ingin kita lihat dari adegan yang kita buat. Maksud saya, Anda dapat menggambar objek di mana saja di dunia Anda. Jika tidak ada di dalam volume tampilan, Anda tidak akan melihat apa pun. Ketika Anda membuat volume tampilan bayangkan bahwa Anda membuat 6 pesawat kliping yang menentukan bidang tampilan Anda.

Sedangkan untuk modelview matrix, digunakan untuk membuat berbagai transformasi pada model (objek) di dunia Anda. Seperti ini, Anda hanya perlu mendefinisikan objek Anda sekali dan kemudian menerjemahkannya atau memutar atau skala itu.

Anda akan menggunakan matriks proyeksi sebelum menggambar objek dalam adegan Anda untuk mengatur volume tampilan. Kemudian Anda menggambar objek Anda dan mengubah matriks modelview sesuai. Tentu saja Anda dapat mengubah matriks Anda di tengah menggambar model Anda jika misalnya Anda ingin menggambar adegan dan kemudian menggambar beberapa teks (yang dengan beberapa metode Anda dapat bekerja lebih mudah dalam proyeksi ortografi) kemudian kembali ke matriks modelview.

Adapun tampilan model nama itu ada hubungannya dengan dualitas pemodelan dan melihat transformasi. Jika Anda menarik kamera 5 unit ke belakang, atau memindahkan objek 5 unit ke depan pada dasarnya sama.

Kuharap aku sudah menjelaskan

biru
sumber
2

Matriks identitas digunakan untuk "menginisialisasi" sebuah matriks ke standar yang waras.

Satu hal penting untuk disadari adalah bahwa perkalian matriks dalam arti tertentu adalah tambahan. Misalnya, jika Anda mengambil matriks yang dimulai dengan matriks identitas, kalikan dengan matriks rotasi, lalu kalikan dengan matriks penskalaan, Anda berakhir dengan matriks yang memutar dan menskalakan matriks yang dikalikan.

dicroce
sumber
0

Hanya untuk merangkum apa yang dikatakan orang lain, matriks identitas adalah matriks yang sedemikian rupa sehingga ketika Anda mengalikan vektor / matriks dengan itu, hasilnya adalah vektor / matriks yang sama. Ini setara dengan angka 1 dengan perkalian atau angka 0 dengan tambahan.

glLoadIdentity () adalah fungsi yang sudah usang, dan Anda didorong untuk mengelola matriks Anda sendiri.

Thomas K
sumber
-1

glLoadIdentity() fungsi memastikan bahwa setiap kali kita memasuki mode proyeksi, matriks akan diatur ulang ke matriks identitas, sehingga parameter tampilan baru tidak digabungkan dengan yang sebelumnya.

Srinath ks
sumber