OpenGL - Memahami hubungan antara Model, View dan World Matrix

8

Saya mengalami sedikit kesulitan memahami bagaimana matriks ini bekerja dan bagaimana cara mengaturnya dalam kaitannya satu sama lain untuk mendapatkan sistem yang tepat berjalan.

Dalam pemahaman saya, Model Matrix adalah matriks dari suatu objek, misalnya kubus atau bola, akan ada banyak dari ini dalam aplikasi / permainan.

World Matrix adalah matriks yang menentukan asal dari dunia 3D. titik awal.

Dan View Matrix adalah "kamera" semuanya diterjemahkan dengan ini untuk memastikan Anda memiliki ilusi kamera yang sebenarnya padahal sebenarnya semuanya bergerak bukan matriks ini?

Saya agak tersesat di sini. Jadi saya berharap seseorang di sini dapat membantu saya memahami ini dengan benar.

Apakah setiap modelMatrix dapat diterjemahkan / dikalikan dengan matriks dunia dan worldMatrix kemudian dengan viewMatrix? Atau apakah setiap modelMatrix dapat diterjemahkan / dikalikan dengan viewMatrix dan kemudian dengan worldMatrix?

Bagaimana hubungan semua matriks ini dan bagaimana Anda mengatur dunia dengan banyak objek dan "kamera"?

EDIT:

Terima kasih banyak atas umpan baliknya. Saya melakukan beberapa aswel googling dan saya pikir saya memahaminya sedikit lebih baik sekarang, namun apakah mungkin untuk mendapatkan beberapa saran kode semu?

projectionMatrix = Matrix;
makePerspective(45, width, height, 0.1, 1000.0, projectionMatrix);

modelMatrix = Matrix;
identity(modelMatrix);
translate(modelMatrix, [0.0, 0.0, -10.0]);  // move back 10 on z axis

viewMatrix = Matrix;
identity(viewMatrix);
// do some translation based on input with viewMatrix;

Apakah saya melipatgandakan atau menerjemahkan viewMatrix dengan modelMatrix atau sebaliknya? dan lalu apa? Saat ini saya memiliki metode menggambar sedemikian rupa sehingga hanya perlu 2 matriks untuk argumen untuk menggambar.

Inilah metode menggambar saya:

draw(matrix1 matrix2) {

            bindBuffer(ARRAY_BUFFER, cubeVertexPositionBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexPositionAttribute, cubeVertexPositionBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ARRAY_BUFFER, cubeVertexColorBuffer);
            vertexAttribPointer(shaderProgram.getShaderProgram().vertexColorAttribute, cubeVertexColorBuffer.itemSize, FLOAT, false, 0, 0);

            bindBuffer(ELEMENT_ARRAY_BUFFER, cubeVertexIndexBuffer);

            setMatrixUniforms(shaderProgram, matrix1, matrix2);

            drawElements(TRIANGLES, cubeVertexIndexBuffer.numItems, UNSIGNED_SHORT, 0);


}

Matriks apa yang seharusnya? Terima kasih banyak sebelumnya kawan.

Sam
sumber
1
Apakah Anda tahu apa itu matriks? Apakah Anda tahu cara melipatgandakan matriks / vektor? Tahukah Anda, matriks apa yang diwakilinya (transformasi linear / affine)? Jika tidak, Anda sebaiknya mulai dengan beberapa Matematika terlebih dahulu.
Ivan Kuckir
Mungkin ide yang bagus untuk fokus pada hal itu. ada ide apa yang harus dicari atau sumber baik yang Anda tahu online?
Sam
1
Kerjakan cara Anda hingga aljabar linier, kemudian cari rendering 3D dasar dan kemudian tutorial. Intertubes penuh dengan sumber yang baik tetapi Anda harus mengambil satu langkah pada satu waktu atau, seperti yang Anda perhatikan, Anda benar-benar tersesat.
Patrick Hughes

Jawaban:

19

