Mengapa angka empat digunakan untuk rotasi?

107

Saya seorang fisikawan, dan telah mempelajari beberapa pemrograman, dan telah menemukan banyak orang yang menggunakan angka empat untuk rotasi daripada menulis sesuatu dalam bentuk matriks / vektor.

Dalam fisika, ada alasan yang sangat bagus mengapa kita tidak menggunakan angka empat (terlepas dari cerita aneh yang kadang-kadang diceritakan tentang Hamilton / Gibbs / dll). Fisika mensyaratkan bahwa deskripsi kita memiliki perilaku analitik yang baik (ini memiliki arti yang didefinisikan dengan tepat, tetapi dalam beberapa cara yang agak teknis yang jauh melampaui apa yang diajarkan di kelas intro normal, jadi saya tidak akan menjelaskan secara detail). Ternyata angka empat tidak memiliki perilaku yang baik ini, sehingga tidak berguna, dan vektor / matriks melakukannya, jadi kami menggunakannya.

Namun, terbatas pada rotasi dan deskripsi kaku yang tidak menggunakan struktur analitik apa pun, rotasi 3D dapat dijelaskan secara ekuivalen dengan cara apa pun (atau beberapa cara lain).

Secara umum, kita hanya ingin pemetaan titik X = (x, y, z) ke titik baru X '= (x', y ', z') tunduk pada batasan bahwa X 2 = X ' 2 . Dan ada banyak hal yang melakukan ini.

