Saya mulai belajar OpenGL baru-baru ini dan saya mengalami masalah dalam memvisualisasikan matriks apa dan peran mereka dalam grafik komputer. Diberi templat matriks 4x4 seperti ini:
Saya akan berasumsi bahwa setiap matriks seperti ini adalah koordinat titik di ruang dunia. Dan beberapa dari mereka disatukan dan diberi naungan memberi objek?
Tetapi mengapa ada a Xx
, a Xy
dan a Xz
? Saya membaca bahwa ini adalah sumbu yang berbeda (atas, kiri, maju) tetapi masih tidak dapat membuat kepala atau ekor dari signifikansi.
Dalam grafik komputer, kami menggunakan matriks untuk menyandikan transformasi .
Matriks yang hanya berisi terjemahan, rotasi, atau transformasi penskalaan memiliki interpretasi yang umum dieksploitasi: 3x3 kiri atas matriks hanya berisi data rotasi atau skala, baris bawah atau kolom kanan berisi data terjemahan. Ini bukan generalitas, tetapi berlaku cukup sering untuk subset transformasi yang diwakili dalam grafik komputer yang digunakan orang.
Demikian pula, ada hubungan antara nilai-nilai matriks dan kerangka koordinat yang sesuai yang diwakili oleh matriks (yang tidak selalu "ruang dunia," saya harus perhatikan). Kolom 3x3 kiri atas (atau baris) mewakili sumbu X, Y dan Z dari kerangka koordinat.
Apakah baris mewakili sumbu atau tidak, kolom bergantung pada apakah Anda menggunakan konvensi mengalikan sebagai
row vector * matrix
ataumatrix * column vector
. Saat melakukan perkalian matriks, dimensi bagian dalam dari dua matriks harus setuju, dan jadi apakah Anda mewakili vektor sebagai matriks baris atau matriks kolom memengaruhi pilihan itu (OpenGL dan matematika tradisional cenderung lebih memilih vektor kolom).Saya sarankan untuk mendapatkan buku yang bagus tentang aljabar linier, atau setidaknya melihat FAQ Matriks dan Quaternion dan posting ini tentang tata letak matriks di DirectX dan OpenGL .
sumber
Apa itu matriks?
Matriks dengan
m
kolom dann
baris mewakili fungsi yang menggunakan vektor * denganm
elemen (atau koordinat) dan menghasilkan vektor dengann
elemen.Dari sini Anda dapat mengamati bahwa jika dan hanya jika sebuah matriks adalah bujur sangkar, maka dimensi vektor tidak akan berubah. Misalnya. Anda mendapatkan vektor 3D dari mentransformasikan vektor 3D, 2D dari 2D, dll.
* : Dalam fisika, vektor biasanya digunakan untuk menunjukkan kekuatan atau "pengaruh" lain yang "bergerak" seperti kecepatan atau percepatan. Tapi tidak ada yang menghentikan Anda dari menggunakan vektor untuk mewakili suatu titik atau sembarang array angka (beberapa perpustakaan dan bahasa pemrograman bahkan menggunakan "vektor" berarti "1D array"). Untuk digunakan dengan matriks, apa pun bisa menjadi elemen dari vektor Anda (bahkan string atau warna), asalkan Anda memiliki cara untuk menambahkan, mengurangi dan mengalikannya dengan apa pun elemen matriks Anda. Karenanya vektor nama , yang berarti "operator" - membawa atau menyimpan nilai untuk Anda.
Apa yang dimaksud dengan mengalikan dengan matriks?
Jadi jika sebuah matriks adalah fungsi, fungsi apa ? Apa fungsinya? Resep untuknya ditentukan oleh elemen-elemen dari matriks. Mari kita sebut input
u
, outputv
, matriksM
(perkaliannyaM*u=v
kemudian sama denganf(u)=v
) danu(i)
memberikani
elemen thu
(elemen ke-2 adalah koordinat y, misalnya). Untuk matriks,M(i,j)
berarti barisi
, kolomj
.Konstruksi elemen
v(1)
, yang pertama dalam hasil, dijelaskan oleh baris pertama dari matriks.u(1)
kaliM(1,1)
, plusu(2)
kaliM(1,2)
, ... ditambahu(i)
kaliM(1,i)
. Matriks sedikit mirip dengan bahasa pemrograman yang sangat sederhana, yang hanya baik untuk fungsi pemrograman yang bekerja dengan mengaduk-aduk input, menambahkannya ke diri mereka sendiri, dll. **Sangat membantu untuk membayangkan bahwa Anda bekerja pada satu elemen output pada suatu waktu, karenanya, Anda hanya menggunakan satu baris matriks pada suatu waktu. Anda menulis
u
secara horizontal. Anda menulis baris ke-iM
di bawahnya. Anda mengalikan setiap pasangan di atas / di bawah ini dan menulis produk di bawah ini, lalu menambahkan produk. Ulangi untuk setiap baris untuk mendapatkan setiap elemenv
. (Sekarang Anda melihat mengapam
by byn
matrix harus beroperasi padam
vektor dan menghasilkann
vektor.)Cara lain untuk berpikir tentang ini - katakanlah kita sedang melakukan transformasi 3D ke 3D, jadi matriks 3x3 (atau transformasi 3D seperti yang sering disebut karena Anda dapat berpura-pura "fungsi" ini adalah "memindahkan" poin 3D, meskipun sebenarnya ini hanya mengubah angka). Katakanlah baris pertama adalah
[1 2 0]
. Ini berarti, untuk mendapatkan x hasil, dapatkan 1 dari input x, 2 dari input y, dan 0 dari input z. Jadi itu benar-benar resep.** : Jika sebuah matriks adalah bahasa pemrograman, maka itu bahkan Turing tidak lengkap.
Apa yang dimaksud dengan mengalikan dua matriks?
Jika mereka berdua matriks ukuran yang sesuai, maka
A*B
berarti "fungsi yang berlaku pertamaB
kemudianA
". Anda dapat melihat mengapa kendala pada ukuran untuk perkalian ada, karena ukuran menentukan ukuran input dan output, dan satu matriks mengkonsumsi output yang lain. Mengapa multiplikasi berarti menggabungkan fungsi? Lebih mudah untuk memperhatikan bahwa itu harus terjadi. JikaA*u
sama denganf(u)
danB*u
sama dengang(u)
makaf(g(u))
sama denganf(B*u)
yang sama denganA*(B*u)
.Demikian juga, aplikasi berulang dari fungsi yang sama dapat ditampilkan sebagai kekuatan, karena
A*A*A
berarti menerapkan fungsi yangA
mewakili tiga kali.Bagaimana matriks bermanfaat?
Apa gunanya melakukan transformasi
new_x = 1*x+2*y+0*z
(jika baris pertama adalah [1 2 0])? Itu tidak terlalu jelas, tetapi mari kita ambil matriks 2D lain untuk menjelaskannya. Matriksnya adalah:Atau
[0 1; 1 0]
menggunakan notasi Matlab yang nyaman. Apa yang dilakukan matriks ini? Ini mengubah vektor 2D seperti: Untuk x hasil, ambil 1 dari y input. Untuk hasil y, ambil 1 dari x input. Kami baru saja menukar koordinat x dan y dari input - matriks ini mencerminkan poin tentang garis x = y. Itu semacam berguna! Dengan ekstensi, Anda akan melihat bahwa semua matriks dengan 1s di sepanjang garis SW - NE mencerminkan. Anda juga dapat melihat mengapa matriks identitas memberi Anda kembali input (untuk x output, mengambil x input; untuk y output, mengambil y input ...).Sekarang Anda melihat mengapa simbol-simbol itu misalnya.
Xx
,Yx
- mereka berarti berapa banyak masukanX
,Y
dll masuk ke keluaranx
.Bagaimana lagi matriks bermanfaat?
Transformasi apa lagi yang bisa Anda lakukan? Anda dapat mengubah ukuran dengan mengambil matriks identitas, tetapi dengan nomor yang berbeda dari 1 sepanjang diagonal. Misalnya,
[2.5 0; 0 22.5]
akan mengalikan setiap koordinat input dengan 2,5, dan jika Anda menerapkan matriks ini untuk setiap titik dalam gambar, gambar akan menjadi 2,5 besar. Jika Anda hanya meletakkan 2,5 dalam satu baris ([2.5 0; 0 1]
) maka hanya koordinat x yang akan dikalikan, sehingga Anda hanya akan meregangkan sepanjang x.Matriks lain dapat memberikan transformasi lain, seperti "condong", yang memiliki berbagai tingkat kegunaan. Secara pribadi, condong adalah favorit saya paling tidak karena matriks terlihat sangat sederhana tetapi transformasi itu sendiri jarang melakukan apa pun kecuali memotong-motong gambar. Yang bermanfaat adalah "rotasi" - bagaimana Anda memutar titik? Coba
(x, y)
cari posisi titik setelah berputar dengantheta
derajat berlawanan arah jarum jam tentang asalnya. Anda akan menemukan bahwa koordinat x dan y baru keluar dari mengalikan x dan y lama dengan beberapa sinus dan cosinus theta. Anda harus dapat dengan mudah menulis matriks rotasi menggunakan sinus dan cosinus yang sesuai dengan fungsi ini.Dengan matriks non-kuadrat, Anda juga dapat mengubah dimensi input. Mengubah input 2D menjadi 3D tidak terlalu berguna, karena sulit untuk "membuat" sesuatu untuk dimasukkan ke dalam koordinat baru, tetapi 3D menjadi 2D sangat berguna. Antara lain, ini adalah bagaimana komputer Anda tahu untuk proyek *** adegan 3D menjadi gambar 2D untuk menggambar pada monitor Anda.
Karena vektor dapat menampung hal-hal yang berbeda, Anda bahkan dapat mendeskripsikan sebuah matriks yang mengenkripsi string n-karakter sekaligus, dengan mengocoknya atau "mengalikannya" (Anda harus membuat fungsi perkalian / penjumlahan).
*** : Saat Anda memproyeksikan , Anda mengambil objek 3D seperti patung, menyorotinya, dan melihat bayangan 2D seperti apa yang jatuh di dinding.
Apa batasan dari matriks?
Bisakah Anda melakukan setiap fungsi dengan matriks? Tidak. Berpikir secara grafik, sulit membayangkan sesuatu yang tidak bisa dilakukan oleh sebuah matriks (tetapi ada: efek "swirl" tidak dapat dilakukan, misalnya). Namun, inilah contoh yang mudah: Katakanlah fungsi
f
sedemikian rupa sehinggaf(u)
memberi Anda kembaliu
dengan setiap elemen kuadrat . Anda akan melihat bahwa Anda tidak dapat menulis matriks untuk ini: Dengan matriks hanya ada fasilitas untuk menggambarkan resep yang mengalikan koordinat dengan angka konstan, tidak ada fungsi mewah lainnya seperti daya dapat diekspresikan.**** : Ini juga mengapa disebut aljabar linier - fungsi daya non-linear , tidak membuat garis lurus saat diplot.
Pada baris tambahan aneh dalam matriks 4D
Sekarang, mengapa matriks dalam contoh Anda 4 oleh 4? Bukankah ini berarti ruang 4 dimensi? Kami tidak memiliki komputer 4D, jadi mengapa? Ini sebenarnya adalah trik yang menarik dengan matriks yang berhubungan dengan poin sebelumnya tentang operasi linier.
Mengenai fungsi mana yang tidak dapat dilakukan dengan matriks: Apa matriks untuk memindahkan titik 2D dengan 2 unit ke kanan (yang menghasilkan titik
(x+2, y)
? Sekali lagi, kita terjebak. Ada cara untuk mengalikan input, tetapi tidak ada cara untuk menambahkan konstanta. Untuk pekerjaan 2D, triknya adalah berpura-pura Anda sebenarnya tidak berada dalam ruang 2D, tetapi dalam ruang 3D, kecuali ketinggian (z koordinat atau elemen ke-3) dari semuanya selalu 1 (ini seperti bagaimana alam semesta 2D adalah hanya "piring" yang terbentang rata di sepanjang lantai alam semesta 3D - dalam hal ini koordinat ketiga selalu 0.) Kemudian Anda dapat menggunakan koordinat terakhir sihir ini sebagai konstanta, karena Anda tahu selalu ada 1 untuk setiap input.Demikian juga, untuk memindahkan titik 3D, Anda memerlukan koordinat 4D. Itu juga mengapa semua matriks transformasi 3D yang Anda lihat akan memiliki
[0 0 0 1]
sebagai baris terakhir - Anda tidak boleh mengubah dimensi ke-4, atau hasilnya akan terlalu rumit untuk diwakili dalam 3D!sumber
Xx Yx Zx Tx
... dan baris terakhir sebenarnya adalah0t 0t 0t 1t
sebagai pengganti dariXt Yt Zt Tt
. Untuk membuat(x+2, y)
dari(x, y)
Anda bisa pergi1x 0y 0z 2t
yang akan memberi Anda1*x + 0*y + 0*z + 2*1
sejakt=1
kan? Yang jumlahnya cukup banyak hingga x + 2. Oh sayang sekarang Anda bisa mengacaukan rendering Anda dengan nilai-nilai T lucu, bukan? -grin- (baca lama, masih nilai terbaik, thx)Itu adalah matriks kolom-utama 4x4, dan dari tampilannya, sebuah matriks tampilan.
3 kolom pertama menentukan arah vektor basis Anda (atas, kiri, maju seperti yang Anda panggil), dan kolom terakhir mendefinisikan terjemahan titik mata. Gabungkan keduanya dan Anda dapat menggambarkan orientasi kamera Anda, dan yang lebih penting Anda dapat menggunakan matriks ini untuk mengubah titik menjadi ruang koordinat yang dikenal sebagai "ruang mata", "ruang tampilan" atau "ruang kamera".
Itu semua adalah sinonim untuk ruang koordinat yang sama. Sayangnya Anda harus mempelajari semua sinonim ketika berurusan dengan grafik komputer karena buku dan orang yang berbeda akan memanggilnya dengan nama yang berbeda. Sebagian besar ruang koordinat memiliki beberapa nama.
Ngomong-ngomong, tiga kolom dalam matriks tampilan Anda umumnya ortogonal, yaitu mereka membentuk sudut yang tepat satu sama lain. Ini tidak diperlukan, tetapi ini adalah properti yang sangat umum ketika membuat kamera tradisional.
sumber
TL; versi DR:
Tiga elemen pertama
[x y z]
di setiap baris mewakili vektor basis tunggal dari sistem koordinat yang diubah. Elemen terakhirw
adalah komponen terjemahan.Versi Panjang
Jika Anda menginginkan sebuah matriks yang, ketika diterapkan pada suatu titik, akan memutar titik tersebut tentang asal dengan, katakanlah, 45 derajat, Anda akan mengisi matriks dengan tiga vektor yang mewakili sumbu yang ditransformasikan:
i
padax
sumbu[1 0 0]
, tetapi diputar 45 derajat. Ini hanya[i_x i_y i_z]
, di manai_x
dani_y
adalah kaki dari segitiga dengan 45 derajat interior sudut relatif terhadap sumbu X:[cos(45) sin(45) 0]
.j
pada sumbu y[0 1 0]
, tetapi diputar 45 derajat dari sumbu itu. Buat sketsa di selembar kertas dan Anda akan melihat bahwa, ketika berputar berlawanan arah jarum jam, komponen menjadi[-sin(45) cos(45) 0]
.k
padaz
sumbu. Dalam contoh ini,z
tidak terpengaruh karena kita berputar di bidang xy (sejajar layar)Jadi, kami memiliki tiga vektor baru: i, j, k. Cara mudah untuk memvisualisasikan ini hanya dengan mengambil sumbu X dan Y dan memutar seluruh susunan silang.
Bagaimana kita menempatkan ini dalam sebuah matriks?
Atau
Jika Anda mengalikan simpul dengan matriks itu, Anda akan mendapatkannya
untuk
v = [1 0 0]
, danΘ = 90°
, ini menjadiv1 = [0 1 0]
Untuk terjemahan, kami menambahkan baris dan kolom keempat, dan menempatkan komponen terjemahan di kolom terakhir. Kami menambahkan komponen keempat ke simpul
w
yang biasanya1
. Ini adalah bahwa, ketika kita mengalikan titik dengan matriks, komponen w menyebabkan kolom terakhir ditambahkan ke titik masukan, sehingga titik dipindahkan atau diterjemahkan. Kami menyebutnya "koordinat homogen." (Untuk tujuan kami, "homogen" hanya berarti ada komponen ke-4w
di setiap vektor, dan kami menggunakan matriks 4x4 alih-alih 3x3. Sering kali Anda akan melihat shader yang menggunakan matriks 4x3 untuk menghindari pengiriman baris ke-4 yang kebanyakan tidak berguna) ke GPU, yang menghabiskan memori dan bandwidth yang berharga. Baris ke-4 diperlukan untuk proyeksi perspektif, tetapi tidak banyak yang lain.)Semoga ini membantu.
sumber