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).
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: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:
sumber
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:
atau
Ini adalah apa yang telah saya gunakan dalam shader vertex saya jika saya tidak ingin menghitung dan melewatkan posisi kamera sebagai seragam.
sumber