Cara naifnya adalah dengan menggambar segitiga yang ditentukan ini dan menggunakan trigonometri, atau gunakan isomorfisme antara titik (x, y, z) dan vektor (x, y, z) dan fungsi f (X) = X 'dan matriks MX = X ', atau menggunakan angka empat, atau memproyeksikan komponen dari vektor lama bersama yang baru menggunakan beberapa metode lain (x, y, z) T. (a, b, c) (x', y ', z '), dll.

Dari sudut pandang matematika, semua deskripsi ini setara dalam pengaturan ini (sebagai teorema). Mereka semua memiliki jumlah derajat kebebasan yang sama, jumlah batasan yang sama, dll.

Jadi mengapa angka empat tampaknya lebih disukai daripada vektor?

Alasan yang biasa saya lihat adalah tidak ada kunci gimbal, atau masalah numerik.

Argumen tanpa kunci gimbal tampak aneh, karena ini hanya masalah sudut euler. Ini juga hanya masalah koordinat (seperti singularitas pada r = 0 di koordinat kutub (Jacobian kehilangan peringkat)), yang berarti hanya masalah lokal, dan dapat diselesaikan dengan mengganti koordinat, memutar keluar dari degenerasi, atau menggunakan dua sistem koordinat yang tumpang tindih.

Saya kurang yakin tentang masalah numerik, karena saya tidak tahu secara rinci bagaimana kedua hal ini (dan alternatif apa pun) akan diterapkan. Saya telah membaca bahwa menormalkan kembali angka empat lebih mudah daripada melakukan itu untuk matriks rotasi, tetapi ini hanya berlaku untuk matriks umum; rotasi memiliki kendala tambahan yang meremehkan ini (yang dibangun ke dalam definisi quaternions) (Faktanya, ini harus benar karena mereka memiliki jumlah derajat kebebasan yang sama).

Jadi apa alasan penggunaan angka empat dibandingkan vektor atau alternatif lain?

JMP
sumber
2
"Tidak ada kunci gimbal" itu bohong. Anda memiliki masalah kunci gimbal yang sama dengan yang Anda miliki dengan sudut Euler jika Anda menggunakan dua rotasi ortogonal dengan quaternion. Anda hanya tidak memiliki masalah untuk satu rotasi karena ini adalah 1 operasi, bukan 3.
Damon
2
@ Damon Ini tidak sepenuhnya benar. Lihat mathoverflow.net/a/95908/97344
plasmacel

Jawaban:

61

Kunci Gimbal adalah salah satu alasannya, meskipun seperti yang Anda katakan, ini hanya masalah sudut Euler dan mudah dipecahkan. Sudut euler masih digunakan saat memori menjadi perhatian karena Anda hanya perlu menyimpan 3 angka.

Untuk angka empat versus matriks rotasi 3x3, angka empat memiliki keunggulan dalam hal ukuran (4 skalar vs. 9) dan kecepatan (perkalian angka empat jauh lebih cepat daripada perkalian matriks 3x3).

Perhatikan bahwa semua representasi rotasi ini digunakan dalam praktiknya. Sudut Euler menggunakan paling sedikit memori; matriks menggunakan lebih banyak memori tetapi tidak mengalami kunci Gimbal dan memiliki sifat analitik yang bagus; dan angka empat mencapai keseimbangan yang bagus dari keduanya, karena ringan, tetapi bebas dari kunci Gimbal.

Peter Alexander
sumber
Tetapi matriks rotasi tidak memiliki banyak komponen independen - itu dibatasi. Rotasi dua dimensi ditentukan oleh tiga koordinat dalam tiga dimensi, terlepas dari representasi. Matriks memiliki lebih banyak komponen secara umum karena mereka dapat melakukan lebih dari sekadar rotasi. Tetapi dalam kasus rotasi, komponen tambahan ditentukan berdasarkan komponen lainnya.
JMP
1
@JMP: Kamu benar. Banyak orang melakukan "kompresi" matriks sehingga Anda hanya menyimpan informasi sebanyak yang diperlukan, tetapi matriks yang dikompresi lebih sulit ditangani, sehingga Anda kehilangan performa. Ini semua tentang trade-off dalam memori dan kinerja.
Peter Alexander
10
@JMP Rutin perkalian matriks standar membutuhkan semua 9 nilai. Meskipun hanya 3 dari mereka yang independen, masih membutuhkan memori 9 angka ketika Anda benar-benar melakukan matematika (sekali lagi, jika Anda benar-benar melakukan perkalian matriks di komputer).
David Z
1
"perkalian kuartener jauh lebih cepat dari perkalian matriks 3x3" Benarkah? Rotasi kuarter memerlukan 24 operasi penambahan / mul (karena dua kali operasi produk silang dan operasi tambahan), matriks 3x3 hanya memerlukan 15 operasi penambahan / mul.
Marat Buharov
Dapat menggunakan hanya menggunakan 2 vektor (6 float) untuk benar-benar mewakili orientasi 3D, vektor ke-3 hanya bersilangan. Keuntungan yang dimiliki matriks adalah bahwa mereka sudah dalam bentuk yang siap digunakan untuk banyak aplikasi. Euler dan Quats membutuhkan pengepakan (dari matriks) dan pembongkaran (ke matriks) yang membutuhkan pemrosesan ekstra. Euler dan Quats dapat berguna untuk penyimpanan jangka panjang yang ringkas.
pengguna3015682
39

Dalam fisika, ada alasan yang sangat bagus mengapa kita tidak menggunakan angka empat (terlepas dari cerita aneh yang kadang-kadang diceritakan tentang Hamilton / Gibbs / dll). Fisika mensyaratkan bahwa deskripsi kita memiliki perilaku analitik yang baik (ini memiliki arti yang didefinisikan dengan tepat, tetapi dalam beberapa cara yang agak teknis yang jauh melampaui apa yang diajarkan di kelas intro normal, jadi saya tidak akan menjelaskan secara detail). Ternyata angka empat tidak memiliki perilaku yang baik ini, sehingga tidak berguna, dan vektor / matriks melakukannya, jadi kami menggunakannya.

Ya, saya juga seorang fisikawan. Dan ada beberapa situasi di mana angka empat sangat sederhana! Spherical Harmonics misalnya. Anda memiliki dua atom yang berhamburan, bertukar elektron: apa transfer spin orbitalnya? Dengan quaternions itu hanya perkalian yaitu menjumlahkan eksponen dari fungsi dasar SH yang dinyatakan sebagai quaternion. (Membuat Polinomial Legendre menjadi notasi empat digit agak membosankan).

Tapi saya setuju, mereka bukan alat universal, dan terutama dalam mekanika bodi yang kaku, alat ini akan sangat rumit untuk digunakan. Namun untuk mengutip jawaban Bertrand Russell atas pertanyaan seorang siswa, seberapa banyak matematika yang perlu diketahui fisikawan: "Sebisa mungkin!"

Bagaimanapun: Mengapa kita menyukai angka empat dalam grafik komputer? Karena mereka memiliki sejumlah properti yang menarik. Pertama, seseorang dapat menginterpolasi mereka dengan baik, yang penting jika seseorang menganimasikan hal-hal yang berputar, seperti anggota badan di sekitar sendi. Dengan angka empat, itu hanyalah perkalian skalar dan normalisasi. Mengekspresikan ini dengan matriks membutuhkan evaluasi sin dan cos, kemudian membangun matriks rotasi. Maka mengalikan vektor dengan angka empat masih lebih murah karena melalui perkalian vektor-matriks penuh, juga masih lebih murah jika ditambahkan terjemahan setelahnya. Jika Anda mempertimbangkan sistem animasi kerangka untuk karakter manusia, di mana seseorang harus mengevaluasi banyak terjemahan / rotasi untuk sejumlah besar simpul, ini berdampak besar.

Efek samping lain yang bagus dari penggunaan quaternions adalah, bahwa setiap transformasi secara inheren adalah ortonormal. Dengan matriks terjemahan, seseorang harus menormalkan ulang setiap beberapa langkah animasi, karena kesalahan pembulatan numerik.

datenwolf
sumber
1
Apakah Anda memiliki referensi untuk harmonik bola / polinomial Legendre dengan angka empat? Saya akan menyerahkan makalah yang berhubungan dengan topik terkait dan ingin melihat (dapat mengutip) karya lain tentang ini.
Mike
4
@ Mike: Keluar dari kepalaku, sayangnya tidak ada yang dipublikasikan. Sayangnya angka empat masih agak kabur bagi fisikawan. Saya hanya mengingatnya, karena guru saya di Quantum Mechanic 2 menjadikan ini sebagai latihan dan saya terpesona olehnya. Apa yang pada dasarnya kita lakukan adalah menggunakan istilah exp ((a · iω + b · jθ + c · kη + d) r), di mana r itu sendiri adalah variabel kompleks. Jika Anda memplot ini, Anda mendapatkan distribusi 3 dimensi (kita harus mengembangkan deret eksponensial sehubungan dengan variabel quaternion terlebih dahulu). Hal ini memungkinkan untuk melakukan transformasi "fourier", menghasilkan sesuatu yang bisa Anda ubah menjadi istilah SH yang dikenal.
datenwolf
31

Argumen tanpa kunci gimbal tampak aneh, karena ini hanya masalah sudut euler. Ini juga hanya masalah koordinat (seperti singularitas pada r = 0 di koordinat kutub (Jacobian kehilangan peringkat)), yang berarti hanya masalah lokal, dan dapat diselesaikan dengan mengganti koordinat, memutar keluar dari degenerasi, atau menggunakan dua sistem koordinat yang tumpang tindih.

Banyak aplikasi 3D suka menggunakan sudut Euler untuk menentukan orientasi objek. Khusus untuk flight-sims, mereka mewakili cara yang berguna secara teoritis untuk menyimpan orientasi dengan cara yang mudah dimodifikasi.

Anda juga harus menyadari bahwa hal-hal seperti "mengganti koordinat, memutar keluar dari kemunduran, atau menggunakan dua sistem koordinat yang tumpang tindih" semuanya membutuhkan usaha. Upaya berarti kode. Dan kode berarti kinerja. Kehilangan kinerja saat Anda tidak perlu melakukannya bukanlah hal yang baik untuk banyak aplikasi 3D. Lagi pula, apa yang bisa diperoleh dari semua trik ini, jika hanya menggunakan angka empat akan memberi Anda semua yang Anda butuhkan.

Saya kurang yakin tentang masalah numerik, karena saya tidak tahu secara rinci bagaimana kedua hal ini (dan alternatif apa pun) akan diterapkan. Saya telah membaca bahwa menormalkan kembali angka empat lebih mudah daripada melakukan itu untuk matriks rotasi, tetapi ini hanya berlaku untuk matriks umum; rotasi memiliki kendala tambahan yang meremehkan ini (yang dibangun ke dalam definisi quaternions) (Faktanya, ini harus benar karena mereka memiliki jumlah derajat kebebasan yang sama).

Masalah numerik muncul saat berhadapan dengan beberapa rotasi orientasi yang berurutan. Bayangkan Anda memiliki benda di luar angkasa. Dan setiap kutu waktu, Anda menerapkan sedikit perubahan menguap padanya. Setelah setiap perubahan, Anda perlu menormalkan ulang orientasi; jika tidak, masalah presisi akan menyusup dan mengacaukan segalanya.

Jika Anda menggunakan matriks, setiap kali Anda melakukan perkalian matriks, Anda harus menormalkan ulang matriks tersebut. Matriks yang Anda orthonormalisasi belum menjadi matriks rotasi, jadi saya tidak akan terlalu yakin tentang ortonormalisasi yang mudah itu. Namun, saya yakin tentang ini:

Ini tidak akan secepat normalisasi vektor 4D. Itulah yang digunakan angka empat untuk dinormalisasi setelah rotasi berturut-turut.

Normalisasi kuartener murah. Bahkan khusus rotasi matriks normalisasi tidak akan seperti murah. Sekali lagi, kinerja itu penting.

Ada juga masalah lain yang tidak mudah dilakukan matriks: interpolasi antara dua orientasi berbeda.

Saat berhadapan dengan karakter 3D, Anda sering memiliki serangkaian transformasi yang menentukan lokasi setiap tulang pada karakter tersebut. Hierarki tulang ini mewakili karakter dalam pose tertentu.

Dalam kebanyakan sistem animasi, untuk menghitung pose karakter pada waktu tertentu, seseorang melakukan interpolasi di antara transformasi. Ini membutuhkan interpolasi transformasi yang sesuai.

Menginterpolasi dua matriks adalah ... tidak sepele. Setidaknya, jika Anda menginginkan sesuatu yang menyerupai matriks rotasi di bagian akhir. Bagaimanapun, tujuan interpolasi adalah untuk menghasilkan sesuatu yang menjadi bagian antara dua transformasi.

Untuk angka empat, yang Anda butuhkan hanyalah lerp 4D diikuti dengan normalisasi. Itu saja: ambil dua quaternion dan interpolasi komponen secara linier. Normalisasikan hasilnya.

Jika Anda menginginkan kualitas interpolasi yang lebih baik (dan terkadang memang demikian), Anda dapat menampilkan lerp bulat . Ini membuat interpolasi berperilaku lebih baik untuk orientasi yang lebih berbeda. Matematika ini jauh lebih sulit dan membutuhkan lebih banyak operasi untuk matriks daripada kuaternion.

Nicol Bolas
sumber
7

Opini: Quaternions bagus.

Matriks rotasi: Kerugian kecil : Perkalian matriks ~ 2 kali lebih lambat dari angka empat. Keuntungan Kecil : Perkalian matriks-vektor ~ 2 kali lebih cepat, dan besar. Kerugian besar : Normalisasi! Ghram-Shmit adalah asimetris, yang tidak memberikan jawaban akurat tingkat tinggi saat melakukan persamaan diferensial. Metode yang lebih canggih sangat kompleks dan mahal.

Sumbu (sudut = panjang sumbu) Keuntungan kecil : Kecil. Kerugian sedang : Perkalian dan penerapan ke vektor lambat dengan trigonometri. Kerugian sedang : Singularitas kutub utara pada panjang = 2 * pi, karena semua arah sumbu tidak melakukan apa-apa. Lebih banyak kode (dan debugging) untuk secara otomatis mengubah skala ketika mendekati 2pi.

Kevin Kostlan
sumber
5

Umumnya, kita hanya ingin pemetaan titik X = (x, y, z) ke titik baru X '= (x', y ', z') tunduk pada batasan bahwa X ^ 2 = X '^ 2. Dan ada banyak hal yang melakukan ini.