Dalam adegan yang diberikan 3D, biasanya ada tiga matriks utama yang digunakan untuk mengubah objek dari ruang lokalnya sendiri (ruang objek / model) ke ruang homogen yang dikenal sebagai ruang layar.

Dunia

  • Matriks Dunia menjadi yang pertama, unik untuk setiap objek di dunia Anda, dan bertanggung jawab untuk mengubah simpul suatu objek dari ruang lokalnya sendiri, ke sistem koordinat umum yang disebut ruang dunia.

Melihat

  • Setelah itu, view matrix menyediakan konsep kamera ponsel, padahal kenyataannya kamera sebenarnya satu-satunya titik referensi konstan di dunia. Matriks tampilan adalah transformasi yang diterapkan ke setiap objek dalam adegan (tetapi tidak unik untuk setiap objek), dan memberikan ilusi kamera. Matriks tampilan pada dasarnya adalah kebalikan dari apa yang bisa dianggap sebagai matriks dunia untuk kamera. Namun alih-alih menggerakkan kamera itu sendiri, ini memberikan gerakan berlawanan ke seluruh adegan (ilusi;)).

Proyeksi

  • Akhirnya, matriks proyeksi bertanggung jawab untuk mengubah dunia 3D menjadi ruang layar homogen yang Anda lihat di layar Anda. Ini adalah matriks yang digunakan untuk mewakili pandangan Anda, dan biasanya direpresentasikan sebagai proyeksi ortografis atau perspektif.

Pada level paling sederhana, setiap objek Anda harus mengandung matriks dunianya sendiri, "adegan" Anda atau konteks apa pun yang Anda gunakan harus berisi matriks tampilan untuk mewakili kamera, dan matriks proyeksi untuk mengonversi koordinat dunia ke koordinat layar. Semua ini kemudian perlu diteruskan ke vertex shader (dengan matriks dunia berubah untuk setiap objek, tetapi tidak harus tampilan atau proyeksi) untuk diubah.

Evan
sumber
Saya memperbarui posting saya, bisakah Anda membantu dengan kode semu yang saya tulis untuk membantu saya memahami jawabannya dengan lebih baik?
Sam
Bisakah saya mengambil teks yang tepat dari jawaban ini tanpa membuat pelanggaran hak cipta?
arandomguy
1
Ya, Anda dapat menggunakannya
Evan
Tidakkah seharusnya matriks "Dunia" disebut Matriks "Model", dan kombinasi Model dan Tampilan, matriks "ModelView", menjadi matriks "Dunia"?
BAR
Terminologi yang tepat dapat bervariasi tergantung pada basis kode yang digunakan. Beberapa render pipa menggabungkan matriks tertentu, sementara yang lain membiarkannya terbelah. Saya telah melihat beberapa sistem menggunakan terminologi yang Anda jelaskan di sini.
Evan
3

Jawaban yang bagus ada di sini /programming/6461740/xna-worldmatrix-and-viewmatrix

Pertama-tama, tidak ada perbedaan nyata antara "Matriks Dunia" dan "Matriks Tampilan" , keduanya adalah matriks transformasi dan perbedaannya agak sewenang-wenang. Beberapa sistem bahkan menggabungkan keduanya (OpenGL hanya memiliki matriks "ModelView" ).

Secara tradisional "matriks dunia" digunakan untuk memindahkan model individual dari "ruang model" ke "ruang dunia". Kemudian "view matrix" digunakan untuk memindahkan semua model dari ruang dunia ke posisi relatif mereka di depan kamera (yang, pada dasarnya, "memindahkan kamera"). Dan akhirnya "Matriks Proyeksi" mengubah posisi 3D menjadi posisi 2D di layar (umumnya dengan proyeksi perspektif). Karena mereka adalah matriks, mereka dapat dikalikan bersama menjadi matriks tunggal yang dapat mengubah poin dalam satu langkah.

Rusty Shackelford
sumber