Apa yang diwakili oleh sebuah matriks?

19

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:

masukkan deskripsi gambar di sini

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 Xydan a Xz? Saya membaca bahwa ini adalah sumbu yang berbeda (atas, kiri, maju) tetapi masih tidak dapat membuat kepala atau ekor dari signifikansi.

Pengembang CRUD Sedih
sumber

Jawaban:

19

Matriks dalam komputer grafis adalah transformasi yang diberikan kepada masing-masing koordinat dalam model. Setiap Matriks adalah kombinasi dari beberapa transformasi untuk diterapkan pada koordinat (titik dalam 3-ruang).

Membangun transformasi didasarkan dari salah satu dari tiga jenis transformasi: Terjemahkan, Putar dan Skala.

Matriks terjemahan adalah sesuatu seperti:

Matriks Terjemahan

Dan matriks skala: Matriks skala

Matriks rotasi terlihat seperti:

masukkan deskripsi gambar di sini

Untuk menggabungkan salah satu dari matriks ini, Anda cukup mengalikannya. Untuk menerapkan transformasi ke suatu titik, cukup gandakan ke titik tersebut (seperti yang terlihat dalam diagram terjemahan).

Alex Shepard
sumber
4
O jadi matriks tidak mewakili poin. Saya malu-malu sekarang
Pengembang CRUD Sedih
Banyak kali mereka diterapkan pada objek atau viewport secara keseluruhan (itulah cara Anda mendapatkan pandangan ortho vs perspektif)
Alex Shepard
3
@BDillan: Tidak, tapi mereka pasti bisa mengandung poin. Kolom terakhir dalam matriks ModelView (GL / kolom-utama), misalnya, mendefinisikan bagaimana asal diterjemahkan. Atau dengan kata lain, ini mendefinisikan di mana mata terletak di ruang-dunia dan secara harfiah dapat digunakan sebagai titik dengan sendirinya.
Andon M. Coleman
koordinat 3-tuple Anda. mengapa matriks bukan 3 kali 3? Misalkan untuk dapat menggabungkan ketiga jenis transformasi menjadi satu matriks dan masih memiliki cukup ruang, lalu, apa yang dilakukan sudut kanan bawah, sepertinya selalu 1?
n611x007
Baris / kolom keempat khusus ada untuk terjemahan. Salah satu fitur terbaik dari matematika matriks adalah saya dapat menggabungkan semua terjemahan & rotasi yang ingin saya selesaikan menjadi satu matriks. Ini berarti set transformasi yang sangat, sangat kompleks (secara teoritis tidak terbatas) dapat dikompresi menjadi 1 matriks. Ya, sel terakhir itu tetap 1, tetapi memungkinkan kita melakukan sisa matematika.
Alex Shepard
10

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 * matrixatau matrix * 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 .

wjl
sumber
punya banyak buku "bagus" tentang aljabar linier yang beberapa di antaranya bahkan sudah saya baca dan pahami. Masalahnya adalah itu tidak membantu sedikit pun, bukan karena saya memilikinya juga tidak saya mengerti. Saya merasa saran terakhir Anda adalah menjawab asumsi yang salah.
n611x007
9

Apa itu matriks?

Matriks dengan mkolom dan nbaris mewakili fungsi yang menggunakan vektor * dengan melemen (atau koordinat) dan menghasilkan vektor dengan nelemen.

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, output v, matriks M(perkaliannya M*u=vkemudian sama dengan f(u)=v) dan u(i)memberikan ielemen th u(elemen ke-2 adalah koordinat y, misalnya). Untuk matriks, M(i,j)berarti baris i, kolom j.

Konstruksi elemen v(1), yang pertama dalam hasil, dijelaskan oleh baris pertama dari matriks. u(1)kali M(1,1), plus u(2)kali M(1,2), ... ditambah u(i)kali M(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 usecara horizontal. Anda menulis baris ke-i Mdi 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 elemen v. (Sekarang Anda melihat mengapa mby by nmatrix harus beroperasi pada mvektor dan menghasilkan nvektor.)

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*Bberarti "fungsi yang berlaku pertama Bkemudian A". 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. Jika A*usama dengan f(u)dan B*usama dengan g(u)maka f(g(u))sama dengan f(B*u)yang sama dengan A*(B*u).

Demikian juga, aplikasi berulang dari fungsi yang sama dapat ditampilkan sebagai kekuatan, karena A*A*Aberarti menerapkan fungsi yang Amewakili 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:

[ 0 1
  1 0 ]

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 masukan X, Ydll masuk ke keluaran x.

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 dengan thetaderajat 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 fsedemikian rupa sehingga f(u)memberi Anda kembali u 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!

Hebat
sumber
jadi bagaimana Anda melakukan matriks untuk penambahan? katakanlah baris adalah Xx Yx Zx Tx... dan baris terakhir sebenarnya adalah 0t 0t 0t 1tsebagai pengganti dari Xt Yt Zt Tt. Untuk membuat (x+2, y)dari (x, y)Anda bisa pergi 1x 0y 0z 2tyang akan memberi Anda 1*x + 0*y + 0*z + 2*1sejak t=1kan? 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)
n611x007
2

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.

Andon M. Coleman
sumber
1

TL; versi DR:

Tiga elemen pertama [x y z]di setiap baris mewakili vektor basis tunggal dari sistem koordinat yang diubah. Elemen terakhir wadalah 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:

  • Titik ipada xsumbu [1 0 0], tetapi diputar 45 derajat. Ini hanya [i_x i_y i_z], di mana i_xdan i_yadalah kaki dari segitiga dengan 45 derajat interior sudut relatif terhadap sumbu X: [cos(45) sin(45) 0].
  • Suatu titik jpada 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].
  • Titik kpada zsumbu. Dalam contoh ini, ztidak 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?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Atau

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Jika Anda mengalikan simpul dengan matriks itu, Anda akan mendapatkannya

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

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 wyang biasanya 1. 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-4 wdi 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.

3Dave
sumber
2
Saat itu ketika Anda menyadari bahwa Anda baru saja menjawab pertanyaan yang sudah dijawab dari tiga tahun lalu ...
3Dave
: P Selalu perhatikan tanggal pertanyaan sebelum menjawab ...
HolyBlackCat