Kami benar-benar tidak hanya menginginkan itu. Ada kehalusan yang sangat penting yang terlewatkan oleh banyak orang . Konstruksi yang Anda bicarakan (gambar segitiga dan gunakan trigonometri, dll.) Akan memutar satu vektor ke vektor lainnya dengan benar. Tetapi ada banyak rotasi tak terhingga yang akan melakukan ini. Secara khusus, saya bisa ikut setelah Anda melakukan rotasi, dan kemudian memutar seluruh sistem di sekitar vektor X '. Itu tidak akan mengubah posisi X 'sama sekali. Kombinasi rotasi Anda dan saya setara dengan rotasi tunggal lainnya (karena rotasi membentuk grup ). Secara umum, Anda harus dapat merepresentasikan rotasi semacam itu.

Ternyata Anda bisa melakukan ini hanya dengan vektor. (Itu adalah representasi dari rotasi sumbu-sudut .) Tetapi menggabungkan rotasi dalam representasi sudut sumbu itu sulit. Kuarter membuatnya mudah, bersama dengan banyak hal lainnya. Pada dasarnya, angka empat memiliki semua kelebihan dari representasi lain, dan tidak ada kekurangannya. (Meskipun saya akan mengakui bahwa mungkin ada aplikasi khusus yang beberapa representasi lain mungkin lebih baik.)

