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.
Ketika mengubah objek, jelas bahwa normals perlu ditransformasikan sesuai. Tetapi mengapa, secara matematis, apakah ini matriks transformasi yang sesuai?
Jawaban:
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 xn ⋅ x + d= 0 n M. n′⋅ M.x + d′= 0 x
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
Saya akan menulis ulang ini dengan produk titik yang dinyatakan dalam notasi matriks (menganggap vektor sebagai matriks 1-kolom):
Sekarang untuk memuaskan ini untuk semua , kita harus memiliki:x
Sekarang menyelesaikan untuk dalam hal , nn′ n
Presto! Jika titik ditransformasikan oleh matriks , maka normal pesawat harus bertransformasi oleh transpos terbalik untuk mempertahankan persamaan bidang.M Mx M. M.
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.
sumber
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 .
sumber