Mengapa invers transposisi dari model view matrix digunakan untuk mentransformasikan vektor normal?

22

Ketika merender adegan 3D dengan transformasi yang diterapkan pada objek, normals harus ditransformasikan dengan transpos terbalik dari matriks tampilan model. Jadi, dengan normal , modelViewMatrix , normal yang diubah adalahM.nMn

n=(M1)Tn

Ketika mengubah objek, jelas bahwa normals perlu ditransformasikan sesuai. Tetapi mengapa, secara matematis, apakah ini matriks transformasi yang sesuai?

Nero
sumber
Jika matriks model terbuat dari terjemahan, rotasi dan skala, Anda tidak perlu melakukan transpos terbalik untuk menghitung matriks normal. Cukup bagi yang normal dengan skala kuadrat dan kalikan dengan model matriks dan kita selesai. Anda dapat memperluas itu ke matriks apa pun dengan sumbu tegak lurus, cukup hitung skala kuadrat untuk setiap sumbu dari matriks yang Anda gunakan. Saya menulis detailnya di blog saya: lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html
Eric

Jawaban:

22

Berikut adalah bukti sederhana bahwa transpos invers diperlukan. Misalkan kita memiliki bidang, yang didefinisikan oleh persamaan bidang , di mana adalah normal. Sekarang saya ingin mengubah pesawat ini oleh beberapa matriks . Dengan kata lain, saya ingin mencari persamaan bidang baru yang dipenuhi untuk nilai persis sama yang memenuhi persamaan bidang sebelumnya.n M n M x + d = 0 xnx+d=0nMnMx+d=0x

Untuk melakukan ini, cukup untuk menetapkan persamaan dua bidang yang sama. (Ini memberikan kemampuan untuk mengubah skala persamaan pesawat secara sewenang-wenang, tapi itu tidak penting untuk argumen.) Kemudian kita dapat mengatur dan mengurangi itu. Yang tersisa adalah:d=d

nMx=nx

Saya akan menulis ulang ini dengan produk titik yang dinyatakan dalam notasi matriks (menganggap vektor sebagai matriks 1-kolom):

nTMx=nTx

Sekarang untuk memuaskan ini untuk semua , kita harus memiliki:x

nTM=nT

Sekarang menyelesaikan untuk dalam hal , nnn

nT=nTM1n=(nTM1)Tn=(M1)Tn

Presto! Jika titik ditransformasikan oleh matriks , maka normal pesawat harus bertransformasi oleh transpos terbalik untuk mempertahankan persamaan bidang.M MxMM

Ini pada dasarnya adalah properti dari produk titik. Agar produk titik tetap invarian ketika transformasi diterapkan, dua vektor yang bertitik harus berubah dengan cara yang sesuai tetapi berbeda.

Secara matematis, ini dapat digambarkan dengan mengatakan bahwa vektor normal bukanlah vektor biasa, tetapi sesuatu yang disebut kovektor (alias vektor kovarian, vektor ganda, atau bentuk linear). Seorang covector pada dasarnya didefinisikan sebagai "sesuatu yang dapat dihiasi dengan vektor untuk menghasilkan skalar yang invarian". Untuk mencapai itu, ia harus bertransformasi menggunakan transpos terbalik dari matriks apa pun yang beroperasi pada vektor biasa. Ini berlaku di sejumlah dimensi.

Perhatikan bahwa dalam 3D secara khusus, bivektor mirip dengan kovektor. Mereka tidak persis sama karena mereka memiliki unit yang berbeda: kovektor memiliki satuan panjang terbalik sedangkan bivektor memiliki satuan panjang kuadrat (area), sehingga mereka berperilaku berbeda di bawah penskalaan. Namun, mereka melakukan transformasi dengan cara yang sama sehubungan dengan orientasi mereka, yang merupakan hal yang penting bagi orang normal. Kami biasanya tidak peduli tentang besarnya normal (toh kami selalu menormalkannya dengan satuan panjang), jadi kami biasanya tidak perlu khawatir tentang perbedaan antara bivektor dan kovektor.

Nathan Reed
sumber
2
penjelasan yang luar biasa. Namun sedikit lebih cepat pada 2 poin, sedikit lebih detail akan disukai: 1. bagaimana Anda melompat dari produk titik ke produk matriks? 2. antara baris 2 dan 3 dari bagian yang terakhir dikutip, apa yang terjadi (n dipindahkan dari kiri ke kanan sedikit secara ajaib kepada saya)
v.oddou
4
1. (a ^ T) b sama dengan titik (a, b) jika a dan b adalah matriks kolom dari dimensi yang sama. Cobalah matematika sendiri! 2. (AB) ^ T = (B ^ T) (A ^ T), dan (A ^ T) ^ T = A Untuk identitas matriks lebih lanjut, periksa The Matrix Cookbook
Mokosha
3
@ v.oddou Yap, Mokosha benar. Produk titik dapat dinyatakan sebagai mengalikan matriks 1 × n (vektor baris) dengan matriks × 1 (vektor kolom); hasilnya adalah matriks 1 × 1 yang komponen tunggalnya adalah produk titik. Transpos vektor kolom adalah vektor baris, jadi kita dapat menulis a · b sebagai a ^ T b. Untuk pertanyaan kedua, transposing produk matriks sama dengan transposing faktor individu dan membalikkan urutannya.
Nathan Reed
sempurna, semuanya jelas tanpa masalah sekarang. terima kasih keduanya.
v.oddou
@NathanReed (Astaga ini membawaku kembali ke hari-hari awal PowerVR di mana kami memodelkan sebagian besar hal dengan pesawat). Mungkin juga layak disebutkan bahwa, untuk keperluan optimasi, jika Anda memiliki matriks Mr yang hanya berisi rotasi, (yaitu orthogonal) maka Inverse ( Mr ) = Transpose ( Mr ), dan Trans (Inverse ( Mr ) = _ Mr_. Anda juga dapat mengambil pintasan dengan bagian terjemahan dan jika Anda tahu penskalaannya seragam. FWIW di perpustakaan grafis SGL PowerVR, kami biasa menyimpan boolean untuk melacak apakah matriks transformasi memiliki properti ini untuk menghemat biaya dengan transformasi normal.
Simon F
6

Ini hanya karena normals tidak benar-benar vektor! Mereka dibuat oleh produk silang, yang menghasilkan bivektor , bukan vektor. Aljabar bekerja jauh berbeda untuk koordinat ini, dan transformasi geometris hanyalah satu operasi yang berperilaku berbeda.

Sumber yang bagus untuk mempelajari lebih lanjut tentang ini adalah presentasi Eric Lengyel tentang Grassman Algebra .

ap_
sumber
Normal juga disebut pseudovektor. Sebagai generalisasi dan aturan praktis, segala sesuatu yang dihasilkan dari produk silang (misalnya pesawat) akan ditransformasikan dengan cara yang sama.
Matthias