Mike
sumber
4

Alasan yang biasa saya lihat adalah tidak ada kunci gimble, atau masalah numerik.

Dan itu adalah alasan yang bagus.

Seperti yang tampaknya sudah Anda pahami, angka empat menyandikan satu rotasi di sekitar sumbu arbitrer sebagai lawan dari tiga rotasi berurutan di ruang 3 Euler. Hal ini membuat angka empat kebal terhadap kunci gimbal .

Selain itu, beberapa bentuk interpolasi menjadi bagus dan mudah dilakukan, seperti SLERP .

... atau menggunakan dua sistem koordinat yang tumpang tindih.

Dari perspektif kinerja, mengapa solusi Anda lebih baik?

Saya bisa melanjutkan, tetapi angka empat hanyalah salah satu alat yang mungkin digunakan. Jika tidak sesuai dengan kebutuhan Anda, maka jangan gunakan.

Sage Gerard
sumber
Namun matriks rotasi melakukan hal yang sama, serta memiliki lebih banyak properti aljabar yang dapat digunakan dengan rapi. Di atas manipulasi matriks itu adalah salah satu hal yang sangat bagus di komputer.
paul23
3

Perlu diingat bahwa semua properti yang terkait dengan rotasi bukanlah benar-benar properti Quaternions: mereka adalah properti Parameterisation Euler-Rodrigues , yang merupakan struktur 4-elemen aktual yang digunakan untuk menggambarkan rotasi 3D.

