Apakah mungkin untuk mengubah matriks rotasi 3d (4x4) menjadi bagian-bagian komponennya (rotasi, skala, dll.)?

11

Agar lebih konkret, saya sedang mengerjakan aplikasi iOS, dan memiliki CATransform3Dstruct (pada dasarnya array transformasi 4x4).

Apakah mungkin untuk menyimpulkan semua "operasi" yang berbeda yang diimplikasikan oleh matriks ini? Hal-hal seperti berapa banyak rotasi, skala, dll.

elsurudo
sumber

Jawaban:

10

Anda dapat menguraikan matriks menjadi transformasi dasar: terjemahan, penskalaan, dan rotasi. Diberikan matriks ini:M=TRS

M=[a00a01a02a03a10a11a12a13a20a21a22a230001]

Anda dapat menguraikan terjemahan dengan inspeksi menggunakan kolom terakhir .t=(a03,a13,a23)

Untuk penskalaan, kita tahu bahwa tiga kolom pertama dari matriks sesuai dengan basis (sumbu). Kita bisa mendapatkan skala dengan panjang / norma vektor-vektor ini, yaitu berapa banyak basis yang diskalakan. Jadi skalanya adalah mana:s=(s0,s1,s2)

s0=(a00,a10,a20)s1=(a01,a11,a21)s2=(a02,a12,a22)

Sekarang Anda memiliki skala, Anda dapat membuangnya menggunakan sub-matriks yang sesuai dengan dengan mengalikan matriks dengan kebalikan dari skala untuk dapatkan3×3RSS1R

(RS)S1=[a00a01a02a10a11a12a20a21a22][s0000s1000s2]1=[a00a01a02a10a11a12a20a21a22][1/s00001/s10001/s2]

Jadi ( ):(RS)S1=RI=R

R=[a00/s0a01/s1a02/s2a10/s0a11/s1a12/s2a20/s0a21/s1a22/s2]

Ini adalah matriks rotasi final. Anda selanjutnya dapat menguraikannya menggunakan banyak cara. Itu berhenti panjang tetapi Anda dapat mencari untuk menguraikan matriks rotasi .


Metode ini hanya memberikan nilai yang setara dalam bentuk terjemahan, penskalaan dan rotasi (matriks asli mungkin hasil dari jenis transformasi lain). Ini mungkin memiliki masalah dengan presisi floating point dengan sudut rotasi jika Anda lebih lanjut menggunakan sudut yang terdekomposisi, kesalahan pembulatan dapat menumpuk di dalam perhitungan. Anda tidak boleh menggunakannya kecuali Anda tidak membuat sendiri matriksnya.

Jika Anda adalah orang yang membuat matriks dan menginginkan dekomposisi agar dapat mengedit dan menampilkan terjemahan, skala, dan rotasi secara individual dan mandiri , mungkin yang paling bersih mengapa menyimpan komponen , dan dalam kelas transformasi secara individual sebagai vektor (mungkin angka empat untuk rotasi). Hanya ketika Anda membutuhkan matriks transformasi, buatlah matriks dari komponen-komponen ini (Anda dapat men-cache matriks sampai beberapa komponen diubah).tsrTRS

pengguna5488
sumber
2
Bisakah Anda mengklarifikasi apa masalah dengan presisi floating-point? Saya tidak melihat apa pun dalam metode ini yang akan menyebabkan masalah presisi, kecuali skalanya benar-benar ekstrem. Juga, perlu dicatat bahwa metode ini mungkin gagal jika matriks terdiri dari urutan matriks yang mencakup skala dan rotasi yang tidak seragam. The matriks akan berubah tidak menjadi rotasi dalam kasus itu, tetapi akan mencakup beberapa geser. R
Nathan Reed
2
Semua angka floating point memiliki kesalahan intrinsik (dibatasi). Setiap kali Anda melakukan operasi, dan khususnya penambahan atau pengurangan, Anda menambah kesalahan, meningkatkan besarnya batas. Tersembunyi dalam algoritma dekomposisi adalah banyak operasi tambahan (baik dalam perkalian matriks dan perhitungan skala besaran) dan akar kuadrat (dalam skala). Dekomposisi lebih lanjut akan menyebabkan kesalahan lebih lanjut.
Timbo
1
@ Tribo Tidak ada perkalian matriks penuh di sini, hanya mengalikan kolom matriks dengan skala terbalik. Dan besarnya vektor melibatkan penambahan semua jumlah positif, jadi tidak ada pembatalan besar di sana; itu tidak menghasilkan banyak kesalahan relatif, AFAICT. Bagaimanapun, penulis mengklarifikasi bahwa mereka sedang berbicara tentang penguraian lebih lanjut matriks rotasi ke sudut Euler atau semacamnya, yang lebih masuk akal.
Nathan Reed
Terima kasih - jawaban yang bagus. Tindak lanjut: untuk mendapatkan kembali matriks asli, saya mengasumsikan kita perlu mengikuti urutan operasi tertentu, mulai dari matriks identitas. Apakah pesanan ini adalah TRS?
elsurudo