Cara mendapatkan terjemahan dari view matrix


11

Bagaimana saya bisa mengambil posisi ruang-dunia kamera dari matriks pandangannya? Satu-satunya jawaban yang saya lihat untuk pertanyaan ini menyarankan terjemahan ada di baris / col terakhir tetapi ini tidak akan berhasil karena matriks berisi [x (titik) kanan, y (titik) ke atas, z (titik) lihat]

Jawaban:


10

Jawaban singkat

Pertama-tama balikkan view matrix. Kemudian ambil terjemahan dari baris / kolom terakhir.

Jawaban panjang

Salah satu cara untuk menyimpulkan konten dari view matrix adalah mulai dengan mempertimbangkan kamera sebagai objek lain di dunia, dan menghitung matriks dunia untuknya:

RightX  RightY  RightZ  0
UpX     UpY     UpZ     0
LookX   LookY   LookZ   0
PosX    PosY    PosZ    1

Matriks dunia mengubah koordinat dari ruang lokal ke ruang dunia. Tetapi dalam kasus ini, ruang lokal kamera dan ruang tampilan adalah satu dan sama, jadi kita juga bisa mengatakan matriks ini mengubah koordinat dari ruang tampilan ke ruang dunia.

Karena kita memerlukan konversi ke arah yang berlawanan , kita harus membalikkan matriks. Hasilnya adalah apa yang kita sebut matriks tampilan yang mengubah koordinat dari ruang dunia ke ruang tampilan:

   RightX        UpX        LookX      0
   RightY        UpY        LookY      0
   RightZ        UpZ        LookZ      0
-(Pos*Right)  -(Pos*Up)  -(Pos*Look)  1      // * = dot product

Dan itulah jenis matriks yang Anda miliki. Jadi untuk mendapatkan kembali posisi kamera, Anda harus membalikkannya terlebih dahulu, dan kemudian Anda dapat mengambil terjemahan dari baris terakhir (atau kolom tergantung pada sistem).


1
Mengapa membalikkan matriks terlebih dahulu? Jika Anda (mudah-mudahan) tahu apakah Anda berada di baris-jurusan atau kolom-jurusan, lokasi vektor terjemahan harus jelas.
3Dave

7

Pertama saya akan sangat merekomendasikan hanya menyimpan posisi sebagai vektor secara terpisah, itu akan membuat segalanya lebih mudah secara komputasi. Bagaimanapun ...

[x (dot) right, y (dot) up, z (dot) look]bukan matriks tampilan aktual. Matriks itu sendiri berbentuk:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1

di mana matriks 3x3 kiri atas mewakili rotasi, skala, dll. Semua orientasi kamera dilakukan di sana. Baris dan kolom yang tersisa digunakan untuk terjemahan dan beberapa hal perspektif rumit lainnya yang tidak akan saya bahas sekarang.

Ketika Anda mendapatkan matriks (dengan asumsi itu adalah matriks 4x4), terjemahan akan selalu disimpan di baris terakhir atau kolom terakhir, tergantung pada apakah kelas matriks Anda adalah urutan-utama atau urutan-kolom-utama.

Apa yang mungkin membuat Anda bingung adalah kenyataan bahwa Anda membutuhkan produk titik. Apa yang terjadi adalah penyederhanaan matrik matematika, ada jawaban yang lebih terperinci dalam pertanyaan Stack Overflow ini: /programming/349050/calculating-a-lookat-matrix

Solusinya dapat ditemukan di sini , Anda perlu mengambil kebalikan dari matriks dan mendapatkan terjemahannya:

Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;

5

Jawaban lain di sini menjelaskan cara mendapatkan posisi kamera dari pembalikan matriks kamera.

Jika bagian 3x3 dari matriks kamera hanya memiliki rotasi (tanpa penskalaan atau geser) seperti biasanya, perhitungan dapat dioptimalkan dengan mengalikan terjemahan matriks kamera dengan transpos rotasi kamera. Posisi kamera kemudian vektor terjemahan yang diubah dikalikan dengan -1. Dalam GLSL ini adalah:

vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;

atau

vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);

Ini adalah apa yang telah saya gunakan dalam shader vertex saya jika saya tidak ingin menghitung dan melewatkan posisi kamera sebagai seragam.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.