Hubungan mereka dengan Kuarter adalah murni karena makalah oleh Cayley, "Pada hasil tertentu yang terkait dengan Kuarter", di mana penulis mengamati korelasi antara perkalian Kuarter dan kombinasi parameterisasi Euler-Rodrigues. Hal ini memungkinkan aspek teori Kuarter untuk diterapkan pada representasi rotasi dan terutama untuk interpolasi di antara mereka.

Anda dapat membaca makalahnya di sini: https://archive.org/details/collmathpapers01caylrich . Tetapi pada saat itu, tidak ada hubungan antara Quaternions dan rotasi dan Cayley agak terkejut menemukan ada:

Nyatanya, rumus-rumusnya persis seperti yang diberikan untuk transformasi seperti itu oleh M. Olinde Rodrigues Liouville, tv, "Des lois géométriques qui régissent les déplacements d'un système solide [...]" (atau Comb. Math. Journal, t. iii. hlm. 224 [6]). Ini akan menjadi pertanyaan yang menarik untuk dijelaskan, apriori, untuk kemunculan koefisien ini di sini.

Namun, tidak ada yang intrinsik tentang Quaternion yang memberi manfaat pada rotasi. Quaternion tidak menghindari kunci gimbal; Parameterisasi Euler-Rodrigues lakukan. Sangat sedikit program komputer yang melakukan rotasi yang cenderung benar-benar menerapkan tipe Quaternion yang merupakan nilai matematika kompleks kelas satu. Sayangnya, kesalahpahaman tentang peran Quaternions tampaknya telah bocor di suatu tempat yang mengakibatkan beberapa siswa bingung mempelajari detail matematika kompleks dengan beberapa konstanta imajiner dan kemudian menjadi bingung mengapa ini memecahkan masalah dengan rotasi.

Tandai Hijau
sumber
1

Jawaban yang mungkin terbaca seseorang: Ada masalah yang membosankan dengan semua representasi. Kuarter lebih kecil dari matriks tetapi perkalian kuartener bukanlah perkalian titik vektor belaka atau semacamnya, dan pada kenyataannya membutuhkan lebih banyak waktu pada komputer daripada hasil perkalian titik dari dua matriks 3x3. (Komputer sangat pandai beroperasi dengan matriks biasa)

Matriks memiliki fitur-fitur lain yang mengganggu. Misalnya, mereka bukanlah makhluk yang stabil dalam jangka panjang. Saat memodelkan rotasi dalam ruang 3D, seseorang biasanya mengakumulasi rotasi di atas satu sama lain ke dalam matriks Orientasi, yaitu matriks rotasi tunggal yang menyimpan orientasi bingkai referensi. Proses ini selama jutaan penambahan akan menyebabkan matriks-O menyimpang dari bentuk matriks rotasi yang ketat. Hal ini dapat dielakkan dengan mengkonfigurasi ulang matriks secara berkala, tetapi ada beberapa kondisi yang tidak sepele. Yaitu kasus tanpa rotasi matriks identitas.

Anda akan ingin mencari representasi sudut sumbu (atau representasi quaternion) dari rotasi, dan kemudian mereproduksi matriks untuk itu. Sebagian besar algoritme menghasilkan vektor nol, dan kemudian menemukan pembagian nol dalam kasus ini. Dalam kasus semacam ini, umumnya ide yang buruk juga untuk mencoba menghindari kasus seperti itu dengan "jika 0 maka ..." -jenis solusi, karena a) garpu lambat dan b) Anda masih dapat menggunakan mesin epsilon selain dari singularitas dan berakhir dengan kesalahan yang menghebohkan.

Elmore
sumber